Arduino中断

问题描述 投票:0回答:1

我正在使用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);
}

我正计划在网络界面上发布此数据,该界面也将提供手动控件。现在,由于我使用的是延迟,因此如果我按网站上的按钮,则首先执行延迟,然后按按钮,所以它不是即时的。我该如何解决?

arduino delay esp32
1个回答
0
投票

请勿使用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()的内部,但是我怀疑您不想持续更新传感器值,因此您需要类似于上面的代码来构造程序。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.