#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); } }

Arduino DHT11 传感器数据上传到 OneNet 平台 (无 Ticker)

原文地址: https://www.cveoy.top/t/topic/oLVv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录