• 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);
    }
    
  • 相关阅读:
    [转][黄忠成]Object Builder Application Block
    C#中的接口
    委托、事件与Observer设计模式
    [转][黄忠成]Object Builder Application Block (1)
    C# 中的委托和事件
    Android布局充分演示Demo
    android代码重启 .
    【转】小游戏>弹球
    多个Icon的APk——实现多程序入口总结
    为你的Android应用定制属于你的BaseActivity
  • 原文地址:https://www.cnblogs.com/dapenson/p/12822545.html
Copyright © 2020-2023  润新知