2018年7月13日 星期五

NodeMCU (ESP8266) Timer and Ticker 範例-Arduino

ESP8266 Timer0和Timer1有兩個計時器,其WiFi功能使用一個計時器。我們只能使用一個計時器。為避免崩潰問題,我建議使用Ticker而不是Timer。Ticker執行與計時器相同的功能。我們以LED閃爍來做示範,電路圖如下。 nodemcu_LED

ESP8266 Ticker範例

Ticker是用於在一定時間內重複調用函數的庫,attach函數有兩種變體:attachattach_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()
{

}
//========================================================
示範結果

沒有留言:

張貼留言