kpj001 发表于 2017-3-16 23:08:58

最简单的 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
}

jasonwang1208 发表于 2017-3-17 11:48:56

3Q for sharing,DHT22會比DHT11準嗎?

kpj001 发表于 2017-3-17 11:55:02

jasonwang1208 发表于 2017-3-17 11:48
3Q for sharing,DHT22會比DHT11準嗎?

DHT11湿度值是有严重问题的,DHT22贵些,略好.至于专业用途还有更贵更好的.

galaxy 发表于 2017-3-24 21:32:24

讚,頂一個。
辛苦了
页: [1]
查看完整版本: 最简单的 DHT22+OLED 测试