计时器内延迟正确的方法是什么

问题描述

我对与计时器有关的概念感到不满。如何在计时器内操作“延迟”?这是我最好地了解问题的最好方式,这是胡说八道。目的是:我希望测试pinState条件2次(最初一次,然后4秒后),但这一切需要定期进行(因此需要一个计时器)。

该平台是运行WiFi(ESP8266芯片)并在Arduino IDE内完成编码的NodeMCU。


#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

BlynkTimer timer;
char auth[] = "x"; //Auth code sent via Email
char ssid[] = "x"; //Wifi name
char pass[] = "x";  //Wifi Password
int flag=0;

void notifyOnFire()
{
  int pinState = digitalRead(D1);
  if (pinState==0 && flag==0) {
    delay(4000);
    int pinStateAgain = digitalRead(D1);
    if (pinStateAgain==0) {
        Serial.println("Alarm has gone off");
        Blynk.notify("House Alarm!!!");
        flag=1;
      }
  }
  else if (pinState==1)
  {
    flag=0;
  }
}

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth,ssid,pass);
  pinMode(D1,INPUT_PULLUP);
  timer.setInterval(1000L,notifyOnFire); 
}

void loop()
{
  //Serial.println(WiFi.localIP());
  Blynk.run();
  timer.run();
}

解决方法

一个简单的解决方法是将计时器的周期设置为4000L timer.setInterval(4000L,notifyOnFire);,并在notifyOnFire中使用静态变量并在每次调用notifyOnFire时切换其值

void notifyOnFire()
{
  static char state = 0;
  if( state == 0)
  {
    /* Write here the code you need to be executed before the 4 sec delay */
    state = 1;
  }
  else
  {
    /* Write here the code you need to be executed after the 4 sec delay */
    state = 0;
  }
}

关于静态变量的好处是,它们仅在编译时初始化一次,并且在代码范围更改后保留它们的值(在这种情况下,函数notifyOnFire退出)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...