当前位置:   article > 正文

stm32+DHT11温湿度检测系统_dht11stm32温度检测系统框架

dht11stm32温度检测系统框架

目录

摘要

一、系统方案

(一)系统功能

(二)系统结构

(三)元件选择

1. 主控处理器选择

2. 温湿度检测模块的选择

3. 无线传输模块的选择 

4. 显示模块的选择

5. 预警模块选择

6. 供电模块选择

二、理论计算与分析

三、电路与程序设计

(一)电路设计

(二)实物连接图

(三)程序设计

1.温湿度读取

2.OLED显示

3.数据采集与处理

4.按键操作

5.main函数

四、测试结果

(一)温湿度实时显示测试

(二)温湿度阈值报警测试

(三)温湿度最值记录测试

(四)无线传输测试

五、完整代码

六、参考文章


摘要

        基于stm32开发的环境检测系统可实时检测周围环境的温湿度参数,设有自动预警装置,可人为调控温湿度阈值,拥有记录功能,可自动记录温度湿度最大值和最小值并自动刷新,温湿度数据通过OLED屏幕显示,并支持无线传输功能可以在手机、电脑等上位设备显示实时温度湿度,远距离监视周围环境温湿度的变化。

一、系统方案

(一)系统功能

二)系统结构

        通过12v锂电池加稳压模块进行供电,由stm32负责控制,dht11温湿度传感器负责检测温湿度,使用jdy31蓝牙模块实现无线传输,用LED灯实现预警功能,通过按键实现人机交互,用OLED显示屏完成显示功能。

(三)元件选择

1. 主控处理器选择

STM32F103C8T6

       STM32F103C8T6因其高性能、低成本和良好的开发支持,在嵌入式系统开发中得到了广泛应用。完备的固件库使得其操作起来方便简单。该微控制器集成了多种外设,如ADC、DAC、UART、SPI、I2C等,可以轻松连接多种传感器和外围设备,适用于多种应用场景。由于STM32系列微控制器应用广泛,网络上有大量的技术资料和社区支持,遇到问题时可以容易地找到解决方案。

2. 温湿度检测模块的选择

DHT11温湿度传感器

        DHT11价格低廉,采用单总线通信方式,与微控制器的接口简单,只需要一个数字输入/输出引脚即可读取温湿度数据。DHT11输出的是数字信号,不需要额外的模拟前端电路,减少了电路复杂性和误差来源。DHT11将湿度传感器和温度传感器集成在一个封装内,节省了空间,简化了电路设计。DHT11与许多微控制器兼容,如Arduino、STM32、ESP8266等,社区支持和资料丰富。DHT11在测量过程中功耗低,适合电池供电的设备。DHT11能够测量相对湿度范围从5%到95%,温度范围从0°C到50°C,满足大多数室内应用的需求。

        尽管DHT11具有上述优点,但它也有一些局限性,如精度相对较低,对于需要高精度测量的应用可能不够用;温度测量范围有限,不适用于极端温度环境等。因此,在选择传感器时,需要根据具体的应用需求来决定是否使用DHT11。

3. 无线传输模块的选择 

jdy31或HC05蓝牙模块

        JDY-31是一款低功耗蓝牙模块,通常基于蓝牙4.2低能耗(BLE)技术。JDY-31模块的最大特点是低功耗,这使得它非常适合电池供电的设备,因为它可以显著延长电池寿命。JDY-31提供了简单的接口,可以快速与微控制器或其他设备集成,通过AT指令集进行配置和控制。JDY-31与大多数蓝牙4.2及更高版本的设备兼容,包括智能手机和平板电脑。虽然BLE主要用于低数据速率应用,但JDY-31仍然可以提供足够的传输速度,适用于许多物联网(IoT)和远程监控应用。与其他蓝牙模块相比,JDY-31具有较好的成本效益,适合预算有限的项目。

4. 显示模块的选择

0.96寸OLED

        是stm32最常用的显示模块,通常支持SPI、I2C等接口,易于与微控制器和其他电子设备连接。具有显示内容多,显示范围广,程序简单,使用方便,功耗低等多个优点。

5. 预警模块选择

LED或蜂鸣器

        主要通过程序实现,将检测值与设置阈值的实时比较,通过LED灯或蜂鸣器模拟执行预警功能。

6. 供电模块选择

12V锂电池

        在电动工具、便携式电子设备、电动车和储能系统中广泛应用。具有寿命长、容量大、抗冲击性好、自放电率低和良好的低温放电性能,强大的充电接受能力和快速充电能力。

降压模块

        通过降压模块降到3.3V,给各模块供电。可选LM2596等型号降压模块。

二、理论计算与分析

通过温湿度传感器检测的数据计算温湿度的显示数据,DHT11温湿度传感器返回

数据格式:

8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度整数数据 + 8bit温度小数数据 + 8bit校验和

数据传送正确时,校验和数据等于:

8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位

温度计算:

temperature = temp1 + temp2 / 10.0;

湿度计算:

humidity = humi1 + humi2 / 10.0;

数据校验:

buf[0] + buf[1] + buf[2] + buf[3] == buf[4];

另外,经实测发现,该传感器湿度只能精确到整数,因此湿度数据可以直接取用整数部分。且采样周期较长,短时间内连续读取没有意义,可设置一定采样周期,增大读取数据的时间间隔,这样可降低功耗,采到更多有效数据。

三、电路与程序设计

(一)电路设计

注:按键和LED均为低电平有效,VCC和GND省略

(二)实物连接图

(三)程序设计

1.温湿度读取

  1. uint8_t DHT11_Read_Data(uint8_t *humi1, uint8_t *humi2,uint8_t*temp1, uint8_t*temp2)
  2. {
  3. uint8_t buf[5];
  4. uint8_t i;
  5. DHT11_RST(); //DHT11端口复位,发出起始信号
  6. if(DHT11_Check() == 0) //等待DHT11回应,0为成功回应
  7. {
  8. for(i = 0; i < 5; i++) //读取40位数据
  9. {
  10. buf[i] = DHT11_Read_Byte(); //读出数据
  11. }
  12. if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) //数据校验
  13. {
  14. *humi1 = buf[0]; //将湿度值放入指针
  15. *humi2 = buf[1];
  16. *temp1 = buf[2]; //将温度值放入指针
  17. *temp2 = buf[3];
  18. }
  19. }
  20. else return 1;
  21. return 0;
  22. }

2.OLED显示

  1. void display_task()
  2. {
  3. switch(display_state)
  4. {
  5. case 0:
  6. OLED_ShowCC_F16x16(1, 1, 2); // 温
  7. OLED_ShowCC_F16x16(1, 3, 4); // 度
  8. OLED_ShowChar(1, 5, ':');
  9. OLED_ShowFNum(1, 6, temperature, 3, 1);
  10. OLED_ShowCC_F16x16(1, 11, 0); // ℃
  11. OLED_ShowCC_F16x16(3, 1, 3); // 湿
  12. OLED_ShowCC_F16x16(3, 3, 4); // 度
  13. OLED_ShowChar(3, 5, ':');
  14. OLED_ShowFNum(3, 6, humidity, 3, 1);
  15. OLED_ShowCC_F16x16(3, 11, 1); // %
  16. break;
  17. case 1:
  18. OLED_ShowCC_F16x16(1, 1, 7); // 最
  19. OLED_ShowCC_F16x16(1, 3, 9); // 低
  20. OLED_ShowCC_F16x16(1, 5, 2); // 温
  21. OLED_ShowCC_F16x16(1, 7, 4); // 度
  22. OLED_ShowChar(1, 9, ':');
  23. OLED_ShowFNum(1, 10, temp_min, 3, 1);
  24. OLED_ShowCC_F16x16(1, 15, 0); // ℃
  25. OLED_ShowCC_F16x16(2, 1, 7); // 最
  26. OLED_ShowCC_F16x16(2, 3, 8); // 高
  27. OLED_ShowCC_F16x16(2, 5, 2); // 温
  28. OLED_ShowCC_F16x16(2, 7, 4); // 度
  29. OLED_ShowChar(2, 9, ':');
  30. OLED_ShowFNum(2, 10, temp_max, 3, 1);
  31. OLED_ShowCC_F16x16(2, 15, 0); // ℃
  32. OLED_ShowCC_F16x16(3, 1, 7); // 最
  33. OLED_ShowCC_F16x16(3, 3, 9); // 低
  34. OLED_ShowCC_F16x16(3, 5, 3); // 湿
  35. OLED_ShowCC_F16x16(3, 7, 4); // 度
  36. OLED_ShowChar(3, 9, ':');
  37. OLED_ShowFNum(3, 10, humi_min, 3, 1);
  38. OLED_ShowCC_F16x16(3, 15, 1); // %
  39. OLED_ShowCC_F16x16(4, 1, 7); // 最
  40. OLED_ShowCC_F16x16(4, 3, 8); // 高
  41. OLED_ShowCC_F16x16(4, 5, 3); // 湿
  42. OLED_ShowCC_F16x16(4, 7, 4); // 度
  43. OLED_ShowChar(4, 9, ':');
  44. OLED_ShowFNum(4, 10, humi_max, 3, 1);
  45. OLED_ShowCC_F16x16(4, 15, 1); // %
  46. break;
  47. case 2:
  48. OLED_ShowCC_F16x16(1, 1, 2); // 温
  49. OLED_ShowCC_F16x16(1, 3, 4); // 度
  50. OLED_ShowCC_F16x16(1, 5, 11); // 下
  51. OLED_ShowCC_F16x16(1, 7, 12); // 限
  52. OLED_ShowChar(1, 9, ':');
  53. OLED_ShowNum(1, 10, temp_low, 2);
  54. OLED_ShowCC_F16x16(1, 12, 0); // ℃
  55. OLED_ShowCC_F16x16(3, 1, 2); // 温
  56. OLED_ShowCC_F16x16(3, 3, 4); // 度
  57. OLED_ShowCC_F16x16(3, 5, 10); // 上
  58. OLED_ShowCC_F16x16(3, 7, 12); // 限
  59. OLED_ShowChar(3, 9, ':');
  60. OLED_ShowNum(3, 10, temp_up, 2);
  61. OLED_ShowCC_F16x16(3, 12, 0); // ℃
  62. break;
  63. case 3:
  64. OLED_ShowCC_F16x16(1, 1, 3); // 湿
  65. OLED_ShowCC_F16x16(1, 3, 4); // 度
  66. OLED_ShowCC_F16x16(1, 5, 11); // 下
  67. OLED_ShowCC_F16x16(1, 7, 12); // 限
  68. OLED_ShowChar(1, 9, ':');
  69. OLED_ShowNum(1, 10, humi_low, 2);
  70. OLED_ShowCC_F16x16(1, 12, 0); // ℃
  71. OLED_ShowCC_F16x16(3, 1, 3); // 湿
  72. OLED_ShowCC_F16x16(3, 3, 4); // 度
  73. OLED_ShowCC_F16x16(3, 5, 10); // 上
  74. OLED_ShowCC_F16x16(3, 7, 12); // 限
  75. OLED_ShowChar(3, 9, ':');
  76. OLED_ShowNum(3, 10, humi_up, 2);
  77. OLED_ShowCC_F16x16(3, 12, 0); // ℃
  78. break;
  79. }
  80. }

3.数据采集与处理

  1. void collect_task()
  2. {
  3. if(collect_flag == 0)return;
  4. collect_flag = 0;
  5. //判断是否是正常读取
  6. if(DHT11_Read_Data(&humi1,&humi2,&temp1,&temp2)==0)
  7. {
  8. //读取温湿度
  9. temperature = temp1 + temp2 / 10.0;
  10. humidity = humi1 + humi2 / 10.0;
  11. //判断报警
  12. if((temp1 <= temp_low) || (temp1 >= temp_up) )
  13. {
  14. LED1_ON();
  15. }
  16. else
  17. {
  18. LED1_OFF();
  19. }
  20. if((humi1 <= humi_low) || (humi1 >= humi_up))
  21. {
  22. LED2_ON();
  23. }
  24. else
  25. {
  26. LED2_OFF();
  27. }
  28. if(reset_flag == 0)
  29. {
  30. //更新最大、小值
  31. if((temp1 > temp_max1) || ((temp1 == temp_max1) && (temp2 > temp_max2)))
  32. {
  33. temp_max1 = temp1;
  34. temp_max2 = temp2;
  35. temp_max = temperature;
  36. }
  37. if((temp1 < temp_min1) || ((temp1 == temp_min1) && (temp2 < temp_min2)))
  38. {
  39. temp_min1 = temp1;
  40. temp_min2 = temp2;
  41. temp_min = temperature;
  42. }
  43. if(humi1 > humi_max1)
  44. {
  45. humi_max1 = humi1;
  46. humi_max = humidity;
  47. }
  48. if(humi1 < humi_min1)
  49. {
  50. humi_min1 = humi1;
  51. humi_min = humidity;
  52. }
  53. }
  54. else
  55. {
  56. temp_max1 = temp1;
  57. temp_max2 = temp2;
  58. temp_max = temperature;
  59. temp_min1 = temp1;
  60. temp_min2 = temp2;
  61. temp_min = temperature;
  62. humi_max1 = humi1;
  63. humi_max = humidity;
  64. humi_min1 = humi1;
  65. humi_min = humidity;
  66. reset_flag = 0;
  67. }
  68. //蓝牙发送数据
  69. Serial_SendPacket();
  70. }
  71. }

4.按键操作

  1. void Key_task()
  2. {
  3. uint8_t KeyNum;
  4. KeyNum = Key_GetNum();
  5. switch(KeyNum)
  6. {
  7. case 2:
  8. display_state = (display_state + 1)%4;
  9. OLED_Clear();
  10. break;
  11. case 3:
  12. if(display_state == 2)
  13. {
  14. temp_up++;
  15. }
  16. if(display_state == 3)
  17. {
  18. humi_up++;
  19. }
  20. break;
  21. case 4:
  22. if(display_state == 2)
  23. {
  24. temp_up--;
  25. }
  26. if(display_state == 3)
  27. {
  28. humi_up--;
  29. }
  30. break;
  31. case 5:
  32. if(display_state == 2)
  33. {
  34. temp_low++;
  35. }
  36. if(display_state == 3)
  37. {
  38. humi_low++;
  39. }
  40. break;
  41. case 6:
  42. if(display_state == 2)
  43. {
  44. temp_low--;
  45. }
  46. if(display_state == 3)
  47. {
  48. humi_low--;
  49. }
  50. break;
  51. case 7:
  52. if(display_state == 1)
  53. {
  54. temp_max1 = 0;
  55. temp_max = 0;
  56. temp_min1 = 0;
  57. temp_min = 0;
  58. humi_max1 = 0;
  59. humi_max = 0;
  60. humi_min1 = 0;
  61. humi_min = 0;
  62. reset_flag = 1;
  63. }
  64. break;
  65. }
  66. }

5.main函数

  1. int main(void)
  2. {
  3. OLED_Init();
  4. LED_Init();
  5. Key_Init();
  6. Serial_Init();
  7. DHT11_Init();
  8. display_task();
  9. Delay_s(2);//跳过不稳定状态
  10. DHT11_First();
  11. Timer_Init();
  12. while (1)
  13. {
  14. collect_task();
  15. display_task();
  16. Key_task();
  17. }
  18. }

四、测试结果

(一)温湿度实时显示测试

(二)温湿度阈值报警测试

(三)温湿度最值记录测试

(四)无线传输测试

五、完整代码

链接:https://pan.baidu.com/s/1CsJjXv9tYufPHD0WrmRGhg?pwd=85jq 
提取码:85jq

六、参考文章

1、玩转传感器——DHT11温湿度传感器(STM32版)_温湿度传感器接线图-CSDN博客

2、STM32江科大的oled驱动代码添加显示浮点数_oled显示浮点数-CSDN博客

3、【STM32F103】JDY-31蓝牙模块(USART)_jdy31蓝牙模块-CSDN博客

4、GitHub - XieLazyDog/ValuePack: BlueTooth Controller for MCU

5、b站视频: https://www.bilibili.com/video/BV1Pb411o7v6/?share_source=copy_web&vd_source=d912cf4b424f2f4f9f337ac63872359a

6、b站up江协科技:STM32入门教程视频

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

闽ICP备14008679号