NodeMCU學習筆記


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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM