ESP8266 Timer0和Timer1有兩個計時器,其WiFi功能使用一個計時器。我們只能使用一個計時器。為避免崩潰問題,我建議使用Ticker而不是Timer。Ticker執行與計時器相同的功能。我們以LED閃爍來做示範,電路圖如下。
ESP8266 Ticker範例
Ticker是用於在一定時間內重複調用函數的庫,attach函數有兩種變體:
attach和
attach_ms,第一個以秒為單位,第二個以毫秒為單位。
LED使用ESP8266 Ticker閃爍,每0.5秒閃一次
該程序演示了LED閃爍的範例。此函數啟動類似於附加中斷的定時器
blinker.attach(0.5,changeState); 停止計時器使用
blinker.detach();
要使用Ticker os_timer,我們需要
Ticker.h Timer Library
#include <ESP8266WiFi.h>
#include <Ticker.h>//Ticker Library
Ticker blinker;
#define R_LED 4 //On board LED
//======================================================
void changeState()
{
digitalWrite(R_LED, !(digitalRead(R_LED)));
//Invert Current State of LED
}
//======================================================
// Setup
//======================================================
void setup()
{
Serial.begin(115200);
Serial.println("");
pinMode(R_LED,OUTPUT);
//Initialize Ticker every 0.5s
blinker.attach(0.5, changeState);
}
//======================================================
// MAIN LOOP
//======================================================
void loop()
{
}
//======================================================
ESP8266 Timer範例
硬件Timer0由WiFi功能使用。我們只能使用
Timer1。使用Timer而不是Ticker可以實現精確r計時,並且您可以在微秒內獲得定時器中斷。
LED使用ESP8266 Ticker閃爍,每0.5秒閃一次,每10ms執行Timer中斷副程式
設定每10ms執行
ATTR onTimerISR(),副程式內
counter計算到50次,也就是0.5秒,執行LED閃爍,程式如下。
#include <ESP8266WiFi.h>
uint16_t counter = 0 ;
#define R_LED 4
//======================================================
void ICACHE_RAM_ATTR onTimerISR(){
counter++;
if(counter >= 50 )
{
counter = 0 ;
digitalWrite(R_LED,!(digitalRead(R_LED))); //Toggle LED Pin
}
timer1_write(50000);//10ms
}
//======================================================
// Setup
//======================================================
void setup()
{
Serial.begin(115200);
Serial.println("");
pinMode(R_LED,OUTPUT);
timer1_attachInterrupt(onTimerISR);
timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);
timer1_write(50000); //10ms
}
//=======================================================
// MAIN LOOP
//=======================================================
void loop()
{
}
//========================================================
示範結果
沒有留言:
張貼留言