当前位置:   article > 正文

基于STM32F103C8T6单片机的DHT11温湿度传感器与OLED显示屏实时动态数据监测系统设计_f103c8t6温湿度dht

f103c8t6温湿度dht

标题:

摘要:
本文提出了一种利用STM32F103C8T6微控制器,结合DHT11数字温湿度传感器和OLED显示屏实现环境温湿度实时、直观显示的方法。该系统通过低功耗且精确的DHT11传感器获取环境温湿度信息,并借助于STM32F103C8T6强大的处理能力和I/O资源进行数据读取、解析以及控制OLED屏幕显示。研究内容包括硬件接口设计、软件程序开发以及实际应用测试。

一、引言
随着物联网技术的发展和智能设备的需求增长,对环境参数(如温度和湿度)的实时监控显得尤为重要。本研究旨在设计并实现一个以STM32F103C8T6为核心,搭配DHT11温湿度传感器和OLED显示屏的低成本、高效率实时温湿度监测系统。

二、系统设计与实现
1. 硬件设计:阐述了如何将DHT11温湿度传感器与STM32F103C8T6的GPIO端口连接,以及采用何种通信协议进行数据交互。同时描述了OLED显示屏的选型、接口设计及其与STM32F103C8T6的I2C或SPI连接方式。

2. 软件设计与算法实现:详细介绍了STM32F103C8T6下驱动DHT11读取温湿度数据的具体流程,包括数据包的接收、解码及错误检测机制;同时,说明了如何编写OLED显示屏驱动程序,实现数据显示格式的定制与刷新操作。

三、实验结果与分析
进行了系统的功能验证和性能测试,展示了系统在不同环境条件下的温湿度采集精度和响应速度,并对比分析了显示效果和系统稳定性。

四、结论
总结了基于STM32F103C8T6的DHT11-OLED温湿度监测系统的设计成果,强调其在智能家居、环境监测等领域的广泛应用前景,同时讨论了未来可能的技术优化方向。

关键词:STM32F103C8T6;DHT11温湿度传感器;OLED显示屏;实时监测;嵌入式系统设计

注意:由于论文写作需配合实际项目进展和实验数据,上述提纲仅供参考,具体撰写时需根据实际工作细节和实验数据来填充和完善。

  1. #include "dht11.h"
  2. #include "delay.h"
  3. void DHT11_IO_OUT(void)
  4. {
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6. RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE);
  7. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  8. GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
  12. }
  13. void DHT11_IO_IN(void)
  14. {
  15. GPIO_InitTypeDef GPIO_InitStructure;
  16. RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE);
  17. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  18. GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  20. GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
  21. }
  22. void DHT11_Rst(void)
  23. {
  24. DHT11_IO_OUT();
  25. DHT11_DQ_OUT=0;
  26. delay_ms(20);
  27. DHT11_DQ_OUT=1;
  28. delay_us(30);
  29. }
  30. uint8_t DHT11_Check(void)
  31. {
  32. uint8_t retry=0;
  33. DHT11_IO_IN();
  34. while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
  35. {
  36. retry++;
  37. delay_us(1);
  38. };
  39. if(retry>=100)return 1;
  40. else retry=0;
  41. while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
  42. {
  43. retry++;
  44. delay_us(1);
  45. };
  46. if(retry>=100)return 1;
  47. return 0;
  48. }
  49. uint8_t DHT11_Read_Bit(void)
  50. {
  51. uint8_t retry=0;
  52. while(DHT11_DQ_IN&&retry<100)//等待变为低电平
  53. {
  54. retry++;
  55. delay_us(1);
  56. }
  57. retry=0;
  58. while(!DHT11_DQ_IN&&retry<100)//等待变高电平
  59. {
  60. retry++;
  61. delay_us(1);
  62. }
  63. delay_us(40);//等待40us
  64. if(DHT11_DQ_IN)return 1;
  65. else return 0;
  66. }
  67. uint8_t DHT11_Read_Byte(void)
  68. {
  69. uint8_t i,dat;
  70. dat=0;
  71. for (i=0;i<8;i++)
  72. {
  73. dat<<=1;
  74. dat|=DHT11_Read_Bit();
  75. }
  76. return dat;
  77. }
  78. uint8_t Read_DHT_Data(uint8_t *temp,uint8_t *humi)
  79. {
  80. uint8_t buf[5];
  81. uint8_t i;
  82. DHT11_Rst();
  83. if(DHT11_Check()==0)
  84. {
  85. for(i=0;i<5;i++)//读取40位数据
  86. {
  87. buf[i]=DHT11_Read_Byte();
  88. }
  89. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  90. {
  91. *humi=buf[0];
  92. *(humi + 1)=buf[1];
  93. *temp=buf[2];
  94. *(temp + 1)=buf[3];
  95. }
  96. }
  97. else
  98. {
  99. return 1;
  100. }
  101. return 0;
  102. }
  103. uint8_t DHT11_INIT(void)
  104. {
  105. DHT11_Rst();
  106. return DHT11_Check();
  107. }
  1. #ifndef __DHT11_H
  2. #define __DHT11_H
  3. #include "sys.h"
  4. #define DHT11_DQ_OUT PAout(7) //数据端口 PA15
  5. #define DHT11_DQ_IN PAin(7) //数据端口 PA15
  6. #define DHT11_GPIO_PORT GPIOA //GPIO端口
  7. #define DHT11_GPIO_CLK RCC_APB2Periph_GPIOA //GPIO端口时钟
  8. #define DHT11_GPIO_PIN GPIO_Pin_7 //连接到SCL时钟线的GPIO
  9. uint8_t DHT11_INIT(void);//初始化DHT11
  10. uint8_t Read_DHT_Data(u8 *temp,u8 *humi);//读取温湿度
  11. uint8_t DHT11_Read_Byte(void);//读出一个字节
  12. uint8_t DHT11_Read_Bit(void);//读出一个位
  13. uint8_t DHT11_Check(void);//检测是否存在DHT11
  14. void DHT11_Rst(void);//复位DHT11
  15. #endif

main

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "oled.h"
  5. #include "string.h"
  6. #include "DHT11.h"
  7. int main(void)
  8. {
  9. uint8_t wendu[2] = {0}; //wendu[0]:存储温度数据整数,wendu[1]:存储温度数据小数
  10. uint8_t shidu[2] = {0};
  11. delay_init();
  12. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  13. DHT11_INIT();
  14. OLED_Init(); //初始化OLED
  15. OLED_Clear();
  16. OLED_ShowCHinese(0,0,0);//温
  17. OLED_ShowCHinese(18,0,1);//度
  18. OLED_ShowString(36,0,":",16);
  19. OLED_ShowCHinese(92,0,4);//摄氏度符号
  20. OLED_ShowCHinese(0,2,3);//湿
  21. OLED_ShowCHinese(18,2,1);//度
  22. OLED_ShowString(36,2,":",16);
  23. OLED_ShowString(93,2,"%",16);
  24. OLED_ShowString(105,2,"RH",16);
  25. while(1)
  26. {
  27. Read_DHT_Data(wendu, shidu);
  28. OLED_ShowNum(54,0,wendu[0],2,16);//温度整数
  29. OLED_ShowString(72,0,".",16); //小数点
  30. OLED_ShowNum(74,0,wendu[1],2,16);//温度小数
  31. OLED_ShowNum(54,2,shidu[0],2,16);//湿度整数
  32. OLED_ShowString(72,2,".",16); //小数点
  33. OLED_ShowNum(74,2,shidu[1],2,16);//湿度小数
  34. delay_ms(1000);
  35. }
  36. }

 后续会更新连接阿里云平台的代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/688996
推荐阅读
相关标签
  

闽ICP备14008679号