789|0

41

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

航芯ACM32G103开发板评测 07 LVGL 温湿度环境数据显示 [复制链接]

 

本帖最后由 みずじ 于 2024-1-25 17:48 编辑

航芯ACM32G103开发板评测 07 LVGL 温湿度环境数据显示

参考移植教程

https://bbs.eeworld.com.cn/thread-1270136-1-1.html
https://bbs.eeworld.com.cn/thread-1270761-1-1.html

软硬件平台

  1. 航芯ACM32G103开发板
  2. 1.28寸圆形彩色TFT显示屏高清IPS 模块240X240 SPI接口 GC9A01驱动芯片
  3. DHT11 温湿度传感器
  4. LVGL V8.3.1源码

DHT11 温湿度传感器

DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。

更多DHT11信息请参考:https://baike.sogou.com/v73984313.htm?fromTitle=DHT11

下图为DHT11的引脚说明图,DATA引脚为信号输入输出。
DS18B20引脚说明

DHT11单总线传感器驱动

DHT11 整体工作时序为:主机发送开始信号、DHT11 响应输出、主机接收 40bit 数据(湿度数据+温度数据+校验值),结束信号(可选)。具体过程如下:

  1. 总线空闲状态为高电平,主机拉低总线等待 DHT11 响应, 主机把总线拉低必须大于 18ms,保证 DHT11 能检测到起始信号;
  2. 主机发送开始信号结束后,拉高总线电平并延时等待 20-40us 后,读取 DHT11 的响应信号;
  3. DHT11 接收到主机的开始信号后,等待微处理器开始信号结束,发送 80us 低电平响应信号;
  4. DHT11 发送 80us 高电平准备发送数据;
  5. DHT11 发送 40bit 数据(湿度数据+温度数据+校验值)。

起始及响应信号

主机拉低总线至少 18ms,然后再拉高总线,延时 20~40us,此时起始信号(有时也叫复位信号)发送完毕。
DHT11 检测到复位信号后,触发一次采样,并拉低总线 80us 表示响应信号,告诉主机数据已经准备好了。DHT11 之后拉高总线 80us,然后开始传输数据。如果检测到响应信号为高电平,则 DHT11 初始化失败,请检查线路是否连接正常。

读时序

DHT11 开始传输数据。每 1bit 数据都以 50us 低电平开始,告诉主机开始传输一位数据了。DHT11 以高电平的长短定义数据位是 0 还是 1:当 50us 低电平过后拉高总线,高电平持续 26~28us 表示 0,高电平持续 70us 表示数据 1。
当最后 1bit 数据传送完毕后,DHT11 拉低总线 50us,表示数据传输完毕,随后总线由上拉电阻拉高进入空闲状态。

位数据0表示方式:
以 50us 低电平开始,高电平持续 26~28us 表示 0。

位数据1表示方式:
以 50us 低电平开始,高电平持续 70us 表示 1。

驱动代码

  1. 端口初始化
  1. /*
  2. * 函数名:DHT11_GPIO_Config
  3. * 描述:配置DHT11用到的I/O口
  4. * 输入:无
  5. * 输出:无
  6. */
  7. static void DHT11_GPIO_Config ( void )
  8. {
  9. GPIO_InitTypeDefGPIO_InitStruct;
  10. /* Enable the GPIO Clock */
  11. DHT11_GPIO_CLK_ENABLE();
  12. GPIO_InitStruct.Pin = DHT11_Dout_GPIO_PIN;
  13. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  14. GPIO_InitStruct.Pull = GPIO_PULLUP;
  15. GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3;
  16. GPIO_InitStruct.Alternate = GPIO_FUNCTION_0;
  17. HAL_GPIO_Init(DHT11_Dout_GPIO_PORT, &GPIO_InitStruct);
  18. }
  19. /**
  20. * <a href="https://bbs.eeworld.com.cn/home.php?mod=space&uid=159083" target="_blank">@brief</a>DHT11 初始化函数
  21. * @param
  22. * @retval
  23. */
  24. void DHT11_Init ( void )
  25. {
  26. DHT11_GPIO_Config ();
  27. DHT11_Dout_1; // 拉高DHT11数据引脚
  28. }
  29. /*
  30. * 函数名:DHT11_Mode_IPU
  31. * 描述:使DHT11-DATA引脚变为上拉输入模式
  32. * 输入:无
  33. * 输出:无
  34. */
  35. static void DHT11_Mode_IPU(void)
  36. {
  37. GPIO_InitTypeDefGPIO_InitStruct;
  38. DHT11_GPIO_CLK_ENABLE();
  39. GPIO_InitStruct.Pin = DHT11_Dout_GPIO_PIN;
  40. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  41. GPIO_InitStruct.Pull = GPIO_PULLUP;
  42. GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3;
  43. GPIO_InitStruct.Alternate = GPIO_FUNCTION_0;
  44. HAL_GPIO_Init(DHT11_Dout_GPIO_PORT, &GPIO_InitStruct);
  45. }
  46. /*
  47. * 函数名:DHT11_Mode_Out_PP
  48. * 描述:使DHT11-DATA引脚变为推挽输出模式
  49. * 输入:无
  50. * 输出:无
  51. */
  52. static void DHT11_Mode_Out_PP(void)
  53. {
  54. GPIO_InitTypeDefGPIO_InitStruct;
  55. DHT11_GPIO_CLK_ENABLE();
  56. GPIO_InitStruct.Pin = DHT11_Dout_GPIO_PIN;
  57. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  58. GPIO_InitStruct.Pull = GPIO_PULLUP;
  59. GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3;
  60. GPIO_InitStruct.Alternate = GPIO_FUNCTION_0;
  61. HAL_GPIO_Init(DHT11_Dout_GPIO_PORT, &GPIO_InitStruct);
  62. }
  1. 从DHT11读取一个字节
  1. static uint8_t DHT11_ReadByte ( void )
  2. {
  3. uint8_t i, temp=0;
  4. for(i=0;i<8;i++)
  5. {
  6. /*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/
  7. while(DHT11_Dout_IN()==Bit_RESET);
  8. /*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
  9. *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
  10. */
  11. HAL_DelayUs(40); //延时x us 这个延时需要大于数据0持续的时间即可
  12. if(DHT11_Dout_IN()==Bit_SET)/* x us后仍为高电平表示数据“1” */
  13. {
  14. /* 等待数据1的高电平结束 */
  15. while(DHT11_Dout_IN()==Bit_SET);
  16. temp|=(uint8_t)(0x01<<(7-i));//把第7-i位置1,MSB先行
  17. }
  18. else // x us后为低电平表示数据“0”
  19. {
  20. temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
  21. }
  22. }
  23. return temp;
  24. }
  1. 温湿度数据获取函数
  1. /*
  2. * 一次完整的数据传输为40bit,高位先出
  3. * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
  4. */
  5. uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
  6. {
  7. /*输出模式*/
  8. DHT11_Mode_Out_PP();
  9. /*主机拉低*/
  10. DHT11_Dout_0;
  11. /*延时18ms*/
  12. HAL_DelayMs(18);
  13. /*总线拉高 主机延时30us*/
  14. DHT11_Dout_1;
  15. HAL_DelayUs(30); //延时30us
  16. /*主机设为输入 判断从机响应信号*/
  17. DHT11_Mode_IPU();
  18. /*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/
  19. if(DHT11_Dout_IN()==Bit_RESET)
  20. {
  21. /*轮询直到从机发出 的80us 低电平 响应信号结束*/
  22. while(DHT11_Dout_IN()==Bit_RESET);
  23. /*轮询直到从机发出的 80us 高电平 标置信号结束*/
  24. while(DHT11_Dout_IN()==Bit_SET);
  25. /*开始接收数据*/
  26. DHT11_Data->humi_int= DHT11_ReadByte();
  27. DHT11_Data->humi_deci= DHT11_ReadByte();
  28. DHT11_Data->temp_int= DHT11_ReadByte();
  29. DHT11_Data->temp_deci= DHT11_ReadByte();
  30. DHT11_Data->check_sum= DHT11_ReadByte();
  31. /*读取结束,引脚改为输出模式*/
  32. DHT11_Mode_Out_PP();
  33. /*主机拉高*/
  34. DHT11_Dout_1;
  35. /*检查读取的数据是否正确*/
  36. if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
  37. return SUCCESS;
  38. else
  39. return ERROR;
  40. }
  41. else
  42. return ERROR;
  43. }
  1. bsp_dht11.h
  1. #ifndef __BSP_DHT11_H
  2. #define __BSP_DHT11_H
  3. #include "main.h"
  4. typedef struct
  5. {
  6. uint8_thumi_int; //湿度的整数部分
  7. uint8_thumi_deci; //湿度的小数部分
  8. uint8_ttemp_int; //温度的整数部分
  9. uint8_ttemp_deci; //温度的小数部分
  10. uint8_tcheck_sum; //校验和
  11. }DHT11_Data_TypeDef;
  12. #define Bit_RESET 0
  13. #define Bit_SET 1
  14. #define DHT11_Dout_GPIO_PORT GPIOC
  15. #define DHT11_Dout_GPIO_PIN GPIO_PIN_5
  16. #define DHT11_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
  17. #define DHT11_Dout_0 HAL_GPIO_WritePin(DHT11_Dout_GPIO_PORT,DHT11_Dout_GPIO_PIN,GPIO_PIN_RESET)
  18. #define DHT11_Dout_1 HAL_GPIO_WritePin(DHT11_Dout_GPIO_PORT,DHT11_Dout_GPIO_PIN,GPIO_PIN_SET)
  19. #define DHT11_Dout_IN() HAL_GPIO_ReadPin( DHT11_Dout_GPIO_PORT, DHT11_Dout_GPIO_PIN )
  20. static void DHT11_GPIO_Config ( void );
  21. void DHT11_Init ( void );
  22. uint8_t DHT11_Read_TempAndHumidity ( DHT11_Data_TypeDef * DHT11_Data );
  23. #endif

案例测试

  1. 主函数
  1. /******************************************************************************
  2. *<a href="https://bbs.eeworld.com.cn/home.php?mod=space&uid=1307177" target="_blank">@File</a>: main.c
  3. *@brief : main program
  4. ******************************************************************************/
  5. #include "main.h"
  6. #include "lvgl_timer.h"
  7. LoopFunction loopFunction[MAX_INIT_FUNCTIONS];
  8. int loopFunctionCount = 0;
  9. void callInitFunctions(void){
  10. uint8_t i ;
  11. for(i = 0 ; i<loopFunctionCount;i++){
  12. loopFunction<i>();
  13. }
  14. }
  15. /******************************************************************************
  16. *@brief : main program
  17. *@param : none
  18. *@return: none
  19. ******************************************************************************/
  20. #include "lvgl.h"
  21. #include "lv_port_disp.h"
  22. #include "lv_port_indev.h"
  23. #include "lv_demo_widgets.h"
  24. #include "lv_examples.h"
  25. lv_obj_t *labe_temp;
  26. lv_obj_t *labe_humi;
  27. static void lv_ex_label_1(void)
  28. {
  29. /* Create a screen */
  30. lv_obj_t * scr = lv_obj_create(NULL);
  31. lv_scr_load(scr);
  32. lv_obj_set_style_bg_color(scr,lv_palette_main(LV_PALETTE_ORANGE),0);
  33. lv_obj_align(scr,LV_ALIGN_CENTER,0,0);
  34. /* Create a button */
  35. lv_obj_t * btn = lv_btn_create(scr);
  36. lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 40);
  37. /* Create a label for the button */
  38. lv_obj_t * label = lv_label_create(btn);
  39. lv_label_set_text(label, "Hello EEWORLD !");
  40. /* Create a button */
  41. lv_obj_t * btn1 = lv_btn_create(scr);
  42. lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 90);
  43. /* Create a label for the button */
  44. lv_obj_t * label1 = lv_label_create(btn1);
  45. lv_label_set_text(label1, "By End 2024.01.24!");
  46. /* Create a button */
  47. lv_obj_t * btn2 = lv_btn_create(scr);
  48. lv_obj_align(btn2, NULL, LV_ALIGN_CENTER, 140);
  49. /* Create a label for the button */
  50. lv_obj_t * label2 = lv_label_create(btn2);
  51. lv_label_set_text(label2, "ACM32G103-Board Testing");
  52. }
  53. lv_obj_t * chart;
  54. lv_chart_series_t * ser1;
  55. void lv_example_style_1(void)
  56. {
  57. lv_obj_t * scr = lv_obj_create(NULL);
  58. lv_scr_load(scr);
  59. lv_obj_set_style_bg_color(scr,lv_palette_main(LV_PALETTE_ORANGE),0);
  60. lv_obj_align(scr,LV_ALIGN_CENTER,0,0);
  61. /* Create simple label */
  62. lv_obj_t * label1 = lv_label_create(lv_scr_act());
  63. lv_obj_align(label1,LV_ALIGN_CENTER,0,-80);
  64. lv_label_set_text(label1, "Temperature");
  65. /* Create simple label */
  66. labe_temp = lv_label_create(lv_scr_act());
  67. lv_obj_align(labe_temp,LV_ALIGN_CENTER,0,-60);
  68. lv_label_set_text_fmt(labe_temp, "%d°C", 0) ;
  69. /* Create simple label */
  70. lv_obj_t * label2 = lv_label_create(lv_scr_act());
  71. lv_obj_align(label2,LV_ALIGN_CENTER,0,60);
  72. lv_label_set_text(label2, "Humidity");
  73. /* Create simple label */
  74. labe_humi = lv_label_create(lv_scr_act());
  75. lv_obj_align(labe_humi,LV_ALIGN_CENTER,0,80);
  76. lv_label_set_text_fmt(labe_humi, "%d%%", 0) ;
  77. //
  78. // /*Create a chart*/
  79. // lv_obj_t * chart;
  80. // chart = lv_chart_create(lv_scr_act());
  81. // lv_obj_set_size(chart, 100, 100);
  82. // lv_obj_center(chart);
  83. // lv_chart_set_type(chart, LV_CHART_TYPE_LINE); /*Show lines and points too*/
  84. // /*Add two data series*/
  85. // lv_chart_series_t * ser1 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y);
  86. //
  87. // /*Set the next points on 'ser1'*/
  88. // lv_chart_set_next_value(chart, ser1, 0);
  89. // lv_chart_set_next_value(chart, ser1, 10);
  90. // lv_chart_set_next_value(chart, ser1, 10);
  91. // lv_chart_set_next_value(chart, ser1, 10);
  92. // lv_chart_set_next_value(chart, ser1, 10);
  93. // lv_chart_set_next_value(chart, ser1, 10);
  94. // lv_chart_set_next_value(chart, ser1, 10);
  95. // lv_chart_set_next_value(chart, ser1, 30);
  96. // lv_chart_set_next_value(chart, ser1, 70);
  97. // lv_chart_set_next_value(chart, ser1, 90);
  98. // lv_chart_refresh(chart); /*Required after direct set*/
  99. }
  100. int main(void)
  101. {
  102. int8_t Temperature;
  103. int8_t Humidity;
  104. DHT11_Data_TypeDef DHT11_Data;
  105. HAL_Init();
  106. SystemClock_Config();
  107. BSP_UART_Init();
  108. TIM6_Init();
  109. DHT11_Init ();
  110. RTC_Init();
  111. //LVGL初始化
  112. lv_init();
  113. //显示器初始化
  114. lv_port_disp_init();
  115. //界面生成
  116. //lv_ex_label_1();
  117. //lv_example_chart_1();
  118. lv_example_style_1();
  119. //lv_demo_widgets();
  120. while(1)
  121. {
  122. lv_task_handler();
  123. HAL_Delay(5);
  124. /*调用DHT11_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/
  125. if( DHT11_Read_TempAndHumidity ( & DHT11_Data ) == SUCCESS)
  126. {
  127. //printfS("\r\n读取DHT11成功!\r\n\r\n湿度为%d.%d %RH ,温度为 %d.%d℃ \r\n",\
  128. DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);
  129. Temperature = DHT11_Data.temp_int;
  130. Humidity = DHT11_Data.humi_int;
  131. }
  132. else
  133. {
  134. printf("Read DHT11 ERROR!\r\n");
  135. }
  136. lv_label_set_text_fmt(labe_temp, "%d°C", (int)Temperature) ;
  137. lv_label_set_text_fmt(labe_humi, "%d%%", (int)Humidity) ;
  138. }
  139. }
  1. 测试效果
  1. 总结

主函数主要是lvgl简单界面代码编写,dht11温湿度传感器数据获取,后面可以定时器定时去获取,不需要一直检测,或者在rtos中创建任务。原本打算做一个动态曲线的,但是屏幕刷新太慢了,毕竟用的是软件SPI,虽然硬件好一点,但是,我看不如测试发现其实帧率差不了多少,可能后面有时间研究研究硬件SPI+DMA的方式,加快刷屏。对于lvgl的使用可能需要加强一点。

点赞 关注
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
ADI 有奖直播报名中~
直播时间:3月27日(周四) 上午10:00-11:30
直播主题:易于驱动SAR型ADC的原理、优点及应用介绍
好礼等你拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 14

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表