当前位置:   article > 正文

嵌入式人工智能(23-基于树莓派4B的温湿度传感器DHT11)

嵌入式人工智能(23-基于树莓派4B的温湿度传感器DHT11)

1、湿度传感器

目前市面上,仅测量湿度的传感器很少,普遍使用的都是温/湿度传感器,即以温/湿度一体式的探
头作为测温元件,将温度和湿度信号采集出来,再经过稳压滤波、运算放大、非线性校正、V转换、恒流及反向保护等电路处理后,转换成与温度和湿度成线性关系的电流或电压信号输出,也可以直接通过主控芯片输出。本文将以一款比较普遍的温/湿度传感器DHT1模块为例,测量温度和湿度。

2、DHT11

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。

DHTI1其采用3.3~5V的工作电压,其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。该传感器设本身有4个引脚,但其中一个引脚在使用时经常悬空,所以可以购买已完成数字模块和传感器焊接的3针模块。

3、与树莓派的连接

该模块与DS18B20类似,都是单总线结构,只需要3个引脚连接到树莓派:VCC、DATA和GND。分别连接在树莓派的3.3V引脚、GPIO4引脚(或其他 GPIO 引脚)和 GND引脚上。具体接线方式如上图,在开始接线前应先切断树派的电源。这里是接GPIO4,修改启动配置文件sudo nano /boot/firmware/config.txt 。添加dtoverlay=dht11,gpiopin=4

sudo cat /sys/devices/platform/dht11@4/iio\:device0/in_humidityrelative_input 
这里会报错:

我初步判断与DHT11传感器的读取时间太短有关,多试几次虽然不报错,但是显示0。先不管这个,我们到程序中调用相关函数进行读取,看看能不能读取到温湿度值。

4、温湿度C程序

我先上网找了个C语言版本的DHT11温湿度读取程序,确定传感器连接配置没有问题。

  1. #include <wiringPi.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef unsigned char uint8;
  5. typedef unsigned int uint16;
  6. typedef unsigned long uint32;
  7. #define HIGH_TIME 32
  8. int pinNumber = 7; //wiringPi编码的PIN 7,即为BCM编码的PIN 4
  9. uint32 databuf;
  10. uint8 readSensorData(void)
  11. {
  12. uint8 crc;
  13. uint8 i;
  14. pinMode(pinNumber, OUTPUT); // set mode to output
  15. digitalWrite(pinNumber, 0); // output a high level
  16. delay(25);
  17. digitalWrite(pinNumber, 1); // output a low level
  18. pinMode(pinNumber, INPUT); // set mode to input
  19. pullUpDnControl(pinNumber, PUD_UP);
  20. delayMicroseconds(27);
  21. if (digitalRead(pinNumber) == 0) //SENSOR ANS
  22. {
  23. while (!digitalRead(pinNumber))
  24. ; //wait to high
  25. for (i = 0; i < 32; i++)
  26. {
  27. while (digitalRead(pinNumber))
  28. ; //data clock start
  29. while (!digitalRead(pinNumber))
  30. ; //data start
  31. delayMicroseconds(HIGH_TIME);
  32. databuf *= 2;
  33. if (digitalRead(pinNumber) == 1) //1
  34. {
  35. databuf++;
  36. }
  37. }
  38. for (i = 0; i < 8; i++)
  39. {
  40. while (digitalRead(pinNumber))
  41. ; //data clock start
  42. while (!digitalRead(pinNumber))
  43. ; //data start
  44. delayMicroseconds(HIGH_TIME);
  45. crc *= 2;
  46. if (digitalRead(pinNumber) == 1) //1
  47. {
  48. crc++;
  49. }
  50. }
  51. return 1;
  52. }
  53. else
  54. {
  55. return 0;
  56. }
  57. }
  58. int main(void)
  59. {
  60. printf("PIN:%d\n", pinNumber);
  61. if (-1 == wiringPiSetup()) {
  62. printf("Setup wiringPi failed!");
  63. return 1;
  64. }
  65. pinMode(pinNumber, OUTPUT); // set mode to output
  66. digitalWrite(pinNumber, 1); // output a high level
  67. printf("Starting...\n");
  68. while (1)
  69. {
  70. pinMode(pinNumber, OUTPUT); // set mode to output
  71. digitalWrite(pinNumber, 1); // output a high level
  72. delay(3000);
  73. if (readSensorData())
  74. {
  75. printf("Sensor data read ok!\n");
  76. printf("RH:%d.%d\n", (databuf >> 24) & 0xff, (databuf >> 16) & 0xff);
  77. printf("TMP:%d.%d\n", (databuf >> 8) & 0xff, databuf & 0xff);
  78. databuf = 0;
  79. }
  80. else
  81. {
  82. printf("Sensor dosent ans!\n");
  83. databuf = 0;
  84. }
  85. }
  86. return 0;
  87. }

编译 gcc -Wall -o dht11 dht11.c -lwiringPi

运行 ./dht11  这样看来能正常的读取温湿度数据。可以放心的搞Python代码了 

5、Python实验代码

首先安装CircuitPython-DHT库

pip install adafruit-circuitpython-dht

pip install adafruit-blinka

sudo apt-get install libgpiod2

  1. import time
  2. import board
  3. import adafruit_dht
  4. # 设置传感器类型,可以为DHT11、DHT22或AM2302
  5. # 设置连接的GPIO引脚board.D21
  6. dht_device = adafruit_dht.DHT11(board.D21)
  7. while True:
  8. try:
  9. # 将值打印到串行端口
  10. tem_c = dht_device.temperature
  11. tem_f = tem_c * (9 / 5) + 32
  12. hum = dht_device.humidity
  13. # 打印读取到的信息
  14. print("温度: {:.1f} °F / {:.1f} °C 湿度: {}% ".format(tem_f, tem_c, hum))
  15. except RuntimeError as error:
  16. # 打印出错误信息
  17. print(error.args[0])
  18. time.sleep(2.0)

 这里有一个报错,我估计和GPIO4引脚有关,只能换一个引脚试试,这个Python的库函数毕竟不如C库,不稳定,我换了GPIO21.(之前的adafruit-DHT库被弃用了,现在用circuitpython库,弃用一个可以工作的库而代之以一个有bug的库,这让我(几乎)无话可说

6、将温湿度数据插入数据库

这次已经获得温湿度数据了,针对上次的程序稍微修改下即可。

        humidity  = dhtDevice.humidity
        temperature = dhtDevice.temperature
        print("温度: {:.1f} °C    湿度: {}% ".format(temperature, humidity))
        time_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        tabelname = 'Environment_table'
        data={'device_id':'0823334e0c43','datetime':time_str,'tenperature':str(temperature),'humidity':str(humidity)}
        Mysql_func.Sql_Insert_Table(data, tabelname)

我们用命令行的方式直接在树莓派系统查询表数据use Embedded_myDB

select * from Environment_table;

树莓派毕竟只是一个口袋型微型计算机,存储容量有限,如果是大规模的传感器数据还是要上传远程数据库服务器或者云服务器。只要把mysql的相关连接信息改下即可。

这样嵌入式的硬件与软件紧密结合,物联网和大数据相互辉映,人工智能与云计算共同发展(后期会有图像采集到图像处理、推理的项目再详细介绍)。

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

闽ICP备14008679号