Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[第3期 空气质量分析仪]第二周作业--砍柴人三号
发布于 2019-10-25 23:32:26 浏览:698
订阅该版
**第3期 空气质量分析仪]第二周作业**一、 温湿度应用任务实现 在application文件下新建temp_humi_th.c和temp_humi_th.h,并在keil工程中的Applictions目录下添加temp_humi_th.c文件。代码如下: ```rt_thread_t temp_humi_thread; aht10_device_t aht10_dev; void temp_humi_entry(void *parameter) { float humi, temp; char buf[128]; temp = aht10_read_temperature(aht10_dev); sprintf(buf, "Temperature: %0.2f °C
", temp); rt_kprintf(buf); humi = aht10_read_humidity(aht10_dev); sprintf(buf, "Humidity: %0.2f
", humi); rt_kprintf(buf); rt_thread_mdelay(2000); } void temp_humi_init(void) { aht10_device_t aht10_dev; rt_thread_mdelay(10000); aht10_dev = aht10_init("i2c1"); if(aht10_dev == RT_NULL) { rt_kprintf("The temperature and humidity sensor initializes failure!
"); } temp_humi_thread = rt_thread_create("temp_humi", temp_humi_entry, RT_NULL, 1024, 5, 20); if(temp_humi_thread != RT_NULL) { rt_thread_startup(temp_humi_thread); } } ``` 二、 PM2.5任务实现选用的是GP2Y1026AU0F型号PM2.5传感器,传感器采用2400波特率的串口传输数据。数据由7个字节组成:[table=98%] [tr][td=89] 开始位 [/td][td=89]Vout(H)[/td][td=87]Vout(L)[/td][td=86]Vref(H)[/td][td=84]Vref(L)[/td][td=102]CheckSum[/td][td=88]结束位[/td][/tr] [tr][td=89] 0xaa [/td][td=89]0-0xff[/td][td=87]0-0xff[/td][td=86]0-0xff[/td][td=84]0-0xff[/td][td=102]0-0xff[/td][td=88]0xff[/td][/tr] [/table] CheckSum = Vout(H) + Vout(L) + Vref(H) +Vref(L)Vout = (Vout(H)*256 + Vout(L))/1024 * 5 (V)Dust_density = Vout * 0.35 (mg/m^3)例如:Vout(H)= 1,Vout(L)= 58时Vout = (1*256+58)/1024*5 = 1.533 VDust density = 1.533*0.35 = 0.5366 mg/m^3 由于采用串口通信,不用重新写驱动,直接从软件包选择UART1驱动。在application文件下新建pm25_th.c和pm25_th.h,并在keil工程中的Applictions目录下添加pm25_th.c文件。代码如下: ```#define PM25_UART_NAME "uart1" /* 串口设备名称 */ static rt_device_t pm25_serial; /* 串口设备句柄 */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */ static struct rt_semaphore pm25_rx_sem; /* 用于接收消息的信号量 */ rt_thread_t pm25_thread; void pm25_init(void) { /* step1:查找串口设备 */ pm25_serial = rt_device_find(PM25_UART_NAME); /* step2:打开串口设备。以中断接收及轮询发送模式打开串口设备 */ rt_device_open(pm25_serial, RT_DEVICE_FLAG_INT_RX); //rt_device_open(pm25_serial, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); /* step3:修改串口配置参数 */ config.baud_rate = BAUD_RATE_2400; //2400波特率 config.data_bits = DATA_BITS_8; //数据位 8 config.stop_bits = STOP_BITS_2; //停止位 2 config.parity = PARITY_NONE; //无奇偶校验位 /* step4:控制串口设备。通过控制接口传入命令控制字,与控制参数 */ rt_device_control(pm25_serial, RT_DEVICE_CTRL_CONFIG, &config); pm25_thread = rt_thread_create("gp2y_pm25", pm25_entry, RT_NULL, 1024, 3, 20); if(pm25_thread != RT_NULL) { rt_thread_startup(pm25_thread); } } static rt_err_t uart1_input(rt_device_t dev, rt_size_t size) { rt_sem_release(&pm25_rx_sem); return RT_EOK; } void pm25_entry(void *parameter) { unsigned char data[7] = {0}; char buf[64]; unsigned char i = 0; unsigned char temp; float dust_density = 0.0, Vout =0.0; /* 初始化信号量 */ rt_sem_init(&pm25_rx_sem, "pm25_rx_sem", 0, RT_IPC_FLAG_FIFO); rt_device_set_rx_indicate(pm25_serial,uart1_input); while (1) { while (rt_device_read(pm25_serial, -1, &temp, 1) != 1) { /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ rt_sem_take(&pm25_rx_sem, RT_WAITING_FOREVER); } if(temp == 0xaa) { i = 0; for(i = 0; i < 6; i++) { /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ while (rt_device_read(pm25_serial, -1, &data*, 1) != 1) { /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ rt_sem_take(&pm25_rx_sem, RT_WAITING_FOREVER); } if(i == 5) { rt_kprintf("PM2.5 UART1 Data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x
", 0xaa,data[0],data[1],data[2],data[3],data[4],data[5]); if((data[5] == 0xff) && (data[0]+data[1]+data[2]+data[3] == data[4])) //判读接受到的数据是否符合要求,第7个字节为0xff, 第6个字节为第2-5字节的和 { Vout = (float)(((float)data[0]*256 + data[1])/(1024))*5; //计算电压值 dust_density = Vout*0.35f; //计算PM2.5值,单位mg/m^3 sprintf(buf, "PM2.5:%0.4f mg/m^3 , Voltage: %0.4f V
", dust_density, Vout); rt_kprintf(buf); } else { rt_kprintf("PM2.5 data error!
"); } } } } rt_thread_mdelay(1000); } } ``` 为了解决在evn中menuconfig后会移除temp_humi_th.c和pm25_th.c,需要修改application目录下的Sconscript,修改后文件如下:```import rtconfig from building import * cwd = GetCurrentDir() CPPPATH = [cwd, str(Dir('#'))] src = Split(""" main.c temp_humi_th.c pm25_th.c """) group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) Return('group') ``` main.c代码如下: ```#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(void) { temp_humi_init(); pm25_init(); return RT_EOK; }``` 三、运行结果 论坛帖子提交不了图片,复制运行结果如下: ```Temperature: 25.50 °C Humidity: 29 PM2.5 UART1 Data: 0xaa 0x00 0x98 0x00 0x51 0xe9 0xff PM2.5:0.2598 mg/m^3 , Voltage: 0.7422 V PM2.5 UART1 Data: 0xaa 0x00 0x98 0x00 0x51 0xe9 0xff PM2.5:0.2598 mg/m^3 , Voltage: 0.7422 V Temperature: 25.50 °C Humidity: 29 PM2.5 UART1 Data: 0xaa 0x00 0x98 0x00 0x51 0xe9 0xff PM2.5:0.2598 mg/m^3 , Voltage: 0.7422 V PM2.5 UART1 Data: 0xaa 0x00 0x98 0x00 0x51 0xe9 0xff PM2.5:0.2598 mg/m^3 , Voltage: 0.7422 V Temperature: 25.50 °C Humidity: 29 PM2.5 UART1 Data: 0xaa 0x00 0x91 0x00 0x51 0xe2 0xff PM2.5:0.2478 mg/m^3 , Voltage: 0.7080 V PM2.5 UART1 Data: 0xaa 0x00 0x91 0x00 0x51 0xe2 0xff PM2.5:0.2478 mg/m^3 , Voltage: 0.7080 V Temperature: 25.50 °C Humidity: 29 PM2.5 UART1 Data: 0xaa 0x00 0x91 0x00 0x51 0xe2 0xff PM2.5:0.2478 mg/m^3 , Voltage: 0.7080 V PM2.5 UART1 Data: 0xaa 0x00 0x91 0x00 0x51 0xe2 0xff PM2.5:0.2478 mg/m^3 , Voltage: 0.7080 V ```
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
698
关于作者
nsdcwj
这家伙很懒,什么也没写!
提问
2
回答
0
被采纳
0
关注TA
发私信
相关问题
推荐文章
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组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部