Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
GP2Y10
【第三期 空气质量分析仪】第2周作业:AHT10+GP2Y1014AU+MQ135
发布于 2019-10-21 12:50:56 浏览:2255
订阅该版
第二周的任务包括以下几个部分: 1、完成温湿度应用模块,创建温湿度线程。 2、增加PM2.5传感器驱动,完成PM2.5应用模块,创建PM2.5 的线程。 3、选做:增加甲醛传感器驱动,完成甲醛应用模块,创建甲醛的线程。 第一温湿度应用: 潘多拉板子上自带的AHT10温湿度传感器,软件包里已经有现成的驱动,上周的任务已经在BSP中添加了这个驱动程序,只需要按照任务上的要求,在application 下创建 temp_humi_th.c文件中创建一个线程实现温湿度的打印功能就可以了。temp_humi_th.c的代码在下一楼,(帖子超出长度):![cd.jpg](/uploads/201910/21/125620qzyc4w6whfwqn9kn.jpg)在 main() 中调用 temp_humi_init()完成温湿度线程,可以在串口上看到打印出来的温湿度结果。第一个任务因为驱动是现成的,所以应用程序实现起来比较简单。 第二PM2.5应用: PM2.5传感器用的是GP2Y1014AU模块,关于这个模块本身知识就不介绍了,贴一个原理图: ![原理.jpg](/uploads/201910/21/121959l0yw3qqvnh2c3mwc.jpg) 在我的应用中,是用PC7控制LED,用PC2(ADC1的CHANNEL3)来读取传感器的输出电压,传感器供电用的是5V。由于使用到了ADC,因此需要加入ADC的驱动, 路径在menuconfig-->Hardware Drives Config-->On-chip PeripheralDrivers-->Enable ADC, 设置好保存退出后,还有一件事是不能漏掉,修改CubeMX工程文件,把PC2的功能设置成ADC输入,如果漏掉的话,一路不会提示任何错误,只是最终读出来电压永远低于0.02V,不要问我为什么知道,说多了都是泪。 按照任务文档上的要求,在`bsp\stm32\libraries\HAL_Drivers`目录下,创建 pm2.5 模块的驱动文件pm25.c 及相应的 .h 文件,正好弥补上周没有自己做AHT10的驱动遗憾。 pm25.c代码如下: ```c #include "rtthread.h" #include "rtdevice.h" #include "board.h" #include "pm25.h" rt_adc_device_t adc_dev; int gp2y_hw_init(void) { rt_err_t ret; rt_pin_mode(PM25_LED, PIN_MODE_OUTPUT); rt_pin_write(PM25_LED, PIN_HIGH); adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); if (adc_dev == RT_NULL) { rt_kprintf("adc sample run failed! can't find %s device!
", ADC_DEV_NAME); return RT_ERROR; } ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL); if(ret != RT_EOK) { rt_kprintf("adc enable failed!"); return ret; } return RT_EOK; } rt_uint32_t gp2y_read_pm25(void) { rt_err_t ret; rt_uint32_t value,vol; rt_pin_write(PM25_LED, PIN_LOW); rt_hw_us_delay(280); value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); rt_hw_us_delay(40); rt_pin_write(PM25_LED, PIN_HIGH); rt_thread_delay(680); vol = value * REFER_VOLTAGE / CONVERT_BITS; vol = vol*0.172 - 9.99; //AQI(mg/m3)= 0.172 *V (v) - 0.0999 ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL); if(ret != RT_EOK) { rt_kprintf("adc disable failed!"); return ret; } return vol; } ``` 这个驱动文件完成后,先不着急创建应用程序,去main()中调用一下gp2y_read_pm25()看看能不能读取到正确的值,这里可能要费点时间。如果能读取到电压,并且电压值能随空气中烟的变多而增加的话,那驱动就算完成了。 在 application 下创建 pm25_th.c,创建 pm2.5 的线程,这里就和第一步完成温湿度应用基本一致了,在应用程序中调用驱动文件,实现PM2.5值的打印。pm25_th.c的代码: ```c #include "pm25_th.h" #include "pm25.h" void pm25_init(void) { static rt_thread_t pm25_tid = RT_NULL; gp2y_hw_init(); pm25_tid = rt_thread_create("pm25_thread", pm25_entry, RT_NULL, PM25_THREAD_STACK_SIZE, PM25_THREAD_PRIORITY, PM25_THREAD_TIMESLICE); if (pm25_tid != RT_NULL) { rt_thread_startup(pm25_tid); } } void pm25_entry(void *parameter) { rt_uint32_t pm25_data; while(1) { pm25_data = gp2y_read_pm25(); rt_kprintf("PM2.5= %d.%02d mg/m3
",pm25_data/100,pm25_data%100); rt_thread_mdelay(500); } } ``` 第三甲醛应用,算然是选做任务,由于手里有MQ135模块,所以也一并做了,只要第二个PM2.5模块成功后,第三个应用几乎可以全部照搬第二个,除了ADC的输入的端口不一样外,其余没有差别。MQ135我用的是PC4(ADC1的CHANNEL13)。过程及不写了,附上驱动代码和应用代码。由于MQ135模块的输出电压和甲醛浓度的关系太复杂,所以程序中只把采样到的电压打印出来而已,并没有做任何转换。模块卖家的代码也是当电压大于某个值时,就点亮一个灯,代表甲醛浓度超标。forma.c代码: ```c #include "rtthread.h" #include "rtdevice.h" #include "board.h" #include "forma.h" rt_adc_device_t adc_dev_mq135; int mq135_hw_init(void) { rt_err_t ret; adc_dev_mq135 = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME_MQ135); if (adc_dev_mq135 == RT_NULL) { rt_kprintf("adc sample run failed! can't find %s device!
", ADC_DEV_NAME_MQ135); return RT_ERROR; } ret = rt_adc_enable(adc_dev_mq135, ADC_DEV_CHANNEL_MQ135); if(ret != RT_EOK) { rt_kprintf("adc enable failed!"); return ret; } return RT_EOK; } rt_uint32_t mq135_read_forma(void) { rt_err_t ret; rt_uint32_t value,vol; value = rt_adc_read(adc_dev_mq135, ADC_DEV_CHANNEL_MQ135); vol = value * REFER_VOLTAGE_MQ135 / CONVERT_BITS_MQ135; ret = rt_adc_disable(adc_dev_mq135, ADC_DEV_CHANNEL_MQ135); if(ret != RT_EOK) { rt_kprintf("adc disable failed!"); } return vol; } ``` forma_th.c代码: ```c #include "forma_th.h" #include "forma.h" void mq135_init(void) { static rt_thread_t mq135_tid = RT_NULL; mq135_hw_init(); mq135_tid = rt_thread_create("mq135_thread", mq135_entry, RT_NULL, MQ135_THREAD_STACK_SIZE, MQ135_THREAD_PRIORITY, MQ135_THREAD_TIMESLICE); if (mq135_tid != RT_NULL) { rt_thread_startup(mq135_tid); } } void mq135_entry(void *parameter) { rt_uint32_t mq135_data; while(1) { mq135_data = mq135_read_forma(); rt_kprintf("MQ135= %d.%02d V
",mq135_data/100,mq135_data%100); rt_thread_mdelay(500); } } ``` 三个模块都完成后,只要在主程序中,调用三个初始化函数就可以启动三个线程,主程序的大循环不能省,因为LED和KEY任务需要。因为不太懂线程之间是怎么切换的(内核知识),在三个线程的优先级一样的情况下,为什么感觉PM2.5线程运行的次数要比其他二个少,打印次数上可以体现。最后贴二张最终的运行结果图,一张是干净的空气值,一张是点了一张纸把烟笼罩传感器后的值。 ![无烟.jpg](/uploads/201910/21/123602htbh3uphihh8phi5.jpg) ![有烟.jpg](/uploads/201910/21/123606abbknxoi35gksoas.jpg)
查看更多
2
个回答
默认排序
按发布时间排序
xuchengzhu
2019-10-21
这家伙很懒,什么也没写!
[i=s] 本帖最后由 xuchengzhu 于 2019-10-21 13:05 编辑 [/i] #include "temp_humi_th.h" aht10_device_t dev; voidtemp_humi_init(void) { static rt_thread_t temp_humi_tid = RT_NULL; constchar *i2c_bus_name = "i2c4"; /* i2c bus station */ dev = aht10_init(i2c_bus_name); temp_humi_tid =rt_thread_create("temp_humi_thread", temp_humi_entry, RT_NULL, TEMP_HUMI_THREAD_STACK_SIZE, TEMP_HUMI_THREAD_PRIORITY, TEMP_HUMI_THREAD_TIMESLICE); if (temp_humi_tid != RT_NULL) { rt_thread_startup(temp_humi_tid); } } voidtemp_humi_entry(void *parameter) { float humidity, temperature; while (1) { humidity = aht10_read_humidity(dev); rt_kprintf("humidity :%d.%d %%\n", (int)humidity, (int)(humidity * 10) % 10); temperature = aht10_read_temperature(dev); rt_kprintf("temperature: %d.%d \n", (int)temperature,(int)(temperature * 10) % 10); rt_thread_mdelay(500); } }
Yishai
2024-03-06
这家伙很懒,什么也没写!
博主你好,我现在想驱动gp2y10,但是一直没数据,可以参考一下您的工程嘛😭
撰写答案
登录
注册新账号
关注者
0
被浏览
2.3k
关于作者
xuchengzhu
这家伙很懒,什么也没写!
提问
3
回答
5
被采纳
0
关注TA
发私信
相关问题
1
求助粉尘传感器GP2Y10使用工程
2
正点原子精英版(stm32f103zet6)+温湿度(DHT11)+PM2.5(GP2Y101...
推荐文章
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
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
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部