Arduino 中断

Arduino interrupts

我正在从事一个使用 ESP32 作为微控制器的智能温室项目。

数据来自DHT22温湿度传感器和土壤湿度传感器。这两个倾向于使用 delay() 功能来阅读,因为他们需要一些时间来热身。

示例:

    void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);
}

我计划将此数据发布到 Web 界面上,该界面也可以使用手动控件。 由于我使用延迟,如果我按下网站上的按钮,首先执行延迟,然后按下按钮,所以它不是即时的。我该怎么做才能解决这个问题?

不要使用 delay()。我不清楚你到底想在这里做什么或者你想如何处理按钮,但一般来说你最好做这样的事情:

#define SENSOR_UPDATE_WARMUP 2000
#define SENSOR_UPDATE_INTERVAL 1000

void loop() {
  static unsigned long next_sensor_update = SENSOR_UPDATE_WARMUP;

  if(millis() > next_sensor_update) {
    // Reading temperature or humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    float h = dht.readHumidity();
    // Read temperature as Celsius (the default)
    float t = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    float f = dht.readTemperature(true);

    next_sensor_update = millis() + SENSOR_UPDATE_INTERVAL;
    }
}

这允许您在 loop() 中进行其他处理,同时仍然有预热时间并且仅定期更新传感器读数(将 SENSOR_UPDATE_INTERVAL 调整为更新之间的毫秒数)。

如果您需要为其他设备设置其他延迟,只需重复使用静态变量跟踪这些设备时序的模式即可。

更简单,您可以将两秒延迟放在 setup() 的末尾而不是 loop() 内,但我怀疑您不会想要不断更新传感器值,因此您需要按照与上述代码类似的方式构建程序。