如何用millis替换delay
时间: 2024-05-05 20:21:38 浏览: 94
使用 `millis()` 函数替换 `delay()` 函数可以避免阻塞代码执行,使程序能够同时执行其他任务。下面是一个使用 `millis()` 实现延时的示例:
```c++
unsigned long previousMillis = 0; // 记录上一次执行的时间
const long interval = 1000; // 定义延时时间为1000毫秒
void setup() {
// 初始化代码
}
void loop() {
unsigned long currentMillis = millis(); // 获取当前时间
if (currentMillis - previousMillis >= interval) { // 判断是否达到延时时间
// 执行延时操作
previousMillis = currentMillis; // 记录本次执行时间
}
// 其他任务的代码
}
```
在这个示例中,我们定义了一个 `previousMillis` 变量来记录上一次执行的时间,然后使用 `millis()` 函数获取当前时间并与上一次执行的时间进行比较,如果时间差大于等于设定的延时时间 `interval`,则执行延时操作,并将本次执行时间记录到 `previousMillis` 变量中。在延时期间,程序可以同时执行其他任务。
相关问题
#include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> #include "DHT.h" #include <ArduinoJson.h> #define DHTPIN A0 #define DHTTYPE DHT11 const int motorIn1 = 9; const int motorIn2 = 10; #define rank1 150 #define rank2 0 //iic驱动方式 U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); DHT dht(DHTPIN, DHTTYPE); StaticJsonDocument<200> sendJson; // 创建JSON对象,用来存放发送数据 StaticJsonDocument<200> readJson; // 创建JSON对象,用来存放接收到的数据 unsigned long lastUpdateTime = 0; //记录上次上传数据时间 const unsigned long updateInterval = 2000; // 在这里设置数据发送至云平台的时间间隔,单位为毫秒 long ID = 100416; // 定义设备ID号,替换成云平台生成的ID号 void setup() { u8g2.begin(); dht.begin(); pinMode(motorIn1, OUTPUT); pinMode(motorIn2, OUTPUT); Serial.begin(9600); } char h_str[3]; char t_str[3]; float h; float t; void loop() { // 该函数段可完成数据定时上报的功能,并且不会阻塞loop函数的运行 if (millis() - lastUpdateTime > updateInterval) { sendJsonData(); lastUpdateTime = millis(); } h = dht.readHumidity();//读湿度 t = dht.readTemperature();//读温度(摄氏度) strcpy(h_str, u8x8_u8toa(h, 2)); /* convert m to a string with two digits */ strcpy(t_str, u8x8_u8toa(t, 2)); /* convert m to a string with two digits */ if (t>26) { clockwise(rank1); } else { clockwise(rank2); } delay(1000); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_fur20_tf); u8g2.drawStr(0, 23, "T"); u8g2.drawStr(20, 23, ":"); u8g2.drawStr(40, 23, t_str); u8g2.drawStr(90, 23, "C"); u8g2.drawStr(0, 63, "H"); u8g2.drawStr(20, 63, ":"); u8g2.drawStr(40, 63, h_str); u8g2.drawStr(90, 63, "%"); } while ( u8g2.nextPage() ); delay(1000); } //上传数值 void sendJsonData() { // 将数据添加到JSON对象中,左边为在云平台中定义的标识符,右边为变量 sendJson["ID"] = ID; sendJson["temperature"] = t; //将对象转换成字符串,并向ese8266发送消息 serializeJson(sendJson, Serial); Serial.print("\n"); } void clockwise(int Speed) { analogWrite(motorIn1, 0); analogWrite(motorIn2, Speed); }
这是一个Arduino的代码,使用了DHT11传感器来读取温湿度数据,同时使用了U8g2库来驱动OLED屏幕显示数据。还使用了一个步进电机,根据温度值的大小来控制电机的转速。代码中还使用了ArduinoJson库来处理JSON数据格式,并将数据上传到云平台。其中的sendJsonData函数可以定时上传数据到云平台,可以根据需要修改上传时间间隔。
#include <WiFi.h> #include <WiFiClientSecure.h> #include <PubSubClient.h> #define MQTT_PORT (1886) const char *ssid = "17group"; //你的WiFi名称 const char *password = "hhj20011019"; //你的WiFi密码 const char *mqttServer = "39.106.6.44"; const int mqttPort = 1886; const char *mqttUser = "17group"; const char *mqttPassword = "hhj20011019"; //构造函数创建对象 WiFiClient espClient; PubSubClient client(espClient) ; //espClient在这里是一个WiFi客户端对象 void setup_wifi() { Serial.begin(9600); WiFi.begin(ssid, password); //连接网络 while (WiFi.status() != WL_CONNECTED) //等待网络连接成功 { delay(500); Serial.print("."); } Serial.println("WiFi connected!"); } //定义回调函数接收信息 //回调函数,topic是主题,payload就是收到的信息 void callback(char*topic, byte* payload, unsigned int length) { Serial.print("Messagearrived in topic: "); Serial.println(topic); Serial.print("Message:"); for (int i = 0; i< length; i++) { Serial.print((char)payload[i]); } Serial.println(); Serial.println("-----------------------"); } //调用connect()函数连接云端服务器 void reconnect(){ while(!client.connected()){ Serial.println("Connectingto MQTT..."); //请将cs202112345后面的数字替换成自己的学号,这里代表客户端id if (client.connect("cs225150340",mqttUser, mqttPassword )) { Serial.println("connected"); }else { Serial.print("failedwith state "); Serial.print(client.state()); delay(2000); } } } void setup(){ Serial.begin(9600); setup_wifi();//调用setup_wifi() //补齐信息 client.setServer(mqttServer,mqttPort);//参数是服务器IP地址和端口号 client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); char topic[100] = ""; char payload[100] = ""; //定义变量 Serial.print("Publish message: "); Serial.println(payload); //输出信息 client.publish (topic,payload); }有什么错误吗?如何改进
代码中存在一些错误:
1. MQTT端口号应该是1883而不是1886,所以应该将#define MQTT_PORT (1886)改为#define MQTT_PORT (1883)。
2. 在loop()函数中,topic和payload变量没有被赋值,所以需要在这里对它们进行赋值。
3. 在reconnect()函数中,客户端ID应该是唯一的,每次连接时应该使用不同的ID,而不是固定的cs225150340。可以使用millis()函数生成一个随机的ID。
改进:
以下是改进后的代码:
```
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#define MQTT_PORT (1883)
const char *ssid = "17group"; //你的WiFi名称
const char *password = "hhj20011019"; //你的WiFi密码
const char *mqttServer = "39.106.6.44";
const int mqttPort = 1883;
const char *mqttUser = "17group";
const char *mqttPassword = "hhj20011019";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
Serial.println("-----------------------");
}
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
String clientId = "esp32-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str(), mqttUser, mqttPassword)) {
Serial.println("Connected");
} else {
Serial.print("Failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(9600);
setup_wifi();
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
char topic[100] = "test";
char payload[100] = "hello world";
Serial.print("Publish message: ");
Serial.println(payload);
client.publish(topic, payload);
delay(1000);
}
```
阅读全文