Arduino+ESP826601s模块连接阿里云并实现温湿度数据上报
- 一、前言
- 二、准备工作
- 三、程序代码
- 1. Arduino的程序
- 2. ESP826601的程序
- 3. 上面程序需要注意的地方
- 四、运行结果
- 五、结束语
一、前言
看完我这三篇文章,相信各位朋友对于阿里云物联网平台的使用都有了一定的认识了:
- MQTT客户端软件(MQTT.fx)测试连接阿里云物联网平台的基本使用
- 使用MQTT.fx向阿里云物理网平台上报物模型数据
- ESP826601(ESP826601s)WiFi模块使用AT指令连接阿里云物联网平台
而本篇文章主结合以上的知识点,制作一个相对比较完整的项目(在咱们大学生的毕业设计项目可用于参考),同时这里我给出我本篇博客的所写的代码资源,大家可以去我的gitee(码云)仓库直接下载(点击前往)。
二、准备工作
硬件:
- Arduino Uno R3开发板一个
- ESP826601WiFi模块一个(或ESP826601S)
- ESP826601固件下载器一个(其他烧录器也可以如TTL)
- DHT11温湿度传感器一个
- 杜邦线若干+面包板
软件
- Arduino IDE(没安装可以点击进入我的另一篇博客有详细教程)
- ESP8266开发环境(我的另一篇博客有安装教程)
- 库文件(ESP8266WiFi、PubSubClient、ArduinoJson),自行在Arduino IDE中进行下载即可
电路图:
三、程序代码
1. Arduino的程序
#include <SoftwareSerial.h>
#include <DHT.h>
// 初始化DHT11
#define DHTPIN 2 // DHT11数据引脚连接到Arduino的D2
DHT dht(DHTPIN, DHT11);
// 初始化软串口
#define ESP8266_RX_PIN 3 // Arduino的D10连接到ESP8266的TX
#define ESP8266_TX_PIN 4 // Arduino的D11连接到ESP8266的RX
SoftwareSerial esp8266Serial(ESP8266_RX_PIN, ESP8266_TX_PIN);
void setup() {
Serial.begin(115200); // 初始化硬件串口(用于调试)
esp8266Serial.begin(115200); // 初始化软串口(用于与ESP8266通信)
pinMode(DHTPIN, INPUT); // 设定DHT11引脚为输入模式
dht.begin(); // 初始化DHT传感器
}
void loop() {
// 读取温湿度
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// 检查温湿度传感器是否正常工作
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
delay(1000);
return;
}
// 将数据格式化为字符串:Temperature,AirHumidity
String data = String(temperature) + "," + String(humidity);
// Serial.println("Sent data to ESP8266: " + data); // 调试输出
esp8266Serial.println(data); // 通过软串口发送数据到ESP826601模块
// 监听ESP8266返回的状态信息
if (esp8266Serial.available() > 0) {
String response = esp8266Serial.readStringUntil('\n');
Serial.println(response);
}
// 延迟一段时间(例如每5秒上报一次数据)
delay(5000);
}
2. ESP826601的程序
#include <ESP8266WiFi.h> // 引入ESP8266 WiFi库
#include <PubSubClient.h> // 引入MQTT客户端库
#include <ArduinoJson.h> // 引入JSON库
/* 温湿度数据引脚 */
#define sensor_Pin 7
/* WIFI名称和密码 */
#define WifiName "wifiName"
#define WifiPasswd "wifiPasswd"
/* 设备三元组信息 */
#define ProductKey "ProductKey" // 产品Key
#define DeviceName "DeviceName" // 设备名称
#define DeviceSecret "DeviceSecret" // 设备密钥
/* MQTT连接参数
服务器地址和端口号都一致,不需要改 */
#define mqttHostUrl "iot-06z00g5jo0z7no5.mqtt.iothub.aliyuncs.com" // MQTT服务器地址
#define port 1883 // MQTT端口号
#define username DeviceName "&" ProductKey // MQTT用户名
#define clientId "clientId" // 客户端ID
#define passwd "passwd" // MQTT密码
#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}" // 上报数据的JSON格式
#define ALINK_TOPIC_PROP_POST "/sys/" ProductKey "/" DeviceName "/thing/event/property/post" // 上报属性的MQTT主题
WiFiClient espClient; // WiFi客户端对象
PubSubClient client(espClient); // MQTT客户端对象
float CurrentTemperature = 0; // 当前温度
float AirHumidity = 0; // 空气湿度
// 连接WiFi
void wifiInit()
{
WiFi.begin(WifiName, WifiPasswd); // 连接WiFi
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(1000);
}
Serial.println("\nWiFi Connected"); // WiFi连接成功
}
// MQTT连接检查
void mqttCheckConnect()
{
while (!client.connected()) // 如果MQTT未连接
{
if (client.connect(clientId, username, passwd)) { // 尝试连接MQTT服务器
Serial.println("MQTT Connected"); // MQTT连接成功
} else { // 连接失败
Serial.print("MQTT connection failed, rc=");
Serial.print(client.state()); // 打印MQTT连接状态
Serial.println(" try again in 5 seconds");
delay(5000); // 等待5秒后重试
}
}
}
// 上报温湿度数据
void mqttIntervalPost()
{
// 创建JSON文档
StaticJsonDocument<64> jsonDoc;
jsonDoc["CurrentTemperature"] = CurrentTemperature; // 添加当前温度
jsonDoc["AirHumidity"] = AirHumidity; // 添加空气湿度数据
// 将JSON文档转换为字符串
char jsonBuffer[64];
serializeJson(jsonDoc, jsonBuffer);
// 构建最终的MQTT消息
char jsonBuf[128];
snprintf(jsonBuf, sizeof(jsonBuf), ALINK_BODY_FORMAT, jsonBuffer);
boolean status = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); // 发布JSON数据
if (status) {
Serial.println("Publish message success");
// Serial.println("Published data: " + String(jsonBuf)); // 打印发布的数据
} else {
Serial.println("Could not send message");
}
}
// 解析串口数据
void parseSerialData() {
if (Serial.available() > 0) { // 如果串口有数据
String input = Serial.readStringUntil('\n'); // 读取一行数据
// 解析数据格式:Temperature,AirHumidity
int commaIndex = input.indexOf(',');
if (commaIndex != -1) {
String tempStr = input.substring(0, commaIndex); // 解析温度
CurrentTemperature = tempStr.toFloat();
String airHumidityStr = input.substring(commaIndex + 1); // 解析空气湿度
AirHumidity = airHumidityStr.toFloat();
mqttIntervalPost(); // 上报阿里云
} else {
Serial.println("Invalid data format. Expected: Temperature,AirHumidity");
}
}
}
void setup()
{
Serial.begin(115200); // 初始化串口通信
client.setServer(mqttHostUrl, port); // 设定MQTT服务器连接地址及端口
wifiInit(); // 初始化WiFi连接
delay(500); // 短暂延迟
}
void loop()
{
mqttCheckConnect(); // 确保MQTT连接
parseSerialData(); // 解析串口数据
client.loop(); // 处理MQTT消息
delay(100); // 短暂延迟
}
3. 上面程序需要注意的地方
两个程序代码中,Arduino端的可以直接使用我的代码,但是ESP826601端的代码有些地方需要按自己的实际情况修改,主要是WiFi信息、云平台设备信息以及MQTT连接参数,如下图中框选的内容。
其中WiFi名称和密码按照你实际情况填写即可,然后设备三元组的信息可以在你阿里云平台设备的详细页可以看到,如下:
然后是MQTT连接参数的clentId和passwd,在同页面下可以查看到。
做好上面的准备工作以及程序的修改,我们的项目就能够正常运行了。
四、运行结果
在Arduino IDE中我们打开串口监视器,可以看到打印设备连接初始化的信息,以及在初始化完成后开始进行数据上报。
然后打开阿里云,进入到相应的设备页面,可以看到设备在线,以及温湿度数据也更新了。
打开日志服务,可以看到确实是最新消息,并且状态为200(成功),点击查看可以看到上报的数据内容。
至此,项目实验成功!!!
五、结束语
好了,Arduino+ESP826601模块连接阿里云并实现温湿度数据上报的介绍就到这里结束了,同时,关于Arduino的博客内容后面可能不会更新太多了,后续有机会可能会更新一些全新的内容,比如stm32的学习使用以及人工智能的相关知识等等内容,敬请期待哈!我是“风行男孩”,如果我的博客有帮助到你,点个免费的赞即可,那咱们有缘再见!(码字不易,转载请注明出处,谢谢!!!)