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温湿度读取程序,确定传感器连接配置没有问题。
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
#define HIGH_TIME 32
int pinNumber = 7; //wiringPi编码的PIN 7,即为BCM编码的PIN 4
uint32 databuf;
uint8 readSensorData(void)
{
uint8 crc;
uint8 i;
pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 0); // output a high level
delay(25);
digitalWrite(pinNumber, 1); // output a low level
pinMode(pinNumber, INPUT); // set mode to input
pullUpDnControl(pinNumber, PUD_UP);
delayMicroseconds(27);
if (digitalRead(pinNumber) == 0) //SENSOR ANS
{
while (!digitalRead(pinNumber))
; //wait to high
for (i = 0; i < 32; i++)
{
while (digitalRead(pinNumber))
; //data clock start
while (!digitalRead(pinNumber))
; //data start
delayMicroseconds(HIGH_TIME);
databuf *= 2;
if (digitalRead(pinNumber) == 1) //1
{
databuf++;
}
}
for (i = 0; i < 8; i++)
{
while (digitalRead(pinNumber))
; //data clock start
while (!digitalRead(pinNumber))
; //data start
delayMicroseconds(HIGH_TIME);
crc *= 2;
if (digitalRead(pinNumber) == 1) //1
{
crc++;
}
}
return 1;
}
else
{
return 0;
}
}
int main(void)
{
printf("PIN:%d\n", pinNumber);
if (-1 == wiringPiSetup()) {
printf("Setup wiringPi failed!");
return 1;
}
pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level
printf("Starting...\n");
while (1)
{
pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level
delay(3000);
if (readSensorData())
{
printf("Sensor data read ok!\n");
printf("RH:%d.%d\n", (databuf >> 24) & 0xff, (databuf >> 16) & 0xff);
printf("TMP:%d.%d\n", (databuf >> 8) & 0xff, databuf & 0xff);
databuf = 0;
}
else
{
printf("Sensor dosent ans!\n");
databuf = 0;
}
}
return 0;
}
编译 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
import time
import board
import adafruit_dht
# 设置传感器类型,可以为DHT11、DHT22或AM2302
# 设置连接的GPIO引脚board.D21
dht_device = adafruit_dht.DHT11(board.D21)
while True:
try:
# 将值打印到串行端口
tem_c = dht_device.temperature
tem_f = tem_c * (9 / 5) + 32
hum = dht_device.humidity
# 打印读取到的信息
print("温度: {:.1f} °F / {:.1f} °C 湿度: {}% ".format(tem_f, tem_c, hum))
except RuntimeError as error:
# 打印出错误信息
print(error.args[0])
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的相关连接信息改下即可。
这样嵌入式的硬件与软件紧密结合,物联网和大数据相互辉映,人工智能与云计算共同发展(后期会有图像采集到图像处理、推理的项目再详细介绍)。