ESP8266 Development Board DHT11&OLED付き(続き)

OLDEがうんともすんともしない問題、一応調査してみる。

そしたら意外と早く解決したので、メモ。

 

何が一番困ったって、OLEDの裏面シルクに何も書いてないこと。
裏面には抵抗しかない。

これだと5Vで使うときは要注意かも。

このOLEDの正体を突き止めるため(大げさ)、i2c_scannerというスケッチを使う。

I2C通信のアドレスを確認するためのツール。

いろいろ見つかるんですが、この辺りを参照させていただきました。

 https://novicengineering.com/i2c通信のアドレスを取得する方法/

Aruinoを引っ張り出して配線、スケッチをコピペしてコンパイル後、シリアルモニタで確認したところ、自分のも0x3Cでした。

 

この情報を元に、ライブラリのESP_Adafruit_SSD1306.hの内容を書き換える。デフォルトでは違うアドレスになっているので。

37行目辺りにあるアドレスを、

 #define SSD1306_I2C_ADDRESS   0x3C

という風に書き換え。
ついでにおそらく画面の解像度も違うと思うので、これも128x64に変更。
(でも以前使ったのか、自分のでは問題なかった)

55行目辺りの一文の、コメントアウトしているのを外す。

   #define SSD1306_128_64

これでライブラリ側の準備は終わったはず。

 

余談だけど、ついでにOLEDの表示が壊れてないか、Arduinoのサンプルスケッチでチェックしてみた。

しかし画面が上下黄色と青の二種類のやつ。気を付けてデザインしないと、表示が変になるかもしれない。

 

あとはI2C通信のSCLとSDAについて確認しようと思って調べてたら、以下のページを発見。

 https://macsbug.wordpress.com/2015/10/23/esp8266-と-i2c/

よく参照させていただいてるサイトでした。

それはともかく、「Wire.begin(SDA,SCL) ;」の記述が元のスケッチにはないことに気付いた。

元の回路図を参照しながら、接続されているGPIOピンを確認。

// set displayの下に、

 Wire.begin(2,14);

という一文を追加した。

 

これで再度コンパイルしてみたところ、無事に表示されるようになった。

心配した通り、やっぱり変なところで青と黄色の境目ができちゃってるなあ。

でもちゃんと使えるようにはできた。

 

あちこちいじって、最終的に作成したスケッチは以下。参考までに。

(元のスケッチは、前回紹介したこちらです)

#include <Wire.h>
#include "ESP8266WiFi.h"
#include <Adafruit_GFX.h>
#include <ESP_Adafruit_SSD1306.h>
#include "DHT.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET 2
Adafruit_SSD1306 display(OLED_RESET);
#define DHTPIN 5     // Connected to GPIO Pin

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE,15);

byte img [] = { 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 
0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0xfc, 
0x3f, 0x80, 0x0, 0x0, 0x3, 0xe0, 0x7, 0xc0, 0x0, 0x0, 0x7, 0x80, 0x1, 0xe0, 0x0, 
0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x7f, 0xc0, 0x7, 0xe2, 0x0, 
0x0, 0x4f, 0xe0, 0x7, 0x80, 0x0, 0x0, 0x1, 0xe0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf0, 
0x1e, 0x0, 0x0, 0x0, 0x0, 0x70, 0xe, 0x0, 0x0, 0x0, 0x0, 0x78, 0xc, 0x0, 0x0, 
0x0, 0x0, 0x30, 0xc, 0x0, 0x0, 0x0, 0x0, 0x30, 0xc, 0x0, 0x0, 0x0, 0x0, 0x30, 
0xe, 0x0, 0x0, 0x0, 0x0, 0x70, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x70, 0xf, 0x0, 0x0, 
0x0, 0x0, 0xf0, 0x7, 0x80, 0x0, 0x0, 0x1, 0xe0, 0x7, 0xe3, 0x80, 0x1, 0xc7, 0xe0, 
0x3, 0xff, 0xc0, 0x3, 0xff, 0xc0, 0x0, 0xff, 0xf0, 0xf, 0xff, 0x0, 0x0, 0x20, 0xfc, 
0x3f, 0x4, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 
0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 
0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x1f, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x20, 0x0, 0x0, 0xe, 0x0, 
0x0, 0x70, 0x0, 0x0, 0x0, 0x1, 0x80, 0x70, 0x0, 0x0, 0x0, 0x1, 0x80, 0xf8, 0x0, 
0x0, 0x0, 0x3, 0xc0, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xc0, 0xf8, 0x0, 0x0, 0x0, 0x3, 
0xc0, 0x70, 0x0, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 
0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
 };
 
void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");

  // dht begin
  dht.begin();
  
  // set display
  Wire.begin(2,14);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
  delay(2000);
}

void showTemp(float temp,float hud) {
  display.drawBitmap(0, 5,  img, 48, 50, 1);
  display.setTextSize(1);
  display.setCursor(3,0);
  display.println("Temperature/Humidity");
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(52,10);
  display.print(temp);
  display.println("C");
  display.setCursor(52,30);
  display.print(hud);
  display.println("%");
  display.setTextSize(1);
  display.setCursor(52,50);
  display.println("14CORE.COM");
  display.display();
  display.clearDisplay();
}
void loop() {

  delay(1000);   // Wait a few seconds between measurements.
  float h = dht.readHumidity();
  float t = dht.readTemperature();   // Read temperature as Celsius
 
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Humidity: ");    // show in serial monitor
  Serial.print(h);
  Serial.print(" %¥t");
  Serial.print("Temperature: ");    // show in serial monitor
  Serial.print(t);
  Serial.print(" *C ¥n");
  showTemp(t,h);   // show temp
}
Sponsered Link

ESP8266 Development Board DHT11&OLED付き

ちょっと中休みというか、また妙なものを買って対応に困ってるのでメモ。

 

何となく、今さらESP-12FにDHT11がくっついたボードを購入。

 https://www.banggood.com/ESP8266-IoT-Development-Board-DHT11-Temperature-and-Humidity-Yellow-Blue-OLED-Display-SDK-Programming-Wifi-Module-p-1471313.html?rmmds=myorder&cur_warehouse=CN

 

あとでAliExpressで検索したら、どうも何かの教材だったらしい。

 https://www.aliexpress.com/item/32974689009.html?ESP8266 Internet of Things Development Board SDK Programming Video Full Course Wifi Module Small System Board

詳細がどこにもないので、ここにある回路図が役に立った。

 

試しにUSB接続したけど、LEDは点灯しても何も起きない。

これはやっぱり自力でプログラムを入れないとダメらしい。

しかし購入先には詳細もなければサンプルのコードもないので、ESP8266でDHT11を使ってる例を探し、以下のところを参照した。

 https://www.14core.com/wiring-dht11-dht22-with-oled-screen-on-esp8266-12e/

リンク先に必要なライブラリがあるので、それを入れて準備はOK。

プログラムをArduino IDEにコピペして、コンパイル。

ハードはNodeMCU 1.0を選択した。あとはデフォルト。

でもこれが一筋縄ではいかず、エラーが多発。

 

最初のエラーは「#include "ESP8266WiFi.h"」の位置だった。

以下に書いてあるのを見つけて、その通りにしたら本当に治った。

 https://github.com/esp8266/Arduino/issues/798

そういえば、以前も似たような症状になったことがあったな。忘れてたけど。

 

その次には良くあるエラー。

 arduino error: expected '}' at end of input

単純に、「}」がひとつ足りなかった。

「void loop() {」の前に「}」を入れたらコンパイルが通った。

 

次に、コンパイルしたものの、シリアルモニタで確認したら出てきたエラー。

 Failed to read from DHT sensor!

これはDHTの接続が違っていたため。

回路図を見ながら(でも解像度が悪いので大変だった)、

 #define DHTPIN 5

に書き換えたら接続できた。

シリアルモニタで再度確認、ちゃんと計測してるのがわかる。

これで動作は問題なさそうなのがわかった。

というわけで、あとはOLEDに表示されない問題。

まためんどくさいことをやってるので、一旦ここで区切る。(続きあるかなあ…)

Sponsered Link

ESP-01/ESP-01S用DHT11モジュール(もう少し続き)

先日からの続き。もう少し、DHT11モジュールの動作を検証中。

検索してると今はDHT11よりDHT22やDHT12を使ってる人が多いかな、と言う印象。

そのうちM5Stackにも接続して遊ぼうかなと思ったけど、既にDHT12のプロトモジュールが出てるので、今さらDHT11はあんまり意味なさそう。

AliExpress.com Product - M5Stack Official Experimental Proto Board Set included DHT12 Bus Socke Grove Cable for ESP32 Basic Kit & Mpu9250 Kit for Arduino

そのうちやるかもしれないけど、とりあえず引き続き、ここではESP-01(S)を使ってデータを取ってみます。

 

www.esp8266learning.comという、その名の通りESP8266を使って色々やってるブログで、thingspeak.comにデータを転送する方法があったのでこれを参照して動作確認してみます。

 http://www.esp8266learning.com/dht11-sensor-data-to-thingspeak-using-a-wemos-d1.php

上記で使ってるのはWemos D1だけど、ESP-01でも行ける。

データを送ればthingspeak.com側でグラフにしてくれて、便利。

 

thingspeak.comへの登録は、名前とメールアドレスだけで大丈夫。

 https://thingspeak.com

メールが来て登録確認、その後さらにパスワードを登録して完了。

大量にデータを送らないなら、基本無料で使えます。

 

後で調べたら、日本語でわかりやすく登録方法がまとめられてるところがありました。

参考になります。

 http://iwathi3.hatenablog.com/entry/Data-to-Graph-ThingSpeak

2年ほど前の記事ですが、現在もこれで大丈夫でした。

 

上記を参照してアカウントを取っておき、新しいチャンネルに温度と湿度のフィールドを作っておく。

さらに自分のapi keyの文字列を確認。

esp8266learning.comのページにあるスケッチをArduino IDEにコピペして、多少書き換えます。

ここはよくある編集。

 String apiKey = "thingspeak.comで取得したapi key";
 const char* ssid = "自分ちのwifiの名前";
 const char* password = "自分ちのwifiのパスワード";
 const char* server = "api.thingspeak.com";  //ここはそのまま

これに加えて、さらに10行目はD2を
 #define DHTPIN 2

にしておきます。

あと使うDHTのライブラリはAdafruitのDHTライブラリなんで、入ってるかどうか一応確認しておく。

 

自分の環境ではエラーもなく無事にESP-01に書き込み完了できました。

しばらく見てるとthingspeak.comにデータ転送され、グラフが出来上がるはず。

しかしこっちの湿度はともかく、

温度がいきなり上がり過ぎ。

これ絶対、ESP-01本体の熱を測ってるでしょ。

モジュールがセンサーの真上にESP-01が来る形になるので、しかたないと言えばそうなんだけど。

 

それでもちゃんとしたデータが取れることは確認できたので満足。

安いモジュールだけど、使えないと悔しいので。

thingspeak.comのアカウントもわざわざ取っちゃったので、別のモジュールとかで有効活用したい。

Sponsered Link

ESP-01/ESP-01S用DHT11モジュール(続き)

まだ途中な感じだけど、やってることメモ。

 

DHT11モジュールでもうちょっとキレイな感じでデータを表示させたいな、と思って調べてたことの続き。

ESP-01とDHT11で検索すると、すぐにわかりやすいページが引っかかる。

 https://www.elec-cafe.com/esp8266-temperature-humidity-webserver-with-a-dht11-sensor/

上記のページではスケッチをコピペするだけで良さそうだったので、さっそく参考させていただきました。

 

しかしそのままコンパイルしたところ、スケッチがエラーになる。

難しいエラーではなく、DHT11.hがないと言われるだけ。

すでにインストールしているDHT11用のライブラリでは使えないようだ。

これはどこかからライブラリを拾ってくるのではなく、上記のブログで専用に使っているものを使えばよかった。

下記の、「DHT11 Library」からダウンロードできました。

 https://www.elec-cafe.com/arduino-wireless-temperature-lcd-display-nrf24l01-dht11/

これでエラーなくコンパイルと書き込みができた。

 

動作も問題ないようで、Arduino IDEのシリアルモニタ に出ていたIPアドレスを入力してWebブラウザでアクセス。

…が、アクセスできない。

どうもデータかwifiが重くて、接続しようとしても接続できない感じ。

(ほっとくと接続がタイムアウトになる)

もうちょっとシンプルに表示させたほうがいいんだろうか。

このプログラムでも十分シンプルに見えるんだが。

 

それと書き込みはUSBのモジュールで簡単にできても、その後DHT11モジュールで5Vを確保するのは結局こんな状態になっている。

結局ブレッドボードを使ってるという状態。

まだ改善が必要なところは多いな…。

Sponsered Link

ESP-01/ESP-01S用DHT11モジュール

今度はESP-01用DHT11モジュールの件。こっちね。

AliExpress.com Product - ESP8266 ESP-01/ESP-01S DHT11 Serial Temperature Humidity Sensor Transceiver Receiver Module for Arduino NodeMCU Wireless WIFI

せっかく購入したのでデモぐらいは試してみようと思う。
梱包がいいかげんで心配だったけど、袋から出した感じでは問題なさそうだった。

しかしなんか大きめだと思ったら、このEPS-01、捨て基板が付きっぱなしだった。

使うのには問題ないんで、このままでいいか。


公式(?)の販売店は以下っぽい。
 https://www.elecrow.com/esp8266-esp-01-esp-01s-dht11-temperature-humidity-wifi-nodemcu-module-for-arduino.html
このリンク先にArduino IDE用のスケッチが置いてあった。
 https://github.com/IOT-MCU/ESP-01S-DHT11-v1.0
これを使えば遊べそうだ。
上記のリンクからデータをダウンロードして解凍すると、スケッチとともにライブラリも付いていた。これは助かる。

 

その前に、もしESP8266用の設定がArduino IDEになければ、追加しておく必要がある。
いつも参照させていただいている、mgo-tecさんのページが親切でわかりやすいです。
 https://www.mgo-tec.com/esp8266-board-install01-html

自分の環境ではインストール済みだったけど、ボードマネージャーで確認したらバージョンが古かったのでバージョンアップしました。

最近ESP8266は全然使ってなかったから、放置してたもんなあ。

 

その後「Arduno_DHT11.ino」をコンパイルするんだど、ちょっと注意。

14、15行目は書き直す。

 const char* ssid     = "自分ちのwifiの名前";
 const char* password = "自分ちのwifiのパスワード";

あとは16行目になぜか「*/」が入っていて、これがエラーで引っかかった。削除してOK。

ライブラリ(Adafruit_Sensor.zipとDHT.zip)は二つとも取り込んでおく。

 

書き込みの時は、先日書いた通りESP-01のIO0とGNDをショートさせておく。

(書き込み終わったら外す)

今回は取り急ぎ、USBモジュールにタクトスイッチを裏に付けてみた。

 

無事書き込まれて動作するようになると、シリアルポートにサーバーが動き出したことと、IPアドレスが表示される。

ここに記載されているIPアドレスをwebブラウザで開くと、

「Hello from the weather esp8266, read from /temp or /humidity」

と出てくる。

なのでIPアドレスの後に/tempか/humidityを付けると、温度と湿度がそれぞれ表示される。

なんか数字がすごいことになってたけど。「F」が付いてたから、華氏なのかな。

 

無事動くことが確認できたので、次は表示をちゃんとさせたい。

この辺りのカスタムはいろんな人がやってるので、それを参照していじってみます。

Sponsered Link