[活动专区] 【AT-START-F425测评】+ 数字式传感器的检测驱动

[复制链接]
 楼主| jinglixixi 发表于 2022-3-18 01:02 | 显示全部楼层 |阅读模式
数字式传感器有传感器有许多种,如温湿度传感器、大气压传感器及光照强度传感器等,这些传感器的特点就是无需对检测值进行校正和标定处理,可谓是即读即用型。对于这类传感器的使用,无需A/D转换器的配合就可实现数据的检测。尽管此类传感器所用的数据传送方式有所不同,如有的是使用I2C接口,有的是使用单总线。但模拟处理的方式下,它们可以被一视同仁的看待,所相应的就是GPIO口和相应的延时函数的配合。因此它能够无视处于何种硬件芯片下,只需简单的修改即可在环境下工作。
在使用AT-START-F425开发板的条件下,由于在它的开发环境下已提供了大量的GPIO口及ms级和us级的延时函数,故可以轻松地实现温湿度传感器DHT22、大气压传感器BMP085及光照强度传感器BH1750等的驱动。
在OLED显示屏的配合下,其检测效果见图1至图3所示。
                              
1.jpg
图1 光照强度检测

2.jpg
图2 光照强度与温湿度检测

3.jpg
图3 多个传感器检测
以单总线的DHT22温湿度传感器的驱动为例,它与开发板的连接关系为:
out --- PB7
输出高低电平的语句定义为:
#define DHT22_D0_H  GPIOB->scr = GPIO_PINS_7
#define DHT22_D0_L  GPIOB->clr = GPIO_PINS_7
读取语句的定义为:
#define DHT22_D0_R  gpio_input_data_bit_read(GPIOB, GPIO_PINS_7)
引脚功能的配置与初始化函数为:
  1. uint8_t DHT22_Init(void)
  2. {
  3. gpio_init_type gpio_init_struct;
  4. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  5. gpio_default_para_init(&gpio_init_struct);
  6. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7. gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  8. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  9. gpio_init_struct.gpio_pins = GPIO_PINS_7;
  10. gpio_init(GPIOB, &gpio_init_struct);
  11. DHT22_Rst();
  12. return DHT22_Check();
  13. }

输入输出模式设置函数:
  1. void DHT22_IO_IN()
  2. {
  3. gpio_init_type gpio_init_struct;
  4. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  5. gpio_default_para_init(&gpio_init_struct);
  6. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  8. gpio_init_struct.gpio_pins = GPIO_PINS_7;
  9. gpio_init_struct.gpio_pull = GPIO_PULL_UP; //GPIO_PULL_DOWN
  10. gpio_init(GPIOB, &gpio_init_struct);
  11. }

  12. void DHT22_IO_OUT()
  13. {
  14. gpio_init_type gpio_init_struct;
  15. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  16. gpio_default_para_init(&gpio_init_struct);
  17. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  18. gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  19. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  20. gpio_init_struct.gpio_pins = GPIO_PINS_7;
  21. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  22. gpio_init(GPIOB, &gpio_init_struct);
  23. }

单总线的数据读取函数为:
  1. uint8_t DHT22_Read_Bit(void)
  2. {
  3. uint8_t retry=0;
  4. while(DHT22_D0_R&&retry<100)
  5. {
  6. retry++;
  7. delay_us(2);
  8. }
  9. retry=0;
  10. while(!DHT22_D0_R&&retry<100)
  11. {
  12. retry++;
  13. delay_us(2);
  14. }
  15. delay_us(40);
  16. if(DHT22_D0_R) return 1;
  17. else return 0;
  18. }

实现温湿度检测及显示主程序为:
  1. int main(void)
  2. {
  3. uint8_t  senflag;
  4. system_clock_config();
  5. at32_board_init();
  6. app_oled_init();
  7. senflag=DHT22_Init();
  8. OLED_Init();
  9. OLED_Clear();
  10. while(1)
  11. {
  12. DHT22_Read_Data(&tempera,&humidity);
  13. OLED_ShowString(0,0,"Temp:",16);
  14. OLED_ShowNum(40,0,tempera,2,16);
  15. OLED_ShowString(0,2,"Humi:",16);
  16. OLED_ShowNum(40,2,humidity,2,16);
  17. }
  18. }

因此,对于AT-START-F425这样的开发板要实现数字式传感器的驱动与检测是十分方便的。
豌豆爹 发表于 2022-3-23 09:51 来自手机 | 显示全部楼层
支持雅特力,支持国产芯片
 楼主| jinglixixi 发表于 2022-3-23 13:02 | 显示全部楼层
豌豆爹 发表于 2022-3-23 09:51
支持雅特力,支持国产芯片

您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2934

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部