本篇文章主要介绍使用esp8266通过代码将温湿度传感器所测数据发送到阿里云服务器,以及介绍一下本人所踩过的坑。
1.创建阿里云设备
首先登录到阿里云官网,在首页搜索“物联网平台”,如下图
进入管理控制台后选择环境
然后进去按照下图顺序创建产品
创建成功后直接点添加设备就行
然后返回产品界面,点击功能定义,然后是前往编辑草稿
然后点击添加标准功能,选择其他类型,选择功能的时候记录下功能下面的标识符,上传数据的时候会用到
如果标准功能没有的话,也可以选择自定义功能
然后点击发布上线,就可以在设备->物模型数据中看到刚才添加的功能了
最后在产品中点击动态注册,然后发布就可以了
2.esp8266代码部分
相关参数的定义在代码下面解释
/*本段代码是esp接收arduino发送过来的温湿度数据然后展示到阿里云平台的,其中arduino先对数据进行封装,转为Json数据,然后esp再将数据提取出来进行整理,然后发送到云平台*/
#include <ESP8266WiFi.h>
#include <LiquidCrystal.h>
#include<SoftwareSerial.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
char ssid[]="你的wifi名";//WiFi名称
char pswd[]="你的wifi密码";//wifi密码*/
#define WIFI_SSID "123456" //要改的地方你的WiFi名(热点)
#define WIFI_PASSWD "1234567890"//要改的地方你的WiFi密码
bool setup_camera = false;
#define PRODUCT_KEY "你的PRODUCT_KEY" //要改的地方
#define DEVICE_NAME "你的DEVICE_NAME" //要改的地方
#define DEVICE_SECRET "你的DEVICE_SECRET"//要改的地方
#define REGION_ID "cn-shanghai"//一般情况下不用改
/* 线上环境域名和端口号,不需要改 */
#define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT 1883
#define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY
/* */
#define CLIENT_ID "可以通过工具生成,下面介绍" //要改的地方
#define MQTT_PASSWD "可以通过工具生成,下面介绍" //要改的地方
#define ALINK_BODY_FORMAT "{\"id\":\"dht11\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
unsigned long lastMs = 0;
float h,t,RH_sum,T_sum;
unsigned char count=0;
WiFiClient espClient;
PubSubClient client(espClient);
SoftwareSerial espSerial(3,1); // RX, TX
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
payload[length] = '\0';
Serial.println((char *)payload);
}
void wifiInit()
{
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWD); //连接WiFi
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
espSerial.println("WiFi not Connect");
}
espSerial.println("Connected to AP");
espSerial.println("IP address: ");
espSerial.println(WiFi.localIP());
espSerial.print("espClient [");
client.setServer(MQTT_SERVER, MQTT_PORT); /* 连接WiFi之后,连接MQTT服务器 */
client.setCallback(callback);
}
void mqttCheckConnect()
{
while (!client.connected())
{
espSerial.println("Connecting to MQTT Server ...");
if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))
{
espSerial.println("MQTT Connected!");
}
else
{
espSerial.print("MQTT Connect err:");
espSerial.println(client.state());
delay(5000);
}
}
}
void mqttIntervalPost()
{
char param[32];
char jsonBuf[128];
sprintf(param, "{\"CurrentTemperature\":%f}",T_sum/count);
sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
espSerial.println(jsonBuf);
boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
if(d){
espSerial.println("publish Temperature success");
}else{
espSerial.println("publish Temperature fail");
}
sprintf(param, "{\"CurrentHumidity\":%f}",RH_sum/count);
sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
espSerial.println(jsonBuf);
d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
if(d){
espSerial.println("publish Humidity success");
}else{
espSerial.println("publish Humidity fail");
}
}
void setup()
{
Serial.begin(115200);
espSerial.begin(9600);
/*BLINKER_DEBUG.stream(Serial);*/
wifiInit();
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
}
void loop()
{
if (!client.connected()) {
mqttCheckConnect();
}
client.loop();
if (espSerial.available()) {
String receivedData = espSerial.readStringUntil('\n'); // 读取串口数据直到换行符
espSerial.println("Received data: " + receivedData);
// 解析JSON数据
DynamicJsonDocument doc(256); // 适当调整JSON文档大小
DeserializationError error = deserializeJson(doc, receivedData);
if (!error) {
float temperature = doc["temperature"];
float humidity = doc["humidity"];
// 累加温度和湿度数据,以便后续计算平均值
T_sum += temperature;
RH_sum += humidity;
count++;
// 现在你可以使用temperature和humidity变量进行处理
espSerial.println("Temperature: " + String(temperature, 2) + "°C");
espSerial.println("Humidity: " + String(humidity, 2) + "%");
// 在这里添加你的数据发送逻辑,比如按照一定条件发送到阿里云
if (count >= 10) { // 你可以根据需要自定义发送频率
mqttIntervalPost();
count = 0;
T_sum = 0;
RH_sum = 0;
}
} else {
espSerial.println("JSON parsing error.");
}
}
}
代码中的PRODUCT_KEY,DEVICE_NAME,DEVICE_SECRET在设备页面查看
生成CLIENT_ID MQTT_PASSWD的工具:
链接:https://pan.baidu.com/s/1OI2a596gKDqIETmoX38zCw?pwd=ddrx
提取码:ddrx
界面如下
接着复制到代码中即可。
3.连接过程中出现的问题
1.连接的wifi需要时2.4G频段的
2.arduino向esp发送数据是需要连接esp的rx和tx串口,然后使用
#include<SoftwareSerial.h>
这个库中的
SoftwareSerial mySerial(2, 3); // RX, TX
这个方法定义一个通信串口,然后arduino使用这个串口进行传输信息
esp中也需要使用上述头文件和上述串口,
SoftwareSerial espSerial(3,1); // RX, TX
但是这个串口初始化后还使用原来的串口打印数据时可能会造成wifi连接的一些问题,所以在上面的代码中我全部都用espSerial来打印数据了,具体原因有大牛知道的话可以在评论区指出。
3.使用上述代码连接mqtt时,可能会报
mqtt connect err:2
遇到这个问题呢,我们需要操作一下库函数
打开arduinoIDE,然后点击左上角 文件->首选项 可以看到你的项目文件夹地址
然后找到这个位置,进入libraries文件夹,然后进入PubSubClient文件夹,接着进入src,找到PubSubClient.h头文件,打开找到MQTT_MAX_PACKET_SIZE,将256修改为1024,再找到MQTT_KEEPALIVE,将15修改为40后编译烧录后即可。
以上就是本人通过代码将数据发送到阿里云的全过程,如果有疑问或者错误请大家在评论区提出。