Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[第3期 空气质量分析仪]第3周作业
发布于 2019-11-01 20:14:03 浏览:1234
订阅该版
* 本帖最后由 韧明 于 2019-11-1 20:14 编辑 * 1. Mylog的实现: 这个大家已经说得很清楚了。我需要强调的是,内存的申请和释放,需要额外留意。有的帖子申请了内存,但是在使用后没有及时释放;有的帖子在mylog函数内声明了局部变量然后将地址通过邮件发送出去,这样如果该内存位置被修改了,那么传送的数据就不对了。 此外,指针的操作需要小心,比如调用rt_mb_recv的时候,实际上是需要传送指向结构体的指针的指针的,这个想清楚了就不会有太大问题。代码如下: mylog.c: ```#include
#include
#include "mylog.h" rt_mailbox_t mb_log ; rt_thread_t th_mylog ; void mylog_entry(void * para){ mylogMsg * p_mylogMsg ; while(1){ if( rt_mb_recv(mb_log, (rt_ubase_t *)&p_mylogMsg, RT_WAITING_FOREVER) == RT_EOK) { rt_kprintf("[%s]:%d
", p_mylogMsg->tag, p_mylogMsg->data); rt_free(p_mylogMsg) ; } rt_thread_mdelay(100); } } void mylog_init(void){ rt_err_t result ; mb_log = rt_mb_create("mylog", 32, RT_IPC_FLAG_FIFO); if(mb_log == RT_NULL){ rt_kprintf("mylog mailbox creating failed"); return; } th_mylog = rt_thread_create("mylog", mylog_entry, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/2 - 2, 50); rt_thread_startup(th_mylog); } void mylog(char * tag, rt_uint32_t data){ mylogMsg * p_mylogMsg = (mylogMsg * )rt_malloc(sizeof(mylogMsg)) ; p_mylogMsg->tag = tag ; p_mylogMsg->data = (void *)data ; if( rt_mb_send(mb_log, (rt_ubase_t)p_mylogMsg) != RT_EOK){ rt_free(p_mylogMsg); } }``` mylog.h ```#ifndef MY_LOG_H #define MY_LOG_H #include
typedef struct msg{ char * tag ; void * data ; }mylogMsg ; void mylog_init(void); void mylog(char * tag, rt_uint32_t data); #endif```2. 事件集的使用: 事件集具体参考官方文档,说是像信号量但是要重点理解其中的区别。比如Flag选项中是有"Clear"选项的,什么时候用什么时候不用应该要结合具体的应用而定。 我的stm32f407 discovery开发板只有一个用户按键,所以实现了切换:按奇数次的时候温湿度采集功能;偶数次的时候去读取GP2Y模块。代码如下: key.c:按键使用信号量来做了简单的防抖 ```#include "key.h" #include "event_def.h" #define KEY_PIN GET_PIN(A, 0) rt_int8_t key_cnt = 0; rt_sem_t key_sem ; rt_thread_t key_th ; void key_cb(void * args){ rt_sem_release(key_sem); } void key_th_entry(void * para){ while(1){ rt_sem_take(key_sem, RT_WAITING_FOREVER); rt_thread_mdelay(20); if(rt_pin_read(KEY_PIN) == PIN_HIGH){ key_cnt +=1 ; key_cnt %= 2 ; } if(key_cnt){ rt_event_send(ev_sensors_leds, EVENT_SHT31_ON); rt_event_send(ev_sensors_leds, EVENT_PM25_OFF); }else{ rt_event_send(ev_sensors_leds, EVENT_PM25_ON); rt_event_send(ev_sensors_leds, EVENT_SHT31_OFF); // no else needed here rt_thread_mdelay(200); } } } void key_init(void){ rt_pin_mode(KEY_PIN, PIN_MODE_INPUT); rt_pin_attach_irq(KEY_PIN, PIN_IRQ_MODE_RISING_FALLING, key_cb, RT_NULL); rt_pin_irq_enable(KEY_PIN, PIN_IRQ_ENABLE); key_sem = rt_sem_create("key", 0, RT_IPC_FLAG_FIFO); key_th = rt_thread_create("key", key_th_entry, RT_NULL, 512, 16, 100); rt_thread_startup(key_th); }``` event_def.h ```#ifndef EVENT_DEF_H #define EVENT_DEF_H #include
#define EVENT_SHT31_ON 0x00000001 #define EVENT_PM25_ON 0x00000002 #define EVENT_SHT31_OFF 0x00000004 #define EVENT_PM25_OFF 0x00000008 extern rt_event_t ev_sensors_leds ; #endif```temp_humi_th.c ```#include "temp_humi_th.h" #include
#include "mylog.h" #include "event_def.h" #include "led_alert.h" sht3x_device_t sht31_dev ; rt_thread_t thread_sht31 ; float temperature, humidity ; void temp_humi_entry(void * parameter) { rt_uint32_t e = 0; rt_uint8_t on = 0; while(1) { if(rt_event_recv(ev_sensors_leds, EVENT_SHT31_OFF | EVENT_SHT31_ON, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR , 50, &e) == RT_EOK){ if(e & EVENT_SHT31_ON){ on = 1 ; } else{ on = 0 ; } } if(on){ sht3x_read_singleshot_temperature_and_humidity(sht31_dev, &temperature, &humidity); mylog("temp", (int)temperature); led_on(LED1_PIN); rt_thread_mdelay(100); if(temperature < 25){ led_off(LED1_PIN); rt_thread_mdelay(100); led_on(LED1_PIN); rt_thread_mdelay(100); led_off(LED1_PIN); }else{ rt_thread_mdelay(200); } } else{ led_off(LED1_PIN); rt_thread_mdelay(300); } rt_thread_mdelay(650); } } void temp_humi_init(void) { sht31_dev = sht3x_init("i2c1", SHT3X_ADDR_PD, SHT3X_REPETABILITY_MEDIUM); thread_sht31 = rt_thread_create("SHT31", temp_humi_entry, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/2 - 2, 100); if(sht31_dev != RT_NULL && thread_sht31 != RT_NULL){ rt_thread_startup(thread_sht31); } }``` pm25_th.c ```#include "pm25_th.h" #include "stdio.h" #include "mylog.h" #include "event_def.h" #include "led_alert.h" #define PM25_DENSITY_THRESHOLD 1 rt_thread_t thread_pm25 ; float pm25_voltage = 0.0f ; float pm25_density =0.0f ; void pm25_entry(void * parameters) { rt_uint8_t on_pm25 = 0 ; rt_uint32_t e_pm25 = 0 ; while(1) { if(rt_event_recv(ev_sensors_leds, EVENT_PM25_ON | EVENT_PM25_OFF, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 50, &e_pm25) == RT_EOK){ if(e_pm25 & EVENT_PM25_ON){ on_pm25 = 1 ; }else{ on_pm25 = 0 ; } } if(on_pm25){ pm25_density = gp2y_read_pm25(&pm25_voltage); mylog("pm25", (int)(pm25_density * 1000)); led_on(LED2_PIN); rt_thread_mdelay(100); if(pm25_density * 1000 < PM25_DENSITY_THRESHOLD){ led_off(LED2_PIN); rt_thread_mdelay(100); led_on(LED2_PIN); rt_thread_mdelay(100); led_off(LED2_PIN); }else{ rt_thread_mdelay(200); } }else{ led_off(LED2_PIN); rt_thread_mdelay(300); } rt_thread_mdelay(650); } } void pm25_init(void) { if( gp2y_hw_init() == RT_EOK){ thread_pm25 = rt_thread_create("PM2-5", pm25_entry, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/2 - 1, 1) ; if(thread_pm25 != RT_NULL){ rt_thread_startup( thread_pm25) ; } } } ``` 就是这些啦,做得还是比较粗糙。SHT3x的驱动一直没空仔细做,是不是以后做完善了可以加入packages里面呢?哈哈哈,等公司的项目忙完去仔细折腾一下,也许SHT3X系列在将来才会慢慢铺开推广。 非常感谢RTT的这次训练营的机会,以前只看视频毕竟没有实操,动动手很有用!
查看更多
1
个回答
默认排序
按发布时间排序
韧明
2019-11-26
这家伙很懒,什么也没写!
Update: 已经解决了SHT3x的湿度读取问题了,需要加入等待,因为在single-shot模式下SHT3x需要时间才能读出温湿度的结果,所以加入等待延迟,线程让出个几毫秒就可以了。 抽空仿照SHT2x做了SHT3x的驱动包,有需要的同学可以用起来哦,欢迎给我star,哈哈哈: [https://github.com/donghao2nanjing/sht3x](SHT3x package)
撰写答案
登录
注册新账号
关注者
0
被浏览
1.2k
关于作者
韧明
这家伙很懒,什么也没写!
提问
5
回答
7
被采纳
1
关注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
freemodbus主机在freertos的适配,参考rtthread例程
2
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
3
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
4
RT-Thread EtherKit开源以太网硬件正式发布
5
如何在master上的BSP中添加配置yml文件
热门标签
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
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
12
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部