我正在使用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);
}
我正计划在网络界面上发布此数据,该界面也将提供手动控件。现在,由于我使用的是延迟,因此如果我按网站上的按钮,则首先执行延迟,然后按按钮,所以它不是即时的。我该如何解决?
请勿使用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()
的内部,但是我怀疑您不想持续更新传感器值,因此您需要类似于上面的代码来构造程序。