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类型。
  • 中断服务程序不能返回任何数值。所以应尽量在中断服务程序中使用全局变量。
示例程序
#include <Arduino.h>

volatile int i = 0;
void ICACHE_RAM_ATTR IntCallback();
int lastNum = 0;

void IntCallback()
{
  i++;
}

void setup()
{
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(D3), IntCallback, CHANGE);
}

void loop()
{
  if (i != lastNum)
  {
    Serial.println(i);
    lastNum = i;
  }
  delay(100);
}

/**********************************************************************
  程序名称/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);
}
posted @ 2020-05-03 17:07  Dapenson  阅读(1113)  评论(0编辑  收藏  举报