NodeMCU學習筆記
引腳連通
引腳 | 連通 |
---|---|
D3 | FLASH按鍵 |
D0 | 模組上的LED |
D4 | 芯片的LED |
FLASH按鍵
D3引腳已經與開發板上的FLASH按鍵開關連接
我們可以通過NodeMCU開發板上的FLASH按鍵控制D3引腳的電平。當我們沒有按下該按鍵時,D3引腳將會保持高電平狀態。當按下該按鍵后,D3引腳會變為低電平。
板載LED
D0就是模組上的LED
D4連通芯片的LED
示例程序
按下FLASH按鍵,D3置低,模組LED(D0)閃爍
松開FLASH按鍵,D3置高,芯片LED(D4)閃爍
/**********************************************************************
程序名稱/Program name : led_test
作者/Author : Dapenson
日期/Date(YYYYMMDD) : 20200422
程序目的/Purpose :
用於演示2個板載LED與FLASH按鍵的效果
按下FLASH按鍵,模組LED亮,沒有按下則芯片LED亮
(請注意下方"其它說明"中重要信息!)
-----------------------------------------------------------------------
修訂歷史/Revision History
日期/Date 作者/Author 參考號/Ref 修訂說明/Revision Description
-----------------------------------------------------------------------
其它說明:
D3----FLASH按鍵
D4----ESP8266芯片LED
D0----NodeMCU模組LED
***********************************************************************/
void setup() {
//初始化引腳及串口
pinMode(D3, INPUT);
pinMode(D0, OUTPUT);
pinMode(D4, OUTPUT);
Serial.begin(115200);
//由於NodeMCU引腳置低時燈亮(與UNO相反),因此我們開始時關閉兩個燈
digitalWrite(D4, LOW);
digitalWrite(D0, LOW);
}
void loop() {
if ( digitalRead(D3) == HIGH)
{
mblink(D4);
Serial.println("D4 blink");
}
else
{
mblink(D0);
Serial.println("D0 blink");
}
}
void mblink(int pin) {
int i;
for (i = 0; i <= 3; i++) {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
}
中斷函數
在NodeMCU的D0-D8引腳上可用,經過測試D2~D8都沒問題
關於中斷函數的說明,詳情可查看太極創客 - 中斷函數
//設置中斷
attachInterrupt(digitalPinToInterrupt(D3), IntCallback, CHANGE);
//取消中斷
detachInterrupt(D3);
//停止中斷
noInterrupts();
//啟用中斷
interrupts();
注意
- 2.5.2以后版本需要增加
ICACHE_RAM_ATTR
標識 ,否則將發生ISR崩潰,(我在這里排查了很久) - 在中斷服務程序中,不能使用delay()函數和millis()函數。因為他們無法在中斷服務程序中正常工作。delayMicroseconds()可以在中斷服務程序中正常工作。
- 中斷服務程序應盡量保持簡單短小。否則可能會影響Arduino工作。
- 中斷服務程序中涉及的變量應聲明為volatile類型。
- 中斷服務程序不能返回任何數值。所以應盡量在中斷服務程序中使用全局變量。
示例程序
/**********************************************************************
程序名稱/Program name : attachInterrupt_test_01
作者/Author : Dapenson
日期/Date(YYYYMMDD) : 20200422
程序目的/Purpose :
用於演示NodeMCU的中斷效果
按下或松開FLASH按鍵觸發中斷,數字增大,主函數將一直將數字打印到串口
(請注意下方"其它說明"中重要信息!)
-----------------------------------------------------------------------
修訂歷史/Revision History
日期/Date 作者/Author 參考號/Ref 修訂說明/Revision Description
-----------------------------------------------------------------------
其它說明:
***********************************************************************/
volatile int i = 0 ;
void ICACHE_RAM_ATTR IntCallback();
void setup() {
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(D3), IntCallback, CHANGE);
}
void loop() {
Serial.println(i);
delay(100);
}
void IntCallback() {
i++;
}
/**********************************************************************
程序名稱/Program name : attachInterrupt_test_02
作者/Author : Dapenson
日期/Date(YYYYMMDD) : 20200422
程序目的/Purpose :
用於演示NodeMCU的中斷效果
按下或松開FLASH按鍵觸發中斷,將信息打印到串口
(請注意下方"其它說明"中重要信息!)
-----------------------------------------------------------------------
修訂歷史/Revision History
日期/Date 作者/Author 參考號/Ref 修訂說明/Revision Description
-----------------------------------------------------------------------
其它說明:
***********************************************************************/
void setup() {
Serial.begin(115200);
//將中斷觸發引腳設置為INPUT_PULLUP(輸入上拉)模式
pinMode(D3, INPUT_PULLUP);
attachInterrupt(D3, FunctionName, CHANGE);
}
void loop() {
}
ICACHE_RAM_ATTR void FunctionName()
{
//停止中斷
//detachInterrupt(D3);
noInterrupts();
if (digitalRead(D3) == 0) {
Serial.print(digitalRead(D3)); Serial.println("{\"human\":true}");
}
else if (digitalRead(D3) == 1) {
Serial.print(digitalRead(D3)); Serial.println("{\"human\":false}");
}
delayMicroseconds(500000);
//啟用中斷
interrupts();
//attachInterrupt(D3, FunctionName, CHANGE);
}