Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[第二期 空气质量分析仪]第2周作业
发布于 2019-09-05 23:53:35 浏览:1072
订阅该版
* 本帖最后由 Zachary 于 2019-9-6 00:09 编辑 * [align=center]**完成各传感器驱动、创建相应的线程** **1、PM2.5** 本作业中,使用GP2Y1010传感器,该传感器是一种光学灰尘浓度传感器。传感器内部成对角分布的红外发光二极管和光电晶体管,利用光敏原理来工作。用于检测特别细微的颗粒,如香烟颗粒、细微灰尘。依靠输出脉冲的高度来判断颗粒浓度。GP2Y1010传感器通过接收MCU发送的脉冲,来输出模拟电压值。脉冲发送周期为10ms,其中高电平时间为0.32ms,低电平时间为9.68ms,如下图所示。![gp2y检测周期.png](/uploads/201909/05/234903zga00xq0ups7x4as.png) STM32CubeMX配置如图所示![CubeMX ADC配置.png](/uploads/201909/06/000714cvovzoov2izzmsi2.png) Kconfig文件配置如下: [align=center]![Kconfig.png](/uploads/201909/06/000714nq3q440qm3mme70v.png) 驱动代码如下static void read_pm25_entry(void *parameter){ rt_uint8_t i=0; float dust = 0.0f; rt_uint16_t dust1,dust2; for(;;) { for(i = 0; i < 6; i++) { rt_pin_write(PM25_LED_PIN,PIN_LOW); rt_hw_us_delay(280); /* 读取AD值 */ pm25_value += rt_adc_read(pm25_adc_dev,PM25_DEV_CHANNEL); rt_hw_us_delay(40); rt_pin_write(PM25_LED_PIN,PIN_HIGH); rt_thread_mdelay(9);rt_hw_us_delay(680); //rt_kprintf("PM2.5 ADC Value is : %d
",pm25_value); } pm25_value /= 5; /* 电压转换 */ pm25_vol = pm25_value * PM25_REF_VOLTAGE / CONVERT_BITS; //rt_kprintf("PM2.5 Voltage is : %d.%02d
",pm25_vol / 100,pm25_vol % 100); dust = ((0.17f * pm25_vol - 0.1f) * 100000); dust1 = dust / 100; dust2 = (rt_uint16_t)(dust) % 1000; LCD_ShowNum(82,224,dust1,3,24); LCD_ShowNum(130,224,dust2,3,24); rt_thread_delay(1000); }}static int adc1_in7_init(void){ rt_pin_mode(PM25_LED_PIN,PIN_MODE_OUTPUT); rt_pin_write(PM25_LED_PIN,PIN_LOW); pm25_adc_dev = (rt_adc_device_t)rt_device_find(PM25_DEVICE_NAME); if(pm25_adc_dev == RT_NULL) { rt_kprintf("ADC Run Failed! Can not Find %s Device
",PM25_DEVICE_NAME); return RT_ERROR; } pm25_ret = rt_adc_enable(pm25_adc_dev,PM25_DEV_CHANNEL); return pm25_ret;}INIT_COMPONENT_EXPORT(adc1_in7_init); static int pm25_sample(void){ static rt_thread_t thread15 = RT_NULL; thread15 = rt_thread_create("pm2.5", read_pm25_entry, RT_NULL, 1024, 15, 20); if(thread15 != RT_NULL) { rt_thread_startup(thread15); } return RT_EOK;}INIT_APP_EXPORT(pm25_sample); **2、MQ-135** MQ-135传感器是一款气敏型传感器,该传感器需要上电预热,测量的值才准确。在本作业中,我们根据读取到的AD值来判断空气质量的好坏,小于1200的空气质量极好,处于1200到2400的空气质量好,大于2400的空气质量差,在LCD液晶屏幕上显示Air Quality : Excellent(Good or Bad)。由于该传感器也是读取模拟电压类传感器,因此,STM32CubeMX配置和Kconfig配置和PM2.5一样,唯一不同的是MQ-135使用ADC1 通道5,而PM2.5使用ADC1 通道7。menuconfig同上。static void mq135_entry(void *parameter){ rt_uint8_t i; for(;;) { for(i = 0;i < 4; i++) { value = rt_adc_read(adc_dev,ADC_DEV_CHANNEL); } value /= 3; vol = value * REF_VOLTAGE / CONVERT_BITS; if(value <= 1200) { LCD_ShowString(124,188,tftlcd_data.width,tftlcd_data.height,16,"Excellent"); } else if(value >1200 && value < 2400) { LCD_ShowString(124,188,tftlcd_data.width,tftlcd_data.height,16,"Good "); } else LCD_ShowString(124,188,tftlcd_data.width,tftlcd_data.height,16,"Bad "); rt_thread_delay(1000); }}/** * @brief adc1_in5_init 初始化函数 * @param 无 * @retval 无 */static int adc1_in5_init(void){ //此处代码省略,参照1中代码}INIT_COMPONENT_EXPORT(adc1_in5_init);static int mq135_sample(void){//限于篇幅过长,此处省略。}INIT_APP_EXPORT(mq135_sample); **3、FSMC-LCD** 由于板载液晶为240*480的LCD屏幕,故使用FSMC方式驱动,通过本人的一番折腾搞清楚了FSMC在RT-Thread中的使用。其实,没有什么难度,只不过配置有一点麻烦,我也是弄了好几次才成功。首先,你必须要有库版本或者寄存器版本的液晶驱动代码,主要是为了快速移植,当然你要是想自己写也可以。其次,我们要搞清楚自己板载液晶管脚的使用情况,查看原理图即可。第三,我们需要利用STM32CubeMX来快速配置初始化代码。我的配置如图所示。千万要搞清楚LCD寄存器和数据位数,memorytype重要选择LCD interace。配置完成后,生成代码即可。因为在menuconfig中并没有找到FSMC相关设备,因此,不需要配置menuconfig。随后,我们添加相关代码到工程中(stm32f4xx_hal_sram.c和stm32f4xx_ll_fsmc.c),如下图。 ![TIM截图20190905232029.png](/uploads/201909/06/000840zz4ndd12nf23u4f4.png)![FSMC-LCD.png](/uploads/201909/06/000840y2e7uvuz0nux2ef2.png)![hal.png](/uploads/201909/06/000840z7wf4xxdn76fcxff.png) 将stm32f4xx_hal_msp.c中的FSMC初始化代码拷贝到液晶驱动.c文件中,与液晶一起初始化,如下。液晶的GPIO初始化不要移动,在stm32f4xx_hal_msp.c中即可。static void MX_FSMC_Init(void){ FSMC_NORSRAM_TimingTypeDef Timing = {0}; FSMC_NORSRAM_TimingTypeDef ExtTiming = {0}; //本代码由CubeMX自动生成,此处省略…… if (HAL_SRAM_Init(&hsram1, &Timing, &ExtTiming) != HAL_OK) { rt_kprintf("LCD FSMC Init Failed!
"); }} int TFTLCD_Init(void){ MX_FSMC_Init(); ……}INIT_APP_EXPORT(TFTLCD_Init);//初始化LCD和FSMC移植的时候可能会出现延时函数不匹配,我们只需替换为rt-thread中的延时函数即可,一种是直接查找替换,另一种是运用define来替换。**4、成果演示** ![1.png](/uploads/201909/06/000543fsr0rw2qj2qj0mq4.png)
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
Zachary
这家伙很懒,什么也没写!
提问
4
回答
1
被采纳
0
关注TA
发私信
相关问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
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 Vision Board - Bare Metal Project with VSCode/PyOCD/Cortex-Debug
2
【学习分享】libc切换 -- 从newlib切换到mlibc
3
FRDM-MCXN947开发板之i2c应用
4
esp32 s3使用cherryusb cdc
5
【Vision Board 创客营】Vision Board上的DAC实践
热门标签
RT-Thread Studio
串口
LWIP
SPI
Env
Bootloader
AT
ART-Pi
Hardfault
CAN总线
FinSH
USB
文件系统
DMA
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
cubemx
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
编译报错
socket
keil_MDK
GD32
MicroPython
msh
Debug
ulog
SFUD
flashDB
SDIO总线
rt_mq_消息队列_msg_queue
本月问答贡献
用户名由3_15位
19
个答案
3
次被采纳
xiaorui
7
个答案
3
次被采纳
sakumisu
4
个答案
3
次被采纳
踩姑娘的小蘑菇
15
个答案
2
次被采纳
三世执戟
32
个答案
1
次被采纳
本月文章贡献
比特饼干
3
篇文章
8
次点赞
Z_Y
2
篇文章
5
次点赞
Alipay
2
篇文章
3
次点赞
xusiwei1236
2
篇文章
3
次点赞
yinxiangxv
2
篇文章
3
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部