【智能家居项目】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)机制读取。结构体标签的存在意义和用途非常广泛,主要包括ÿ…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...