【智能家居项目】RT-Thread版本——DHT11获取温湿度 | MQTT上传到服务器 | 服务器控制外设

news2025/1/25 9:14:47

🐱作者:一只大喵咪1201
🐱专栏:《智能家居项目》
🔥格言:你只管努力,剩下的交给时间!
图

这篇文章中,本喵将使用RT-Thread Studio来实现这个智能家居的项目,最终效果和前面的裸机版本以及FreeRTOS版本一样。在这里本喵将让大家体验到RT-Thread Studio的便利。

🏀创建工程

首先打开 RT-Thread Studio 软件,如何安装该软件本喵就不讲解了,直接去官网下载安装即可。

图
如上图,打开软件以后,关闭掉欢迎界面,然后按照图中的步骤来操作:

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

图
如上图,此时一个工程就创建好了,左边是项目资源管理器,包含该工程中的所有文件。

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

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

图
如上图所示,将开发板的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的软件包:

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

图
如上图,此时软件包这里就会有一个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.cdht11_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连接成功。

tu
如上图所示,在服务器设备中的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,其他的不用动。

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

tu
如上图所示,在微信小程序中搜索百问网嵌入式物联网,选择双架构,然后就会出现这样一个页面。

第一步让小程序连接服务器,第二部订阅/topic/humiture主题,这个主题必须和开发板发布的主题一样。

然后就可以接收到开发板发来的温湿度数据,如绿色框中的内容。

图
如上图,点击这几个图形化按钮就会发布相应的/topic/ctrl,该主题是开发板订阅的主题。

温湿度图标无法点击,它仅显示开发板发布的温湿度数据。

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

图
如上图,此时开发板上的灯就亮了。

🏀总结

在整个智能家居实现的过程中,本喵自己根本就没有写多少代码,尤其是驱动层的代码,就没有写过,全部用的是RT-Thread的软件包和组件。这就是RT-Thread的强大之处,它可以屏蔽底层的细节,让我们注重于上层应用的开发。

这种通过服务器来实现智能家居,不再像FreeRTOS一样小程序和开发板必须处于同一个局域网中,此时开发板和小程序可以处于任意一个局域网中。

  • 开发板和小程序订阅以及发布的消息是通过服务器进行转发的。

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

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

相关文章

词令外卖节红包天天神券每天领取直达入口

词令外卖节红包天天领直达入口 1、打开「词令」关键词口令直达微信小程序; 2、输入词令「外卖红包88」关键词直达口令; 3、搜索直达进入外卖红包天天领入口,即可成功领取外卖节红包和天天神券点外卖可享受券后价优惠; *温馨提醒&…

故障诊断模型 | 基于多信号融合和改进的深度卷积生成对抗网络的不平衡数据故障诊断方法

文章目录 文章概述模型描述参考资料文章概述 本文提出了一种解决数据不平衡问题并提高诊断准确性的诊断方法。首先,通过小波变换处理来自多个传感器的信号,以增强数据特征,然后通过池化和拼接操作对其进行压缩和融合。随后,构建改进的对抗网络来生成新的样本进行数据增强。…

C#预处理器指令(巨细版)

文章目录 一、预处理器指令的基本概念二、预处理器指令的基本规则三、C# 预处理器指令详解3.1 #define 和 #undef3.2 #if、#else、#elif 和 #endif3.3 #line3.4 #error 和 #warning3.5 #region 和 #endregion 四、高级应用:预处理器指令的最佳实践4.1 条件编译的最佳…

.Net 知识杂记

记录平日中琐碎的.net 知识点。不定期更新 目标框架名称(TFM) 我们创建C#应用程序时,在项目的工程文件(*.csproj)中都有targetFramework标签,以表示项目使用的目标框架 各种版本的TFM .NET Framework .NET Standard .NET5 及更高版本 UMP等 参考文档&a…

公司服务器被.rmallox攻击了如何挽救数据?

公司服务器被.rmallox攻击了如何挽救数据? .rmallox这种病毒与之前的勒索病毒变种有何不同?它有哪些新的特点或功能? .rmallox勒索病毒与之前的勒索病毒变种相比,具有一些新的特点和功能。这种病毒主要利用加密技术来威胁用户&am…

Ubuntu20.04LTS+uhd3.15+gnuradio3.8.1源码编译及安装

文章目录 前言一、卸载本地 gnuradio二、安装 UHD 驱动三、编译及安装 gnuradio四、验证 前言 本地 Ubuntu 环境的 gnuradio 是按照官方指导使用 ppa 的方式安装 uhd 和 gnuradio 的,也是最方便的方法,但是存在着一个问题,就是我无法修改底层…

vue3使用vuedraggable实现拖拽(有过渡)

1. 安装与使用 vue中vuedraggable安装: pnpm i -S vuedraggablenext或者 yarn add vuedraggablenext注意:vue2和vue3安装的是不同版本的vuedraggable,写法上也会有一些区别。 比如在vue3中使用拖拽,要以插槽的方式,…

Unity DOTS中的baking(四)blob assets

Unity DOTS中的baking(四)blob assets blob assets表示不可变的二进制数据,在运行时也不会发生更改。由于blob assets是只读的,这意味着可以安全地并行访问它们。此外,blob assets仅限于使用非托管类型,这意…

从TCP/IP协议到socket编程详解

​ 我的所有学习笔记:https://github.com/Dusongg/StudyNotes⭐⭐⭐ ​ 文章目录 1 网络基础知识1.1 查看网络信息1.2 认识端口号1.3 UDP1.4 TCP1.4.1 确认应答机制1.4.2 TCP三次握手/四次挥手为什么是三次握手为什么是四次挥手listen 的第二个参数 backlog—— 全…

ES6中的Set集合

Set集合 ES6 提供了新的数据结构Set(集合)。 它类似于数组,但成员的值都是唯一的集合实现了 iterator 接口,所以可以使用「扩展运算符」和[for…of…」进行遍历集合的属性和方法 集合的属性和方法: 1)size,返回集合的元…

应用分层(三层架构)

1、 2、它比MVC更合理,MVC的任务分配不太均匀,model处理的问题过多,进一步改进成三层架构更为合理 3、 4、两者共同点:解耦 5、高内聚低耦合 (1)模块内:关系尽量紧密 (2&#xf…

HTTP 与 HTTPS 的区别

基本概念 HTTP(HyperText Transfer Protocol:超文本传输协议)是一种应用层协议,主要用于在网络上进行信息的传递,特别是用于Web浏览器和服务器之间的通信。 它使用明文方式发送数据,这意味着传输的内容可…

CTK插件框架学习-插件注册调用(03)

CTK插件框架学习-新建插件(02)https://mp.csdn.net/mp_blog/creation/editor/136923735 一、CTK插件组成 接口类:对外暴露的接口,供其他插件调用实现类:实现接口内的方法激活类:负责将插件注册到CTK框架中 二、接口、插件、服务…

QT_day5:使用定时器实现闹钟

1、 程序代码&#xff1a; widget.h&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTextToSpeech>//文本转语音类 QT_BEGIN_NAMESPACE namespace Ui { cla…

Nodejs 16与 gitbook搭建属于你自己的书本网站-第一篇

最近想重新搭建一个网站来存放自己的相关知识点&#xff0c;并向网络公开&#xff0c;有个hexo博客其实也不错的&#xff0c;但是总感觉hexo很多花里胡哨的玩意&#xff0c;导致挂载的博客异常卡&#xff0c;这样反而不利于我自己回顾博客了&#xff0c;于是我就开始钻研这个鬼…

IDEA的Scala环境搭建

目录 前言 Scala的概述 Scala环境的搭建 一、配置Windows的JAVA环境 二、配置Windows的Scala环境 编写一个Scala程序 前言 学习Scala最好先掌握Java基础及高级部分知识&#xff0c;文章正文中会提到Scala与Java的联系&#xff0c;简单来讲Scala好比是Java的加强版&#x…

商品数据化运营---初步整理

商品数据化运营是指利用数据分析技术来优化商品的销售、管理和推广过程。这种方法结合了数据科学、商业智能、市场分析和消费者行为研究等多个领域的技术和理论&#xff0c;旨在通过分析大量的商品和销售数据来提高商品的市场表现和企业的利润。 以下是商品数据化运营的一些关…

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!

文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场&#xff0c;国际化是肯定…

【开发篇】六、查询大量数据导致内存溢出

文章目录 1、溢出场景2、快照文件分析3、本地环境复现4、结论5、解决思路 记录一个问题&#xff0c;工作中有个数据处理服务OOM&#xff0c;查了下镜像的dockerfile&#xff0c;发现JVM参数如下。很明显&#xff0c;一个数据服务&#xff0c;里面经手大量的数据对象&#xff0c…

探究分布式事务:深入ACID特性在分布式系统中的挑战与解决方案

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…