gpt4 book ai didi

c++ - Arduino延迟不精确

转载 作者:行者123 更新时间:2023-11-28 01:17:21 33 4
gpt4 key购买 nike

我是 Arduino 的新手,我正在使用 DHT22 和可使用 Arduino 编程的 SparkFun ESP8266 Thing Dev 模块构建一个简单的传感器电路。

在我的循环代码中,我希望我的设备等待 5 分钟,所以我将 delay(300000) 放在最后。问题是,当我查看我的数据库时,传感器收集数据的时间戳有时会等待 2 分钟,有时会等待 1 分钟,等等。

此外,我有一个逻辑检查(如果有的话)应该阻止我的设备在温度或湿度差异小于 1 时传输数据。但我的设备似乎并不关心它。

我确定我的代码应该有问题,但这是我第一次尝试使用 C++ 和 Arduino,所以我还不能弄清楚是什么问题。有帮助吗?

这是我的代码:


#include <DHT.h>

#include <ESP8266WiFi.h>

#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager WiFi Configuration Magic

#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN,DHTTYPE);

// here I declare the variable of humidity and temperature.
// every time it loops, it should get data from the sensor into
// temp1 and hum1, then check it against temp and hum if there
// are any changes in the values
float temp;
float hum;
float temp1;
float hum1;

int red_light_pin = 16;
int green_light_pin = 12;
int blue_light_pin = 13;

// Server, file, and port
const char hostname[] = "laundryireland.tk";
const String uri = "/write_data?";
const String arguments[3] = {"serial=","&temp=","&hum="};
const int port = 80;

String serialNumber;

WiFiClient client;


void RGB_color(int red_light_value, int green_light_value, int blue_light_value)
{
analogWrite(red_light_pin, red_light_value);
analogWrite(green_light_pin, green_light_value);
analogWrite(blue_light_pin, blue_light_value);
}

void setup() {

pinMode(red_light_pin,OUTPUT);
pinMode(green_light_pin,OUTPUT);
pinMode(blue_light_pin,OUTPUT);
RGB_color(0,0,255);

WiFi.persistent(false);
WiFiManager wifiManager;

//Initialize Serial
Serial.begin(9600);
dht.begin();
delay(100);

//Connect to WiFi
Serial.println("Connecting...");
wifiManager.autoConnect();
while (WiFi.status() != WL_CONNECTED ) {

delay(500);
Serial.print(".");
}


//Show that we are connected
Serial.println("Connected!");
Serial.println(WiFi.localIP());

serialNumber = WiFi.macAddress();

}

void loop() {
delay(2000);
temp1 = dht.readTemperature();
hum1 = dht.readHumidity();
while (temp1 == NULL || hum1 == NULL){
RGB_color(255,0,0);
delay(5000);
temp1 = dht.readTemperature();
hum1 = dht.readHumidity();
}

// THIS IS MY IF STATEMENT TO CHECK FOR
// CHANGES IN TEMP OR HUM

if (temp > temp1+1 || temp < temp1-1 || hum > hum1+1 || hum < hum1-1){
temp = temp1;
hum = hum1;

RGB_color(0,255,0);
Serial.print("Temperature: ");
Serial.println(temp);
Serial.print("Humidity: ");
Serial.println(hum);

Serial.println("Testing flask ");
if ( client.connect(hostname,port) == 0 ) {
Serial.println("Flask Test Failed!");
} else {
Serial.println("Flask Test Success!");
client.print("GET " + uri + arguments[0] + serialNumber +
arguments[1] + temp +
arguments[2] + hum +
" HTTP/1.1\r\n" +
"Host: " + hostname + "\r\n" +
"Connection: close\r\n" +
"\r\n");
delay(500);

while (client.available()){
String ln = client.readStringUntil('\r');
Serial.print(ln);
}
}

client.stop();
Serial.println();
Serial.println("Connection closed");

} else {
Serial.println("temp or hum not changed");
RGB_color(255,255,0);
}

// THIS SHOULD WAIT 5min BEFORE NEXT CHECK

delay(300000);
}

这是我的数据库的样子:

database


解决方案

已被评论者指出并在接受的答案中得到很好的描述,使用 mills() 而不是 delay() 解决了“假”延迟时间的问题。

此外,即使上次更新与当前更新之间的差异小于 1,也存在数据传输问题;只是我的 if-else 语句的逻辑问题。我用这段代码解决了:

 int deltaT = abs(temp-temp1);
int deltaH = abs(hum-hum1);

if (deltaT >= 1 || deltaH >= 1){
// code here

最佳答案

循环函数将在循环结束后 300000 毫秒再次调用。所以到下一次录音的时间就是所有的处理时间* 2000开头* 函数 dht.readTemperature() 和 dht.readHumidity() 的时间;* 将字节发送到串行输出的时间* client.connect 的时间和网络传输时间...* 和最后的 300000

更好的方法是从系统获取当前 millis() 以检查自上次读取以来的 300000 毫秒。然后计算下一次测量的时间再做你的处理

您可以为此使用一个静态变量来将代码保持在一起:

void loop() {
static unsigned long next = 0;
unsigned long now = millis();

if (now > next) {
… do processing
next = now + 300000;
} // if
} // loop()

关于c++ - Arduino延迟不精确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58237759/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com