Arduino DHT11 传感器数据上传到 OneNet 平台 (无 Ticker)
#include <WiFi.h>
#include "DHT.h"
#include "PubSubClient.h"
#include<Servo.h>
#define DHTPIN 4
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE); int light=0; Servo servo; const int servoPin =7; //舵机的接口 const char *ssid = "HONOR Play4T"; //wifi名称 const char *password = "12345678";//wifi密码 const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址 const int port = 6002; //端口号 #define mqtt_devid "1099655073" //设备ID #define mqtt_pubid "610141" //产品ID //鉴权信息 #define mqtt_password "1099655073" //鉴权信息 WiFiClient espClient; //创建一个WIFI连接客户端 PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端 char msg_buf[200]; //发送信息缓冲区 char msgJson[75]; //要发送的json格式的数据 unsigned short json_len = 0; //json长度
//信息模板 char dataTemplate[] = "{"temp":%.2f,"humi":%.2f,"led":%d}"; // temp humi要与onenet相对应
unsigned long previousMillis = 0; //上一次上传数据的时间 const long interval = 5000; //上传数据间隔
void setupWifi() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("正在连接中----\n"); } Serial.print("WIFI已连接\n"); Serial.print(WiFi.localIP()); }
void setup()
{
Serial.begin(115200);
servo.attach(servoPin);
servo.write(0);
setupWifi(); //调用函数连接WIFI
Serial.print(F("DHT11 test!"));
dht.begin();
client.setServer(mqtt_server, port); //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)) //客户端连接到指定的产品的指定设备.同时输入鉴权信息 { Serial.print("OneNet is connected!");//判断以下是不是连好了 client.setCallback(callback); //设置好客户端收到信息是的回调 client.subscribe("$creq/+/+"); }
}
void loop() { delay(5000); float h = dht.readHumidity(); float t = dht.readTemperature(); float f = dht.readTemperature(true); if (isnan(h) || isnan(t) || isnan(f)) { Serial.println(F("Failed to read from DHT sensor!\n")); return; }//可以让我们通过串口查看数据
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("℃ \n "));
if (!WiFi.isConnected()) //先看WIFI是否还在连接 { setupWifi(); }
if (!client.connected()) //如果客户端没连接ONENET, 重新连接 { clientReconnect(); delay(100); }
client.loop(); //客户端循环检测
unsigned long currentMillis = millis(); //获取当前时间
if (currentMillis - previousMillis >= interval) //如果当前时间与上一次上传数据的时间间隔大于设定的间隔 { previousMillis = currentMillis; //更新上一次上传数据的时间
if (client.connected())
{
//dht.readHumidity()
snprintf(msgJson,75,dataTemplate,dht.readTemperature(),dht.readHumidity(),light);
json_len = strlen(msgJson); //msgJson的长度
msg_buf[0] = char(0x03); //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
msg_buf[1] = char(json_len >> 8); //数据第二位是要发送的数据长度的高八位
msg_buf[2] = char(json_len & 0xff); //数据第三位是要发送数据的长度的低八位
memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
msg_buf[3 + strlen(msgJson)] = 0; //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
Serial.print("public the data:");
Serial.print(msgJson);
client.publish("$dp", (uint8_t *)msg_buf, 3+strlen(msgJson));//发送数据到主题
}
} }
//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度 void callback(char *topic, byte *payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println();
if ((char)payload[0] == '0')
{
servo.write(0);
light=0;
}
if((char)payload[0] == '1')
{
servo.write(180);
light=1;
}
}
void clientReconnect() { while (!client.connected()) //再重连客户端 { Serial.print("reconnect MQTT..."); if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)) { Serial.print("connected"); client.setCallback(callback); //重新连接后需要重新设置回调函数和订阅主题 client.subscribe("$creq/+/+"); } else { Serial.print("failed"); Serial.print(client.state()); Serial.print("try again in 5 sec"); delay(5000); } }
原文地址: https://www.cveoy.top/t/topic/oLVv 著作权归作者所有。请勿转载和采集!