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()
内,但我怀疑您不会想要不断更新传感器值,因此您需要按照与上述代码类似的方式构建程序。
我正在从事一个使用 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()
内,但我怀疑您不会想要不断更新传感器值,因此您需要按照与上述代码类似的方式构建程序。