之前玩温度传感器LM35是3个引脚的(数据端是模拟引脚);
结果这次一看温湿度传感器DHT11就吓尿了,居然是3个引脚的(数据端是数字引脚),
这怎么输出温度和湿度啊???(数字引脚只有0和1两种值)
后来查了一下元件手册,才知道它是串口通信的(发送连续的01串,表示数值)。
那么接下来就是 串口通信规则了【我没查它的规则,直接模仿源代码得来的】
这次具体的数值只能通过 Arduino 的串口监视器才看得到,
这次就没有用四位八段数码管显示了(上一篇博客有四位八段数码管显示LM35的温度,这里就不重复了)。
其实显示数值本来想使用 12232 的蓝底液晶屏显示的,
可是我的 12232 被“黑心”的厂商用 I2C 总线封装上了(16个引脚的,封装后剩下4个)。
I2C 总线串口通信规则可麻烦了,都已经封装成头文件的,现在还没读懂。。
下次弄懂 I2C 总线串口通讯的规则,以后显示什么数值就用 液晶屏显示。
【因为四维八段数码管需要10个引脚,还要串联8个200+Ω的电阻,每次用都超级麻烦】
const int DHpin = 2;
byte dat[4];
void setup()
{
pinMode(DHpin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
DHT11_test();
show_data();
delay(500);
}
void show_data(){ //从 Arduino 串口监视器观察数据
Serial.print("Humdity: ");
Serial.print(dat[0], DEC);
Serial.print(".");
Serial.print(dat[1], DEC);
Serial.println("%");
Serial.print("\tTemperature: ");
Serial.print(dat[2], DEC);
Serial.print(".");
Serial.print(dat[3], DEC);
Serial.println(" C");
}
byte DHT11_read(){ //串口通讯,发送8位数据
byte data = 0;
for(int i=0; i<8; i++){
if( digitalRead(DHpin)==LOW ){
while( digitalRead(DHpin)==LOW );
delayMicroseconds(30); //高电平>30us为“1”,高电平<30us为“0”
if( digitalRead(DHpin)==HIGH )
data |= 1<<(7-i);
while( digitalRead(DHpin)==HIGH );
}
}
return data;
}
void DHT11_test(){
digitalWrite(DHpin, LOW); //拉低总线,发开始信号
delay(30); //【延时要大于18ms,以便 DHT11 检测开始信号】
digitalWrite(DHpin, HIGH);
delayMicroseconds(40); //拉高总线,等待 DHT11 响应
pinMode(DHpin, INPUT); //从 DHT11 中读取温湿度
while( digitalRead(DHpin)==HIGH );
delayMicroseconds(80); // DHT11 发出响应,拉低总线80us
while( digitalRead(DHpin)==LOW );
delayMicroseconds(80); // DHT11 拉高总线80us后开始发送数据
for(int i=0; i<4; i++) //接受温湿度数据【前湿度,后温度】
dat[i] = DHT11_read();
pinMode(DHpin, OUTPUT);
digitalWrite(DHpin, HIGH); //发送完后释放总线,等待下一次开始信号
}