【智能家居项目】RT-Thread版本——DHT11获取温湿度 | MQTT上传到服务器 | 服务器控制外设
🐱作者:一只大喵咪1201
🐱专栏:《智能家居项目》
🔥格言:你只管努力,剩下的交给时间!
这篇文章中,本喵将使用RT-Thread Studio来实现这个智能家居的项目,最终效果和前面的裸机版本以及FreeRTOS版本一样。在这里本喵将让大家体验到RT-Thread Studio的便利。
🏀创建工程
首先打开 RT-Thread Studio 软件,如何安装该软件本喵就不讲解了,直接去官网下载安装即可。

如上图,打开软件以后,关闭掉欢迎界面,然后按照图中的步骤来操作:
- 点击左上角文件中的新建,选择
RT-Thread项目。
RT-Thread项目是标准工程,它包含RT-Thread的所有功能,可以安装大量的组件。RT-Thread Nano项目是简化版本,它包含的功能和FreeRTOS一样,仅支持任务,任务间通信等等,不支持组件。
- 输入工程名字和工程文件保存路径。
- 如果使用缺省位置,则会保存到
RT-Thread Studio的安装路径下的某一个文件中。
- 选择芯片型号和控制台端口以及调试端口。
- 根据芯片的厂商,选择相应的型号,本喵这里选择的是STM32F103ZE。
- 选择控制台所用的串口,该控制台就像是板子上运行的一个
shell。- 选择调试器以及接口类型,有
ST-Link和J-Link等等,根据自己的设备来选择。
- 最后点击完成。

如上图,此时一个工程就创建好了,左边是项目资源管理器,包含该工程中的所有文件。
RT-Thread Setting:双击这个会出现一个图形化界面,用来安装各种组件,后面会用到。CubeMX Setting:双击这个就会打开CubeMX,可以配置芯片的外设,生成HAL库的代码。drv_clk.c:在drivers目录下的drv_clk.c中,可以修改时钟源,生成的工程默认使用的是内部高速时钟HSI,可以修改代码配置成外部时钟源HSE,本喵这里就不配置了,直接使用内部高速时钟。

如上图所示,将工程进行编译,然后将程序下载到开发板中。

如上图所示,将开发板的uart1和电脑相连,并且打开串口助手,可以看到内核的打印信息(绿色框),和main线程的打印信息,红色框中。
- 在
RT-Thread中,任务被叫做线程。main函数仅是其中的一个线程。
main函数在applications目录下,可以看到,该函数中并没有像FreeRTOS一样的内核初始化和启动调度器等内容,仅仅是一个干干净净的main函数。
🏐RT-Thread启动流程

如上图所示RT-Thread的启动流程,本喵大概介绍一下:
-
第1个文件:startup_stm32f103xe.s
- 调用
SystemInit:系统初始化,比如初始化时钟 - 调用
__main:重定位,比如把代码段从Flash复制到内存,然后执行$Sub$$main
- 调用
-
第2个文件:src\components.c
- 执行一系列的初始化
- 调用
rt_application_init- 初始化RTT组件(包括创建SHELL线程):因为有SHELL线程,所以即使main函数为空,也是可以操作开发板的
- 调用
main函数:可以写为空函数
- 启动调度器:
rt_system_scheduler_start
位置①处创建了SHELL线程,用户可以在串口上输入各种命令;所以位置②的main函数写为空函数也是可以的。
🏐添加DHT11软件包

如上图所示,增加DHT11的软件包:
- 双击项目资源管理器中的
RT-Thread Setting,弹出一个图形界面窗口。 - 点击添加软件包,弹出软件包选择界面。
- 搜索
DHT11,出现多个软件包。 - 找到下载次数最多的(绿色框),然后点击相应软件包的添加。

如上图,此时软件包这里就会有一个dht11的图标,然后按下快捷键Ctrl + s保存,就会自动下载软件包并且构建到工程中。

如上图所示,此时在packages目录下就有一个dht11-latest的目录,里面包含几个.c和.h文件。其中dht11_sample.c是一个样例。
打开dht11_sample.c后,将#include "drv_gpio.h"修改成#include "drv_common.h",这是由于版本原因,新版本和gpio相关的定义都放在了drv_common.h中。
还要修改读取DHT11温湿度数据的引脚,生成工程后默认使用的是PB12,查看原理图使用自己对应的引脚,本喵这里是PF6。

如上图,在编译的时候会报错找不到sensor.h头文件,所以需要将头文件的路径告诉编译器。

如上图,sensor.h头文件位于sensors文件夹中。点击最上边的c/c++项目,找到该文件,然后右键点击,在弹出的界面中进行添加构建。
- 添加构建就是在编译的时候,要编译这部分文件,否则不会编译这里的文件。

如上图所示,点击标号1的设置,然后选择标号2的路径和符合,最后添加sensor.h头文件所在路径。
//${ProjName}表示的是工程文件名字,后面的是路径。

如上图所示,将程序重新编译好下载到板子中以后,在串口助手上就可以看到输出的温湿度数据了。

如上图所示,在我们安装软件包中的dht11_sample.c中,专门有一个线程read_temp_entry读取温湿度数据的线程,不断调用rt_device_read来读取DHT11温湿度传感器的数据,并且打印出来。
rt_device_read是一个标准接口,就像写C语言代码中的open函数一样。DHT11的驱动框架是怎样的,本喵就不在这里讲解了。
此时我们就实现了温湿度的读取,可以看到,整个过程中也没有写多少代码,RT-Thread Studio中的软件包帮我们实现了这部分代码。
🏐添加ESP8266软件包

如上图所示,按照1~6的步骤添加一个AT设备,这是用来和ESP8266通信的。
- 第6步中,填入WIFI模块要连的WIFI名称和密码。
- 更改AT设备使用的串口为
uart3,根据原理图来确定。

如上图所示,此时就自动有了一个AT DEVICE软件包和一个AT客户端组件(红色框),然后点击绿色框中的libc使能C语言库,因为要用到C语言库中的函数。最后按下Ctrl + s保存。

如上图所示,要在drivers目录下的board.h中定义uart3,仿照uart1定义即可,根据原理图定义使用的引脚。

如上图,将main.c和dht11_sample.c中的打印信息注释掉,让它不要干扰串口助手的输出。

如上图所示,将程序编译下载到开发板后,可以从串口助手看到WIFI连接成功的消息。
在控制台使用ifconfig可以看到获得了IP地址,并且可以使用ping命令和www.baidu.com进行网络通信。此时ESP8266就设置成功了。
🏐添加MQTT软件包
MQTT是一种网络通信协议,适合于少量数据的传输,具体原理本喵就不在这里介绍了。

如上图所示,按照步骤1~3添加pahomqtt软件包。

如上图所示,在软件包处会有一个Paho MQTT,将鼠标移上去以后点击出现的配置项(步骤1),然后在弹出的界面中使能MQTT示例(步骤2)。最后保存配置。
- 每次保存了新的配置以后,
sensor.h文件又会找不到,这是该软件的一个BUG,所以需要重新添加路径和添加构建。
🏀与服务器建立连接
现在工程就配置好了,此时我们的开发板就是一个客户端,接下来就是需要让开发板和服务器进行连接和通信了。

如上图,本喵在阿里云平台配置了一个设备实例,打开该设备后,点击里面的MQTT连接参数后面的查看(红色框),然后就会弹出参数。

如上图所示,在产品中有默认的订阅主题和发布主题,我们就直接订阅/user/get这个主题,以及发布/user/update这个主题。

如上图所示,将自动生成的mqtt_sample.c中的默认MQTT连接参数改成自己服务器的。

如上图所示,在mqtt_sart函数中,默认生成的代码是随机生成一个客户端ID,此时我们有固定的客户端ID,将我们前面服务器中的ID赋值过去。

如上图所示,将程序编译并下载到开发板中后,在串口助手中执行help命令,可以看到有几个mqtt打头的指令。

如上图所示,在串口助手中执行mqtt_start命令启动MQTT,会打印相关成功信息,并且此时服务器设备也显示在线状态,说明此时开发板这个客户端和服务器MQTT连接成功。

如上图所示,在服务器设备中的Topic列表里,点击发布消息,发布/user/get主题的消息给开发板客户端,然后在弹出来的框中填入发布的消息,最后点击完成(步骤1~5)。

如上图所示,此时在串口助手上就能看到服务器发布的信息了。

如上图所示,在串口助手中使用mqtt_publish命令发布消息到服务器。

如上图所示,在服务器设备中,根据步骤1~4可以查看到开发板客户端刚刚发布的消息。
此时我们的开发板就和服务器成功的建立了连接,并且可以进行通信了。
🏀服务器控制外设

如上图代码所示,在main.c文件中,定义LED以及风扇的引脚,并在device_init函数中进行初始化。

如上图代码所示,在device_control_callback回调函数中根据服务器发布的消息来控制外设,具体控制细节和前面FreeRTOS版本的一样。
msh_exec:调用该函数和我们在串口助手上输入命令是一个效果。

如上图所示,在main函数中,读取温湿度传感器的数据,然后再向服务器发布,每两秒进行一次。
- 控制设备的回调函数谁在执行?

如上图代码所示,控制设备的device_control_callback回调函数在mqtt_sub_callback回调函数执行。
- 在启动
mqtt_start的时候,会专门创建一个线程用来接收服务器发布的消息。- 当服务器发布了消息以后,该线程就会读取,并且调用
mqtt_sub_callback函数。
所以在控制设备的函数中就可以得到服务器发布的消息。

如上图代码所示,将原本dht11_sample.c中的dht11_read_temp_sample从段中移除,不让该函数执行,因为现在是在main.c读取温湿度数据的。

如上图所示,将程序编译下载到开发板中后,等待和服务器建立连接后,可以从服务器的日志信息中查看到开发板发布的温湿度数据。
| 消息格式 | 含义 |
|---|---|
| {“dev”:“lamp1”,“status”:“1”} | 点亮LED1,后面的status改为0则熄灭它 dev有多个取值:lamp1,lamp2,lamp3 |
| {“dev”:“fan”,“status”:“1”} | 转动风扇,后面的status改为0则停止它 |
| {“dev”:“home”,“status”:“1”} | 离开了家,后面的status改为0则表示回家 |
| {“Temperature”:28,“Humidity”:88} | 上报温度、湿度 |
开发板和服务器进行通信的消息格式如上表所示,在服务器发布控制消息,开发板就会做出相应的操作。

如上图所示,在服务器上发布一个这样的消息,开发板上的所有LED灯都会亮,并且风扇也会开始转动,最后面本喵会上传效果图。
🏀小程序控制外设
这里本喵使用百问网的小程序和服务器来控制开发板。

如上图所示,在mqtt_sample.c文件中定义百问网的三元组,不用定义客户端ID,所以要将前面注释掉的随机ID修改回来。

在main.c中,将发布消息的主题修改为/topic/humiture,其他的不用动。

将程序编译完成后下载到开发板中,此时开发板客户端就会自动和百问网的服务器相连。

如上图所示,在微信小程序中搜索百问网嵌入式物联网,选择双架构,然后就会出现这样一个页面。
第一步让小程序连接服务器,第二部订阅/topic/humiture主题,这个主题必须和开发板发布的主题一样。
然后就可以接收到开发板发来的温湿度数据,如绿色框中的内容。

如上图,点击这几个图形化按钮就会发布相应的/topic/ctrl,该主题是开发板订阅的主题。
温湿度图标无法点击,它仅显示开发板发布的温湿度数据。

如上图所示,点击小程序中的按钮,开发板的串口助手就会接收到订阅的控制主题消息,并且做出相应的控制。

如上图,此时开发板上的灯就亮了。
🏀总结
在整个智能家居实现的过程中,本喵自己根本就没有写多少代码,尤其是驱动层的代码,就没有写过,全部用的是RT-Thread的软件包和组件。这就是RT-Thread的强大之处,它可以屏蔽底层的细节,让我们注重于上层应用的开发。
这种通过服务器来实现智能家居,不再像FreeRTOS一样小程序和开发板必须处于同一个局域网中,此时开发板和小程序可以处于任意一个局域网中。
- 开发板和小程序订阅以及发布的消息是通过服务器进行转发的。
相关文章:
【智能家居项目】RT-Thread版本——DHT11获取温湿度 | MQTT上传到服务器 | 服务器控制外设
🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言:你只管努力,剩下的交给时间! 这篇文章中,本喵将使用RT-Thread Studio来实现这个智能家居的项目,最终…...
Docker 轻量级可视化工具 Portainer
1. 是什么 它是一款轻量级的应用,它提供了图形化界面,用于方便管理Docker环境,也包括单机环境和集群环境。 2. 安装 官网:Kubernetes and Docker Container Management Software 安装路径:Install the Compose plug…...
推特Twitter有直播功能吗?如何用Twitter直播?
现在各大直播平台已经成为社交媒体营销的一种重要渠道,它让品牌能够即时地与全球受众进行互动。据统计,直播市场正在迅速增长,预计到2028年将达到2230亿美元的规模。在这个不断扩张的市场中,许多社交媒体平台如YouTube、Facebook、…...
蓝桥杯算法基础(32):素数,埃式筛法,快速幂,斐波那契与矩阵幂运算
素数 有些人认为一个人一生中有三个周期,从他或她出生的那一天开始。 这三个周期是身体周期,情感周期的和智力的周期,他们有周期的长度为23,28, 和33天。每一个周期都有一个高峰。在一个周期的高峰期, 一个…...
VSCode - 离线安装扩展python插件教程
1,下载插件 (1)首先使用浏览器打开 VSCode 插件市场link (2)进入插件主页,点击右侧的 Download Extension 链接,将离线安装包下载下来(文件后缀为 .vsix) 2,…...
2024年中级职称现在报名,时间还太早了吗?什么时候合适?
甘建二十年耕耘职称,关于职称大小事都了解 想要评湖北职称,请认准甘建二,关于职称评审条件、申报时间、评审资料、申报材料、评审流程、证书查询、出证时间、考试答辩等关于职称所有的事情都知道,找甘建二准没错。 我们通常都会觉…...
《责任链模式(极简c++)》
本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 模式说明 方案: 责任链模式将请求的发送者和接收者解耦,构成一个链条,并由多个对象对请求进行处理,直到找到合适的处理者为止。优点: …...
【学习】JMeter和Postman两种测试工具的主要区别有哪些
Postman和JMeter都是常用的API测试工具,但它们之间存在一些不同之处。以下是Postman和JMeter的主要区别: 语言支持 Postman是一个基于Chrome的应用程序,因此它使用JavaScript作为编程语言。这意味着你可以使用JavaScript来编写测试脚本和断…...
【压缩字符串算法解析与实现】
压缩的要求是将连续相同字符替换为字符 数字形式,例如 “AAABCCDDDD” 变为 “A3BC2D4”。 问题描述与分析 给定一个字符串,我们需要判断是否可以进行压缩,并且只在压缩后的字符串长度比原字符串长度更短时进行压缩。如果字符串可以压缩&a…...
test02
欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…...
K8S Pod 水平自动扩缩容 HPA
介绍 HPA(Horizontal Pod Autoscaler)水平扩缩意味着可根据观察到的CPU、内存使用率或自定义度量标准来自动扩展或缩容Pod的数量(Deployment、StatefulSet 或其他类似资源)。与“垂直”扩缩不同,对于 K8S,…...
Spring日志框架
前言 本文我们简单说说关于Spring中的日志框架,以及对应的注解 我们知道,公司服务器在运行的时候,一定会打印日志,有很多优点,比如预防报警,或者是某重大事故尝试修复等等都需要查看日志 应该说日志对我们来说并不陌生,我们在之前刷题或者是程序遇到bug的时候也经常会将程序的状…...
(九)关系数据理论
函数依赖:设R(U)是属性集U上的关系模式。X、Y是属性集U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作X→Y。(即只要X 上的…...
【经验分享】Ubuntu下如何解决问题arm-linux-gcc:未找到命令
【经验分享】Ubuntu下如何解决问题arm-linux-gcc:未找到命令 前言问题分析解决方法 前言 在编译过程中发现一个问题,明明之前安装了gcc-4.6版本,版本信息都是正常显示的,刚安装上去的时候也是可以用的。但不知道什么原因突然不能…...
【算法刷题day10】Leetcode:232.用栈实现队列、225. 用队列实现栈
文章目录 Leetcode 232.用栈实现队列解题思路代码总结 Leetcode 225. 用队列实现栈解题思路代码总结 stack、queue和deque对比 草稿图网站 java的Deque Leetcode 232.用栈实现队列 题目:232.用栈实现队列 解析:代码随想录解析 解题思路 一个栈负责进&a…...
sql注入详解
ps:简单说下这里只写了我能理解的明白的,后面的二阶注入,堆叠注入没写 手工sql注入 1.存在sql注入本质上就是数据库过滤的不严格或者未进行过滤,1 and 11,返回正常,1 and 12 返回不正常,说明带到数据库里面…...
[蓝桥杯 2022 省 B] 李白打酒加强版
题目链接 [蓝桥杯 2022 省 B] 李白打酒加强版 题目描述 话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 2 2 2 斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍…...
【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey
本文简介 1、对最先进水平RAG进行了全面和系统的回顾,通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下,更广泛的范围内的法学硕士研究RAG的景观。 2、确定并讨论了RAG过程中不可或缺的核心技术,特别关注“…...
EVM Layer2 主流解决方案
深度解析主流 EVM Layer 2 解决方案:zk Rollups 和 Optimistic Rollups 随着以太坊网络的不断演进和 DeFi 生态系统的迅速增长,以太坊 Layer 2 解决方案日益受到关注。 其中,zk Rollups 和 Optimistic Rollups 作为两种备受瞩目的主流 EVM&…...
go中结构体标签:omitempty、json꞉“name“、 gorm꞉“column꞉name“、yaml꞉“name“
在Go语言中,结构体标签(Struct Tags)提供了一种在编译时附加到结构体字段上的元数据,这些标签可以被运行时的反射(reflection)机制读取。结构体标签的存在意义和用途非常广泛,主要包括ÿ…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

