#include WiFih#include DHTh#include PubSubClienth#include Tickerh#define DHTPIN 7 #define DHTTYPE DHT11 DHT 11DHT dhtDHTPIN DHTTYPE;int god=0;const int led =18; 灯的接口const char ssid = 3671;
需要在代码中添加舵机控制的部分,具体实现方式取决于舵机的控制方式,以下是一种示例代码:
#include <WiFi.h>
#include "DHT.h"
#include "PubSubClient.h"
#include "Ticker.h"
#include <Servo.h> //添加舵机库
#define DHTPIN 7
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
int god=0;
const int led =18; //灯的接口
const int servoPin = 19; //舵机的接口
Servo myservo; //创建舵机对象
const char *ssid = "3671"; //wifi名称
const char *password = "05210835";//wifi密码
const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int port = 6002; //端口号
#define mqtt_devid "884337606" //设备ID
#define mqtt_pubid "487632" //产品ID
//鉴权信息
#define mqtt_password "20222222" //鉴权信息
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相对应
Ticker tim1; //定时器,用来循环上传数据
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);
pinMode(led,OUTPUT);//输出
myservo.attach(servoPin); //舵机绑定到指定接口
setupWifi(); //调用函数连接WIFI
Serial.print(F("DHT11 test!"));
dht.begin();
client.setServer(mqtt_server, port); //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
if (client.connected()){
Serial.print("OneNet is connected!");//判断以下是不是连好了.
}
//client.setCallback(callback); //设置好客户端收到信息是的回调
client.setCallback(callback); //订阅命令下发主题
tim1.attach(5, sendTempAndHumi); //定时每5秒调用一次发送数据函数
}
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(); //客户端循环检测
}
void sendTempAndHumi() { if (client.connected()){ //dht.readHumidity() snprintf(msgJson,75,dataTemplate,dht.readTemperature(),dht.readHumidity(),god); 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));//发送数据到主题 delay(500); } }
//收到主题下发的回调, 注意这个回调要实现三个形参 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') { digitalWrite(led, LOW); god=0; myservo.write(0); //舵机转到0度 } if ((char)payload[0] == '1') { digitalWrite(led, HIGH); god=1; myservo.write(90); //舵机转到90度 } else{ } }
void clientReconnect() { while (!client.connected()) //再重连客户端 { Serial.print("reconnect MQTT..."); if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)){ Serial.print("connected"); } else{ Serial.print("failed"); Serial.print(client.state()); Serial.print("try again in 5 sec"); delay(5000); } }
原文地址: https://www.cveoy.top/t/topic/hkDP 著作权归作者所有。请勿转载和采集!