Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[第二期 空气质量分析仪]第2周作业chua
发布于 2019-09-05 23:44:40 浏览:491
订阅该版
[align=center]**完成各传感器驱动、创建相应的线程** **1、PM2.5** 本作业中,使用GP2Y1010传感器,该传感器是一种光学灰尘浓度传感器。传感器内部成对角分布的红外发光二极管和光电晶体管,利用光敏原理来工作。用于检测特别细微的颗粒,如香烟颗粒、细微灰尘。依靠输出脉冲的高度来判断颗粒浓度。GP2Y1010传感器通过接收MCU发送的脉冲,来输出模拟电压值。脉冲发送周期为10ms,其中高电平时间为0.32ms,低电平时间为9.68ms,如下图所示。[attach]10720[/attach][attach]10718[/attach]STM32CubeMX配置如图所示[attach]10721[/attach]Kconfig文件配置如下:[attach]10720[/attach]驱动代码如下:/** * @brief void read_pm25_entry(void *parameter) 创建PM2.5线程 * @param 无 * @retval 无 */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); }}/** * @brief adc1_in5_init 初始化函数 * @param 无 * @retval 无 */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同上。 /** * @brief void mq135_entry(void *parameter) 创建MQ-135传感器线程 * @param 无 * @retval 无 */ static void mq135_entry(void *parameter){ rt_uint8_t i; for(;;) { for(i = 0;i < 4; i++) { /* 读取AD值 */ 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){ rt_thread_t thread14; thread14 = rt_thread_create("mq135", mq135_entry, RT_NULL, 1024, 14, 20); if(thread14 != RT_NULL) { rt_thread_startup(thread14); } return RT_EOK;}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),如下图。[attach]10722[/attach][attach]10721[/attach][attach]10723[/attach] 将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、成果演示** [attach]10724[/attach]
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
491
关于作者
Zachary
这家伙很懒,什么也没写!
提问
4
回答
1
被采纳
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
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部