NodeMCU学习笔记

Posted by Dapenson on April 22, 2020

NodeMCU学习笔记

NodeMCU开发板

开发板

太极创客开发板详解

引脚连通

Pin 连通 GPIO
D3 FLASH按键 18
D0 模组上的LED 16
D4 芯片的LED 2
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);
}