Arduino+ESP826601s模块连接阿里云并实现温湿度数据上报

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中进行下载即可

电路图:
CSDN风行男孩制

三、程序代码

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,AirHumidityString 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);     // 连接WiFiwhile (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,AirHumidityint 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的学习使用以及人工智能的相关知识等等内容,敬请期待哈!我是“风行男孩”,如果我的博客有帮助到你,点个免费的赞即可,那咱们有缘再见!(码字不易,转载请注明出处,谢谢!!!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步

一、前言 在实际开发中&#xff0c;我们经常面临以下场景&#xff1a; 系统支持多种登录方式&#xff08;用户名密码、管理员登录、OAuth 登录、短信登录等&#xff09; 每种登录方式的认证逻辑不同 我们希望对外提供一个统一的接口调用&#xff0c;而不暴露具体实现 这个…

Windows Acrobat Pro DC-v2025.001.20435-x64-CN-Portable便携版

Windows Acrobat Pro 链接&#xff1a;https://pan.xunlei.com/s/VOO1nMjQ1Qf53dyISGne0c_9A1?pwdsfgn# Acrobat Pro 2024 专业增强版特色 ● 创建和编辑 PDF 文件&#xff1a;可以将各种类型的文档转换为 PDF 格式&#xff0c;并进行编辑和修改。 ● 合并和拆分 PDF&#…

【2025“华中杯”大学生数学建模挑战赛】C题:就业状态分析与预测 详细解题思路

目录 2025“华中杯”大学生数学建模挑战赛C题 详细解题思路一、问题一1.1 问题分析1.2 数学模型 1.3 Python代码1.4 Matlab代码 二、问题二2.1 问题分析2.2 数学模型 2.3 Python代码2.4 Matlab代码 三、问题三3.1 问题分析 四、问题四4.1 问题分析与数学模型 2025“华中杯”大学…

识别法院PDF文件特定字段并插入数据库【正则表达式+本地化部署】

pdf解析法院协助单特定字段&#xff0c;开源项目&#xff0c;结合若依项目进行开发&#xff0c;不连互联网&#xff0c;本地开发部署&#xff0c;前端使用vue3技术,后端用若依分离版spring botot技术&#xff0c;实现将pdf法院协助执行通知书中的特定字段如&#xff1a;时间、文…

拥抱健康养生,开启活力生活

在快节奏的现代生活中&#xff0c;人们愈发重视健康养生。它并非高深莫测的学问&#xff0c;而是融合于日常点滴&#xff0c;对我们的生活有着深远影响。 合理饮食是健康养生的基石。一日三餐&#xff0c;应遵循营养均衡原则。多摄入蔬菜、水果&#xff0c;它们富含维生素与膳食…

无人机姿态稳定与动态控制模块概述!

一、设计难点 1. 动态算力需求与硬件能力的不匹配** 无人机边缘计算设备通常受限于体积和重量&#xff0c;导致其计算单元&#xff08;如CPU、GPU&#xff09;的算力有限&#xff0c;难以应对突发的高负载任务&#xff08;如实时图像处理、AI推理&#xff09;。 挑战&am…

MySQL 临时表介绍

在 MySQL 数据库中&#xff0c;临时表是一种特殊类型的表&#xff0c;它在数据库会话期间存在&#xff0c;会话结束时自动删除。临时表为处理特定的、临时性的数据操作任务提供了一种高效且便捷的方式。 一、临时表的创建 使用CREATE TEMPORARY TABLE语句来创建临时表。其语法…

量子纠缠物理本质、技术实现、应用场景及前沿研究

以下是关于 量子纠缠(Quantum Entanglement) 的深度解析,涵盖物理本质、技术实现、应用场景及前沿研究,以技术视角展开: 一、量子纠缠的物理本质 1. 核心定义 量子纠缠是多个量子系统(如粒子)间的一种关联状态,表现为: 非局域性:纠缠态粒子无论相距多远,测量其中一…

扫雷-C语言版

C语言扫雷游戏设计&#xff08;完整版&#xff09; 游戏背景 扫雷是一款经典的益智类单人电脑游戏&#xff0c;最早出现在1960年代&#xff0c;并在1990年代随着Windows操作系统而广为人知。游戏目标是在不触发任何地雷的情况下&#xff0c;揭开所有非地雷的格子。玩家需要根…

深入理解 Linux 权限管理:从 Shell 到文件权限

&#x1f33c;&#x1f33c; 在 Linux 系统中&#xff0c;权限是保障系统安全与稳定的核心之一。每个操作都可能涉及权限的管理和控制&#xff0c;特别是当你开始以不同用户的身份进行操作时。本文将通过生动的比喻与详细的技术解析&#xff0c;带你一起深入理解 Linux 权限系统…

【Java面试系列】Spring Cloud微服务架构中的分布式事务解决方案与Seata框架实现原理详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Cloud微服务架构中的分布式事务解决方案与Seata框架实现原理详解 - 3-5年Java开发必备知识 引言 在微服务架构中&#xff0c;分布式事务是一个不可避免的挑战。随着业务复杂度的提升&#xff0c;如何保证跨服务的数据一致性成为了面试中的高频问题。本…

【c语言】——深入理解指针2

文章目录 一、指针数组指针数组模拟二维数组 二、数组指针二维数组传参的本质 三、字符指针变量四、函数指针变量4.1. 函数指针的应用4.2 两端有趣的代码4.3. typedef关键字4.3.1 typedef 的使用4.3.2. typedef与#define对比 五、函数指针数组函数指针数组的应用 一、指针数组 …

python20-while和for in的美

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 分支语句那些事儿 循环的类型循环的作用循环的构成要素while 循环while 循环实战循环语句 for…

私人笔记:动手学大模型应用开发llm-universe项目环境创建

项目代码&#xff1a;datawhalechina/llm-universe: 本项目是一个面向小白开发者的大模型应用开发教程&#xff0c;在线阅读地址&#xff1a;https://datawhalechina.github.io/llm-universe/ 项目书&#xff1a;动手学大模型应用开发 一、初始化项目 uv init llm-universe-te…

剖析 Rust 与 C++:性能、安全及实践对比

1 性能对比&#xff1a;底层控制与运行时开销 1.1 C 的性能优势 C 给予开发者极高的底层控制能力&#xff0c;允许直接操作内存、使用指针进行精细的资源管理。这使得 C 在对性能要求极高的场景下&#xff0c;如游戏引擎开发、实时系统等&#xff0c;能够发挥出极致的性能。以…

详细讲解一下Java中的Enum

Java 中的 枚举&#xff08;Enum&#xff09; 是一种特殊的类&#xff0c;用于表示一组固定且有限的常量&#xff08;如状态、类型、选项等&#xff09;。它提供类型安全的常量定义&#xff0c;比传统的常量&#xff08;如 public static final&#xff09;更强大和灵活。以下是…

首席人工智能官(Chief Artificial Intelligence Officer,CAIO)的详细解析

以下是**首席人工智能官&#xff08;Chief Artificial Intelligence Officer&#xff0c;CAIO&#xff09;**的详细解析&#xff1a; 1. 职责与核心职能 制定AI战略 制定公司AI技术的长期战略&#xff0c;明确AI在业务中的应用场景和优先级&#xff0c;推动AI与核心业务的深度…

LeetCode【剑指offer】系列(位运算篇)

剑指offer15.二进制中1的个数 题目链接 题目&#xff1a;编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为 汉明重量).&#xff09;。 思路一&#xff…

前端路由缓存实现

场景&#xff1a;以一体化为例&#xff1a;目前页面涉及页签和大量菜单路由&#xff0c;用户想要实现页面缓存&#xff0c;即列表页、详情页甚至是编辑弹框页都要实现数据缓存。 方案&#xff1a;使用router-view的keep-alive实现 。 一、实现思路 1.需求梳理 需要缓存模块&…

Buildroot编译过程中下载源码失败

RK3588编译编译一下recovery&#xff0c;需要把buildroot源码编译一遍。遇到好几个文件都下载失败&#xff0c;如下所示 pm-utils 1.4.1这个包下载失败&#xff0c;下载地址http://pm-utils.freedesktop.org/releases 解决办法&#xff0c;换个网络用windows浏览器下载后&…