Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[第3期 空气质量分析仪]第3周作业
发布于 2019-10-29 20:57:57 浏览:946
订阅该版
* 本帖最后由 RTT_猪pi皮皮 于 2019-10-29 21:06 编辑 * 这一周主要是把前面模块驱动后加上IPC使用,让数据打印更好地运行,减少出错。 1、实现异步日志 这个任务主要是对邮箱使用,用mylog替换rt_kprintf,用rt_kprintf("[%s] data is:%d
",xx, xxx); 刚刚开始看到确实是有点懵的,由于我平时写代码对结构体和指针使用较少,导致我在这一方面的意识有点欠缺,所以反应不过来。我还是从文档开始,一步一步地写,到最后就卡在了打印那里,不过在群里其他人的提醒下也意识到了要使用结构体去装数据,所以很快把问题解决了。 ```int mylog_init() { rt_err_t mb_init; rt_thread_t mylog_init; mb_init = rt_mb_init(&mb, "mbt", /* 名称是 mbt */ &mb_pool[0], /* 邮箱用到的内存池是 mb_pool */ sizeof(mb_pool) / 4, /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */ RT_IPC_FLAG_FIFO); /* 采用 FIFO 方式进行线程等待 */ if (mb_init != RT_EOK) { rt_kprintf("init mailbox failed.
"); return -1; } mylog_init = rt_thread_create("mylog", mylog_thread_entry, RT_NULL, 1024, RT_THREAD_PRIORITY_MAX / 2, 20); if(mylog_init != RT_NULL) { rt_thread_startup(mylog_init); } return RT_EOK; } void mylog(char *TAG,struct msgtext* para) //日志打印,使用结构体储存多种类型数据 { mb_send_str = (struct msgtext*)rt_malloc(sizeof(struct msgtext)); mb_send_str->data_ptr = TAG; mb_send_str->data1 = para->data1; mb_send_str->data2 = para->data2; mb_send_str->data3 = para->data3; mb_send_str->flag = para->flag; rt_mb_send(&mb,(rt_ubase_t)mb_send_str); } void mylog_thread_entry(void* parameter) { while(1) { if(rt_mb_recv(&mb,(rt_ubase_t *)&str,RT_WAITING_FOREVER) == RT_EOK) { if(str->flag == 1) rt_kprintf("[%s] temperature:%d\t humidity:%d
",str->data_ptr,str->data1,str->data2); if(str->flag == 2) rt_kprintf("[%s] air quality:%d
",str->data_ptr,str->data1); if(str->flag == 3) rt_kprintf("[%s] PPB:%d
",str->data_ptr,str->data1); rt_free(str); } } }``` 2、系统跑起来 这一部分主要是对事件的使用,硬件由于板子只有两个按键,所以就相应操作PM2.5和温湿度传感器,主要思路先创建一个事件,设置各个传感器的标志位,标志位由一个线程进行事件发送,另一个线程进行事件接收,接收到相应标志位唤醒线程进行相应操作,读取数据,由led灯进行指示,设置一定的阈值,超出则报警,标志位的发送由按键触发中断进行控制,控制事件发送。```/*******事件初始化******/ rt_err_t result; result = rt_event_init(&event,"event",RT_IPC_FLAG_FIFO); if (result != RT_EOK) { rt_kprintf("init event failed.
"); return -1; } /********PM2.5驱动及事件发送*******/ while(!ret) { if(pm25_flag == PM25_ON){ rt_pin_write(GP2Y_LED_PIN,PIN_LOW); rt_hw_us_delay(280); /* 读取采样值 */ value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); rt_hw_us_delay(40); rt_pin_write(GP2Y_LED_PIN,PIN_HIGH); rt_thread_mdelay(9); rt_hw_us_delay(680); /* 转换为对应电压值 */ vol = value * REFER_VOLTAGE / CONVERT_BITS; /*电压值转化为PM2.5的值*/ PM25_vol = 5000*vol/29 - 3000/29; airdata->data1 = PM25_vol/100; //取整 /*****设置报警阈值****/ if(airdata->data1 >= 100) pm25_alert = 2; else pm25_alert = 1; /*****打印数据发送***/ airdata->flag = 2; mylog("GP2Y",airdata); /*****发送事件*****/ rt_event_send(&event,EVENT_PM25); } rt_thread_delay(150); } /********温湿度读取及事件发送***********/ while (1) { if (dht11_flag == TEMP_HUMI_ON) { res = rt_device_read(dev, 0, &sensor_data, 1); if (res != 1) { rt_kprintf("read data failed! result is %d
", res); rt_device_close(dev); return; } else { if (sensor_data.data.temp >= 0) { DHT11->flag = 1; DHT11->data1 = (sensor_data.data.temp & 0xffff) >> 0; // get temp DHT11->data2 = (sensor_data.data.temp & 0xffff0000) >> 16; // get humi mylog("DHT11",DHT11); if(DHT11->data1 <= 25) temp_humi_alert = 2; else temp_humi_alert = 1; rt_event_send(&event,EVENT_TEMP); } } } rt_thread_delay(150); } /******led线程入口:事件接收,根据对应标志位先选择对应的灯闪烁或者报警********/ void led_entry(void *parameter) { rt_uint32_t e; while(1) { if(rt_event_recv(&event, (EVENT_TEMP | EVENT_PM25), RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &e) == RT_EOK) { if(temp_humi_alert == 2)led_on(EVENT_TEMP); else if(temp_humi_alert == 1)led_blink(EVENT_TEMP); if(pm25_alert == 2)led_on(EVENT_PM25); else if(pm25_alert == 1) led_blink(EVENT_PM25); } if(dht11_flag == TEMP_HUMI_OFF){ led_off(EVENT_TEMP); temp_humi_alert = 0; } rt_thread_mdelay(10); } }``` ![mylog.png](https://oss-club.rt-thread.org/uploads/201910/29/205736qo2527t0tto2s6t6.png)
查看更多
2
个回答
默认排序
按发布时间排序
CWXV_4192
2019-10-29
这家伙很懒,什么也没写!
使用的mb_send_str这个变量是全局变量吧!这里可以使用局部变量:)
RTT_猪pi皮皮
2019-10-30
这家伙很懒,什么也没写!
>使用的mb_send_str这个变量是全局变量吧!这里可以使用局部变量 --- 可以呀
撰写答案
登录
注册新账号
关注者
0
被浏览
946
关于作者
RTT_猪pi皮皮
这家伙很懒,什么也没写!
提问
5
回答
9
被采纳
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
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
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
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
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部