Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
【24嵌入式设计大赛】基于RT-Thread星火一号开发板的农业土质检测系统
发布于 2024-09-13 18:54:35 浏览:328
订阅该版
[tocm] # 项目简介 本项目基于RT-thread操作系统,采用先进的**七合一土壤传感器**收集土壤数据,并通过**RS485总线**将数据传输至**星火一号主控板**。该主控板通过**WIFI或4G网络**,将数据实时上传至**阿里云平台**,实现用户对土壤状况的实时监控,促进农田或土地的科学管理。 # 开源代码与组件使用情况说明 ## 系统硬件 - **主控板**:采用睿赛德公司提供的星火一号开发板。 ![board-small.jpg](https://oss-club.rt-thread.org/uploads/20240913/c593de4dc1602c7724fd8fb4b21af60b.jpg.webp) - **传感器**:集成温湿度、pH值、电导率、氮磷钾等数据的七合一土壤数据传感器。 ![传感器图片.jpg](https://oss-club.rt-thread.org/uploads/20240913/a3be8b12df9436b6ab4ef8d9a60b2d96.jpg.webp) - **通讯模块**:板载RW007 WiFi模块。 ## 系统软件 - **操作系统**:底层硬件上搭载RT-thread操作系统的4.1.1版本。 - **软件包**:运用RT官方提供的RW007软件包、ali-iotkit软件包以及cJSON软件包。 - **数据传输**:通过UART外设进行。 ## 云平台 - **平台选择**:采用阿里云平台。 - **平台优势**:提供设备物模型、数据可视化等组件,为项目提供直观的数据展示平台。 # 项目安装说明 1. 将七合一土壤传感器的**VCC**和**GND**连接至开发板的5V与GND,为传感器供电。 2. 将传感器的**RS485A**和**RS485B**连接至开发板的RS485接口,用于数据传输。 ![主板.jpg](https://oss-club.rt-thread.org/uploads/20240913/4aea359c2cd3b1455a0fca919b28456e.jpg.webp) 3. 在终端启动WIFI连接程序和阿里云连接程序。 4. 将传感器埋入距地面20至30公分的土壤中。 5. 打开阿里云平台,即可观察到传感器上报的数据。 ![云平台.png](https://oss-club.rt-thread.org/uploads/20240913/16a7f9f5e9709016135a876bdc750438.png.webp) # 设计思路 1. **数据采集分析**:确定采集的土壤数据类型,由七合一土壤传感器负责采集并通过RS485总线传输。 2. **数据传输设计**:主控自检设备后开始采集数据,经传感器采集后传输至主控处理,再通过WiFi/4G模块发送至云平台。 3. **程序设计**:利用RT-thread实时操作系统创建多个线程,分别负责数据采集、网络连接和数据传输等任务,实现线程间通信。 查询命令发送线程: ```c /* char read_TemHumECPh[8] = {0x01,0x03,0x00,0x06,0x00,0x04,0xA4,0x08};//读取温湿度ec值和ph的命令 char read_NPK[8] = {0x01,0x03,0x00,0x1E,0x00,0x03,0x65,0xCD};//读取氮磷钾含量的命令 */ void serial_tx_thread_entry(void *parameter) { while(1) { rt_device_write(u3_dev, 0, read_TemHumECPh , 8);//发送读取温湿度ec值和ph的命令 rt_thread_mdelay(1000); rt_device_write(u3_dev, 0, read_NPK , 8);//发送读取氮磷钾值的命令 rt_thread_mdelay(1000); } } ``` 接收并且处理传感器数据线程: ```c void serial_rx_thread_entry(void *parameter) { int i = 0; char buffer; char rx_data[13] = {0}; while(1) { while(rt_device_read(u3_dev, 0, &buffer, 1) != 1){ rt_sem_take(&u3_rx_sem, RT_WAITING_FOREVER); //等待信号量 } rx_data[i] = buffer; //接收的数据装进数组里 i++; if (i == 11) { i = 0; if(rx_data[2] == 0x08){ sensor_data[0] = (float)(rx_data[3] << 8 | rx_data[4]); //将温度值装进数组 sensor_data[1] = (float)(rx_data[5] << 8 | rx_data[6]); //将湿度值装进数组 sensor_data[2] = (float)(rx_data[7] << 8 | rx_data[8]); //将EC值装进数组 sensor_data[3] = (float)(rx_data[9] << 8 | rx_data[10]); //将ph值装进数组 } else if (rx_data[2] == 0x06) { //将氮磷钾含量值装进数组 sensor_data[4] = (float)(rx_data[3] << 8 | rx_data[4]); sensor_data[5] = (float)(rx_data[5] << 8 | rx_data[6]); sensor_data[6] = (float)(rx_data[7] << 8 | rx_data[8]); } } } } ``` mqtt连接线程: ```c static int example_publish(void *handle) { int res = 0; const char *fmt = "/sys/%s/%s/thing/event/property/post"; char *topic = NULL; int topic_len = 0; char *method = "thing.service.property.set"; char *id = "1541285507"; int soilpotassiumcontent = (int)sensor_data[6]; float soilTemperature = sensor_data[0]/100; int soilEC = (int)sensor_data[2]; int soilnitrogencontent = (int)sensor_data[4]; float soilHumidity = sensor_data[1]/100; float Latitude = 9; float Longitude = 8; float soilPH = sensor_data[3]/100; int soilphosphoruscontent = (int)sensor_data[5]; char *version = "1.0.0"; //将传感器数据装载进json报文中 sprintf(payload, "{\"method\":""\"%s\"," "\"id\":\"%s\"," "\"params\":" "{\"soilpotassiumcontent\":%d," "\"soilTemperature\":%.1f," "\"soilEC\":%d," "\"soilnitrogencontent\":%d," "\"soilHumidity\":%.1f," "\"GeoLocation\":{\"Latitude\":%.1f,\"Longitude\":%.1f}," "\"soilPH\":%.1f," "\"soilphosphoruscontent\":%d}," "\"version\":\"%s\"}", method, id, soilpotassiumcontent, soilTemperature, soilEC, soilnitrogencontent, soilHumidity, Latitude, Longitude, soilPH, soilphosphoruscontent, version); topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1; topic = HAL_Malloc(topic_len); if (topic == NULL) { EXAMPLE_TRACE("memory not enough"); return -1; } memset(topic, 0, topic_len); HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME); res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, payload, strlen(payload)); //mqtt发送报文 if (res < 0) { EXAMPLE_TRACE("publish failed, res = %d", res); HAL_Free(topic); return -1; } HAL_Free(topic); return 0; } ``` 再就是WiFi连接就是rw007软件包自带的一个msh命令,连上WiFi.再连接mqtt就OK了。 4. **硬件升级与网络通信**:预留其他传感器接口,具备网络通信功能,支持远程OTA系统升级。 # 设计重点难点 1. **环境适应性**:鉴于野外工作环境,设备需具备高防水防尘性能(IP68等级),并设计休眠唤醒功能以节省能源。 2. **数据报文解析**:传感器使用RS485协议和工业modbus总线报文,需设计算法提取有效数据。 3. **网络协议实现**:通过MQTT协议连接云平台,需填写设备三元组信息,并利用订阅、属性上报等命令更新数据。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
小夏同学
这家伙很懒,什么也没写!
文章
5
回答
0
被采纳
0
关注TA
发私信
相关文章
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部