考虑到DHT11比较渣,就买了据说好点点的DHT22。接上后看输出完全是个坏的,不甘心就继续折腾,终于找到原因,库有问题,即使宣称支持DHT22的库,好些也是错的。最后发现IDE联网下载的库 SimpleDHT 可以读出数据,但处理是针对DHT11的,不得已自己处理了40位数据,终于让DHT22工作起来了。
考虑到这个是常见应用,做物联网页的入门测试,就把程序修改下适合快速重现。
如图,插上,上传程序即可,不需要面包板和杜邦线。
需要条件是OLED的线序和板上IIC接口一致,D12持续输出高电平给DHT22供电,
拼凑的程序比较渣,在IDE 1.8.1 下编译通过, 库就在IDE里面联网下载即可。
- // 參考網址[url=http://arduino-er.blogspot.tw/20]http://arduino-er.blogspot.tw/20[/url] ... -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[10];
- 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[40] = {0}; // DHT raw data , 40 digital.
- byte temperature = 0;
- byte humidity = 0;
- byte h[16] = {0};
- byte t[16] = {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[i]);
- if (i > 0 && ((i + 1) % 4) == 0) {
- Serial.print(' ');
- }
- }
- Serial.println("");
- //----------------
- //----------------from raw data, split h/t to h[]
- for (int i = 0; i < 16; i++) {
- h[i] = data[i];
- }
- for (int i = 0; i < 16; i++) {
- Serial.print((int)h[i]);
- }
- Serial.println("");
-
- for (int i = 0; i < 16; i++) {
- t[i] = data[i+16];
- }
- for (int i = 0; i < 16; i++) {
- Serial.print((int)t[i]);
- }
- Serial.println("");
- //----------------
- /*---------------- h[] to char, test only
- for(int i=0;i<16;i++){
- hh += h[i];
- }
- Serial.println(hh);
-
- for(int i=0;i<16;i++){
- tt += t[i];
- }
- Serial.println(tt);
- */
- //----------------h[] to float
- hhh=0;
- ttt=0;
- for(int i=0;i<16;i++){
- hhh = hhh + h[i]*(pow(2,(15-i)));
- }
- for(int i=0;i<16;i++){
- ttt = ttt + t[i]*(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
- }
复制代码
|