Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
HMI-Board
onenet
RT-Thread学习营
《RTT夏令营实践作业 》--- 基于ONENET的多区域温湿度监控系统
发布于 2023-07-27 09:31:58 浏览:406
订阅该版
[tocm] # RTT夏令营实践作业 基于ONENET的多区域温湿度监控系统 ## 背景: 随着科技的发展,物联网设备的普及和应用越来越广泛,该系统基于ONENET的多区域温湿度监控系统是一套用于实时监测和管理不同地区温湿度的智能解决方案。该系统由一组分布在多个区域的传感器节点组成,采集环境数据并通过无线网络传输至云平台。借助云端分析和处理,用户可以远程监控各个区域的温湿度情况,并及时获取警报和报告。同时,该系统还具备数据存储和分析功能,为用户提供科学决策依据,助力业务优化和资源调配。 ## 设计方案: 该项目的方案方案是通过RT-Thread操作系统和ONENET云平台实现物联网设备实时监控多个区域的温湿度,并显示在HMI_Board开发板中。为了实现一个设备同时监控多个设备发来的数据,一个HMI_Board开发板作为接收节点,剩余三个的作为发送节点,接收节点通过订阅ONENET上的多个产品,等待发送节点向ONENET上的每个特有的产品发送数据,接收节点通过数据解析是那个设备发过来的,然后显示在HMI_board开发板上,同时在ONENET云端这可以看到数据,实现多区域温湿度监控。 ## 开发环境 1.开发板:HMI_Board 2.开发环境:RT-Thread studio V2.2.6 3.RT-Thread版本:4.1.0 4.I2C外设资源:P202—SCL P203—SDA 5.传感器:AHT10,RW007 6.云平台:ONENET ## 系统设计流程 ![screenshot_5NFS@W(FR}3@Z990SBD9MIB.png](https://oss-club.rt-thread.org/uploads/20230727/55cbe402b497617dd405f804ea762e53.png) ## 重要代码设计 ### 发送节点:(下面仅展示一个发送节点的代码,其他同理,只是发送的帧头不一样,方便接收节点解析) hal_entry.c //包括系统的wifi的连接,mqtt初始化,aht10线程的初始化,mqtt发送线程的初始化 ```c #include
#include "hal_data.h" #include
#include
#include "my_aht10.h" #include "my_onenet.h" #define LED_PIN BSP_IO_PORT_02_PIN_09 /* Onboard LED pins */ void AHT10_read(void *parameter); void onenet_onenet_mqtt_publish(void *parameter); rt_mailbox_t temp_msg_mb; rt_mp_t temp_msg_mp; rt_sem_t my_sem1; #define mb_len 32 #define mp_len 32 struct dht_htemp { int humi; int temp; }; void hal_entry(void) { temp_msg_mb = rt_mb_create("temp_mb", mb_len, RT_IPC_FLAG_FIFO); temp_msg_mp = rt_mp_create("temp_mp", mp_len, sizeof(struct dht_htemp)); my_sem1 = rt_sem_create("my_sem1", 0, RT_IPC_FLAG_FIFO); rt_wlan_connect("WWWW", "123456789zxc"); //连接wifi onenet_mqtt_init(); //mqtt //mqtt初始化 my_aht10_init(); //aht10 //启动aht10线程 My_Onenet_Send(); //Onenet //启动讲数据上传ONENET上 } ``` my_aht10.c //读取温湿度线程,然后通过邮箱和内存池实现和mqtt上传数据线程进行交流 ```c #include "my_aht10.h" extern rt_mailbox_t temp_msg_mb; extern rt_mp_t temp_msg_mp; extern rt_sem_t my_sem1; extern struct dht_htemp { int humi; int temp; }; static rt_thread_t aht10_tid = RT_NULL; void AHT10_read(void *parameter) { struct dht_htemp *msg; aht10_device_t dev; const char *i2c_bus_name = "i2c1"; rt_thread_mdelay(500); dev = aht10_init(i2c_bus_name); if(dev == RT_NULL) { rt_kprintf("The sensor init failed.\r\n"); return ; } rt_sem_take(my_sem1, RT_WAITING_FOREVER); while(1) { msg = rt_mp_alloc(temp_msg_mp, RT_WAITING_FOREVER); msg->temp = (int)aht10_read_temperature(dev); msg->humi = (int)aht10_read_humidity(dev); rt_mb_send(temp_msg_mb, (rt_ubase_t)msg); rt_kprintf("temp:[%d], humi:[%d],location:Nanyang\n" ,msg->temp, msg->humi); msg = RT_NULL; rt_thread_mdelay(1000); } } void my_aht10_init(void) { aht10_tid = rt_thread_create("aht10_thread", AHT10_read, RT_NULL, 2048, 17, 10); if (aht10_tid) { rt_thread_startup(aht10_tid); rt_kprintf("aht10_tid_init success!\r\n"); } } ``` my_onenet.c //将数据上传到云端,并下发给接收节点 ```c #include "my_onenet.h" extern rt_mailbox_t temp_msg_mb; extern rt_mp_t temp_msg_mp; extern struct dht_htemp { int humi; int temp; }; static rt_thread_t onenet_tid = RT_NULL; void onenet_onenet_mqtt_publish(void *parameter) { struct dht_htemp *msg; uint8_t tbuf[64] = {0}; size_t len = 0; while(1) { if(rt_mb_recv(temp_msg_mb, (rt_ubase_t*) &msg, RT_WAITING_FOREVER) == RT_EOK) { rt_sprintf((char *) tbuf, "temp:[%d], humi:[%d],location:Nanyang", msg->temp, msg->humi); len = strlen(tbuf); // rt_kprintf("%d\n",len); if (onenet_mqtt_publish("classA", &tbuf, len) < 0) { rt_kprintf("upload string has an error!\n"); } else { onenet_mqtt_upload_digit("temperature", msg->temp); onenet_mqtt_upload_digit("humidity", msg->humi); rt_mp_free(msg); msg = RT_NULL; } } } } void My_Onenet_Send(void) { onenet_tid = rt_thread_create("Onenet_humi_temp",onenet_onenet_mqtt_publish,RT_NULL,2048,16,10); if (onenet_tid) { rt_thread_startup(onenet_tid); rt_kprintf("mqtt_thread_init success!\r\n"); } } ``` ### 接收节点 主要就是接收onenet每个产品上下发的数据进行解析并显示到显示屏上 对发来得数据进行解析: ```c int onenet_onenet_mqtt_subscribe(void) { if (onenet_mqtt_subscribe("classA") < 0) { LOG_E("upload string has an error!\n"); } if (onenet_mqtt_subscribe("classB") < 0) { LOG_E("upload string has an error!\n"); } if (onenet_mqtt_subscribe("classC") < 0) { LOG_E("upload string has an error!\n"); } return 0; } rt_err_t onenet_mqtt_subscribe(const char *topic) { RT_ASSERT(topic); if ( MQTTSubscribe(&mq_client, topic, QOS0) < 0) { return -1; } return 0; } ``` LCD显示: ```c static void lvgl_thread_entry(void *parameter) { #if LV_USE_LOG lv_log_register_print_cb(lv_rt_log); #endif /* LV_USE_LOG */ lv_init(); lv_port_disp_init(); lv_port_indev_init(); lv_obj_t* label1 = lv_label_create(lv_scr_act()); lv_obj_t* label2 = lv_label_create(lv_scr_act()); lv_obj_t* label3 = lv_label_create(lv_scr_act()); lv_label_set_text(label1, "1"); lv_label_set_text(label2, "2"); lv_label_set_text(label3, "3"); lv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_CENTER, 0); //设置对象字体样式居中 lv_obj_align(label1, LV_ALIGN_CENTER, 0, lv_pct(20)); //设置对象居中 lv_obj_set_style_text_align(label2, LV_TEXT_ALIGN_CENTER, 0); //设置对象字体样式居中 lv_obj_align(label2, LV_ALIGN_CENTER, 0,0); //设置对象居中 lv_obj_set_style_text_align(label3, LV_TEXT_ALIGN_CENTER, 0); //设置对象字体样式居中 lv_obj_align(label3, LV_ALIGN_CENTER, 0, lv_pct(-20)); //设置对象居中 /* handle the tasks of LVGL */ while(1) { lv_task_handler(); rt_thread_mdelay(500); if(my_flag == 1) { lv_label_set_text(label1, str); my_flag = 0; } if(my_flag == 2) { lv_label_set_text(label2, str1); my_flag = 0; } if(my_flag == 3) { lv_label_set_text(label3, str2); my_flag = 0; } } } ``` ## 效果展示 ### 接收节点的显示屏显示:(显示三个不同组员采集到的数据,在不同地方,南阳,周口,长沙) ![1.png](https://oss-club.rt-thread.org/uploads/20230727/bb27cc32deeb729db46699246b986a9f.png.webp) 云平台设备在线情况以及传输数据显示 ![2.png](https://oss-club.rt-thread.org/uploads/20230727/d1fff3db77d666964b2e61005d1879c4.png.webp) ![3.png](https://oss-club.rt-thread.org/uploads/20230727/e89a653a0d973cba077428c944f1fc28.png.webp) ## 发送节点: ### 节点一: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230727/4d32ac745033a52e80bffa09e12f1bd3.png.webp) ### 节点二: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230727/e0c000bb27293e0ac29b9da698096104.png) ### 节点三: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230727/b9060978e9366d4ccfa5a260a71f3c2f.png)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
洛伦兹力
这家伙很懒,什么也没写!
文章
2
回答
2
被采纳
0
关注TA
发私信
相关文章
1
stm32f407+lan8720 lwip2.0 作业提交
2
玩溜GD32303E-EVAL BSP系列(五)----设备连接网络
3
onenet应用连不上云端
4
【文件系统】晴天文件匹配
5
rtt semc sdram 基于操作系统怎么初始化驱动设备
6
RT-Thread移植笔记
7
RT-Thread内核移植+LoIIs+STM32F103C8+StdLib
8
EVN编译报错,求助大神
9
【内核和外设学习营】十里 简单LED闪亮测试
10
【内核和外设学习营】 十里 串口指令控制RGB灯点亮的颜色
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
3
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部