最简单的 DHT22+OLED 测试
考虑到DHT11比较渣,就买了据说好点点的DHT22。接上后看输出完全是个坏的,不甘心就继续折腾,终于找到原因,库有问题,即使宣称支持DHT22的库,好些也是错的。最后发现IDE联网下载的库 SimpleDHT 可以读出数据,但处理是针对DHT11的,不得已自己处理了40位数据,终于让DHT22工作起来了。考虑到这个是常见应用,做物联网页的入门测试,就把程序修改下适合快速重现。
如图,插上,上传程序即可,不需要面包板和杜邦线。
需要条件是OLED的线序和板上IIC接口一致,D12持续输出高电平给DHT22供电,
拼凑的程序比较渣,在IDE 1.8.1 下编译通过, 库就在IDE里面联网下载即可。
// 參考網址http://arduino-er.blogspot.tw/20 ... -monitor-using.html
// 度 C 有完整顯示
// display on 0.96 inch 128X64 I2C OLED
#include <U8glib.h>
#include <SimpleDHT.h>
int pinDHT11 = 13; // DHT22 数据引脚
SimpleDHT11 dht11;
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
char str;
void drawTest(void)
{
u8g.setFont(u8g_font_unifont);
}
void setup()
{
pinMode(12, OUTPUT);
digitalWrite(12, HIGH); // DHT22 供电:D12/D13/Gnd 正好可以插上DHT22
Serial.begin(115200);
u8g.firstPage();
do
{
drawTest();
}
while( u8g.nextPage() );
}
void loop() {
Serial.println("--------------------------------------------");
byte data = {0};// DHT raw data , 40 digital.
byte temperature = 0;
byte humidity = 0;
byte h = {0};
byte t = {0};
String hh;
String tt;
float hhh;
float ttt;
if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
Serial.print("Read DHT11 failed");
return;
}
//----------------Print DHT raw data , 40 digital.
Serial.print("Sample RAW Bits: ");
for (int i = 0; i < 40; i++) {
Serial.print((int)data);
if (i > 0 && ((i + 1) % 4) == 0) {
Serial.print(' ');
}
}
Serial.println("");
//----------------
//----------------from raw data, splith/t to h[]
for (int i = 0; i < 16; i++) {
h = data;
}
for (int i = 0; i < 16; i++) {
Serial.print((int)h);
}
Serial.println("");
for (int i = 0; i < 16; i++) {
t = data;
}
for (int i = 0; i < 16; i++) {
Serial.print((int)t);
}
Serial.println("");
//----------------
/*---------------- h[] to char, test only
for(int i=0;i<16;i++){
hh += h;
}
Serial.println(hh);
for(int i=0;i<16;i++){
tt += t;
}
Serial.println(tt);
*/
//----------------h[] to float
hhh=0;
ttt=0;
for(int i=0;i<16;i++){
hhh = hhh +h*(pow(2,(15-i)));
}
for(int i=0;i<16;i++){
ttt = ttt +t*(pow(2,(15-i)));
}
//----------------
hhh=hhh/10;
ttt=ttt/10;
Serial.print(hhh); Serial.print(" % ");
Serial.print(ttt); Serial.println(" *C, ");
/* 如下可以 Ctrl+Alt+L , IDE自带串口绘图器 查看双通道图形
Serial.print(hhh);
Serial.print(" ");
Serial.print(ttt);
Serial.println();
*/
u8g.firstPage();//OLED左上角为0,0 ;字符定位为 左下角
do {
u8g.setFont(u8g_font_helvB18);
u8g.drawStr( 0, 63, "H="); //顯示 H=
u8g.drawStr( 40, 63, dtostrf(hhh, 5, 2, str));
u8g.drawStr( 105, 63, "%"); //顯示 %
u8g.drawStr( 0, 32, "T="); //顯示 T=
u8g.drawStr( 37, 32, dtostrf(ttt, 5, 2, str));
u8g.drawStr( 100, 32, "\260C"); //顯示 度C
} while( u8g.nextPage() );
delay(500); //repeat
}
3Q for sharing,DHT22會比DHT11準嗎?
jasonwang1208 发表于 2017-3-17 11:48
3Q for sharing,DHT22會比DHT11準嗎?
DHT11湿度值是有严重问题的,DHT22贵些,略好.至于专业用途还有更贵更好的. 讚,頂一個。
辛苦了
页:
[1]