mimikakimemo

自分用メモ。

Osoyoo のキットに入っている I2C 1602 LCD モジュール を使う

先月買った Osoyoo のキットに 2 行の液晶ディスプレイ、I2C 1602 LCD モジュールが入っていたので、使ってみる。1602 は 16文字×2行 という意味らしい。Osoyoo 公式のドキュメント(あまり親切ではないが)は以下の通り。

LCD モジュールからは4本の端子 VCC, GND, SCL, SDA が出ている。SCL, SDA は I2C というインターフェイス規格で定義されているらしい。SCL がクロック、SDA がデータで、この2本の信号線があれば、まとめて複数のデバイスと通信できるのだとか。『超特急Web接続! ESPマイコン・プログラム全集』の Appendix 4 に解説があった。NodeMCU の場合、

LCD NodeMCU 備考
VCC VIN 3V3 だと電圧不足だった
GND GND
SCL D1 ESP8266 の IO5 に繋がっている
SDA D2 ESP8266 の IO4 に繋がっている

のように接続すると動かすことができる。

ライブラリは、Osoyoo のサイトから LiquidCrystal_I2C.zip がダウンロードできる。こういったライブラリのインストールのお作法がまだ良くわかっていないが、とりあえず LiquidCrystal_I2C.cppLiquidCrystal_I2C.h をそのままスケッチの隣につっこんだらコンパイルできた。

この前試した温湿度センサー DHT11 の値を LCD に表示してみた。

f:id:mimikakimemo:20210124223812j:plain

#include "LiquidCrystal_I2C.h"
#include "DHT.h"

#define DHTPIN D6     // D6 ピンからセンサーの値を得る
#define DHTTYPE DHT11 // DHT 11 を使う

LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Serial.begin(115200);

  lcd.init();
  lcd.backlight();

  dht.begin();
}

void loop()
{
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  Serial.println("Temperature: " + String(t, 1) + "°C\tHumidity: " + String(h, 0) + "%");

  // 1行目に温度を表示
  lcd.setCursor(0, 0);
  lcd.print("Temp:     " + String(t, 1) + char(0xdf) + "C");
  // 2行目に湿度を表示
  lcd.setCursor(0, 1);
  lcd.print("Humidity:    " + String(h, 0) + "%");

  delay(2000);
}

Arduino の文字列の扱いについては、まだいまいちよく把握していない…。この LCD は HD44780 互換というものらしく、半角カナや ASCII に無い記号も表示できた。温度記号 ℃ は無かったので、上のコードでは半角カナの半濁点 ゚(0xdf)を使って表示している。

参考サイト

ESP8266 を WiFi につなげる

超特急Web接続! ESPマイコン・プログラム全集』を読んで、製作のための部品を手配中。その間に、WiFi 接続を試したい。現状だとまだ電源が必要なので、ワイヤレスにはならないが…。

WiFi を使うための機能は最初にインストールした ESP8266 Arduino Core に入っているので、追加でインストールする必要はない。公式サイトに WiFi クライアントを使うための quick start があったので、それを参考にした。

#include <ESP8266WiFi.h>

const char *ssid = "my-ssid";
const char *password = "my-password";

WiFiClient client;

void setup()
{
  Serial.begin(115200);

  // WiFi に接続する
  WiFi.begin(ssid, password);

  // 接続完了まで待つ
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());

  // WiFi の状態をシリアルモニターに表示
  WiFi.printDiag(Serial);
}

実行結果。ルータの DHCP から IP アドレスが割り当てられている。

f:id:mimikakimemo:20210124154015p:plain

Arduino のスケッチ(.ino ファイル)に自分の SSID とパスワードを書いてしまうと、Git/GitHub での管理が面倒そうなので、本当は環境変数で外から設定できるようにしたい。が、Arduino IDE からではできないっぽい…?

PlatformIO を使えば簡単なのかな? あとで試してみる。

You can inject system environment variable using sysenv as a section. For example, ${sysenv.HOME}.

この前買った ESP8266 開発ボードを電池で動かしたかった

最近触っている ESP8266 の話続き。これを電池で動かすにはどうしたらいいのか?

ESP8266 で検索すると、ESP-WROOM-02開発ボード(ESPr Developer)の情報がよく出てくる。

ESPr Developer(ピンソケット実装済)

ESPr Developer(ピンソケット実装済)

  • メディア: おもちゃ&ホビー

この場合は、単3電池3本をそのまま VIN と GND に繋げばいいらしい。

ただ、今回のキットに入っていた開発ボードは NodeMCU なので、ちょっと違う。ネット上の情報を調べてみたところ…

The best battery for ESP8266 microcontrollers

The NodeMCU has a build in AMS1117 3.3V voltage regulator that transforms the input voltage from the 5V USB connection as well as the voltage of the VIN pin to the stable 3.3V output voltage.

ESP32を電池で動かしてみる (その1) / kghr IT備忘録

その後ネットでいろいろ読んでたら、この”DOIT ESP32 DEVKIT V1 Board” に使われている1117系レギュレータはドロップアウトが1V近くあるのだとか。こちらのデータシートを見てみると、「Operates Down to 1V Dropout」と書いてあり、乾電池で動かすには向いてないのではと思った。

esp8266 - How to power nodemcu devkit using battery - Stack Overflow

The easiest would be to NOT use that devkit but use one with a LiPo connector instead e.g. https://www.adafruit.com/product/2821. An alternative would be to use WeMos D1 minis with a LiPo/battery shield.

If you want to stick to your devkit you "just" have to make sure you feed 3.3V to the 3.3V pin. Since batteries deliver no stable voltage over time you need to place some kind of buck/boost converter (step-down/step-up) between the battery and the module.

You could of course also target the VIN pin which expects 5V but that would be less efficient if you used a LiPo battery. First, the external converter would boost from the LiPo's ~3.7V to 5V. Then the devkits internal converter would have to bring this down to 3.3V again.

Furthermore, if you feed the ESP8266 from batteries you want to pay attention to any power that'd be lost along the way. With the L7805 voltage regulator for example there is a constant 'quiescent' current draw of 6mA. That may be ok if your source is a power adapter but less ideal when it's a battery. Buck/boost converters are more efficient.

うーん…。そもそも NodeMCU の開発ボードは、電池駆動に向いていなかったらしい。

かと言って、ESPr Developer は税込み1,980円なので、少々値段が張ってしまう。複数個作ろうと思うとさらに。以下の記事を参考にしてライターを作れば、ESP-WROOM-02 DIP化キット(650円)に USB 経由でプログラムを書き込めてお手頃になりそう。

DIP というのは Dual Inline Package の略で、IC の両側に脚が出ている形のことだとか。なるほど。

電子工作初心者で分からないことだらけなので、ついでに『超特急Web接続! ESPマイコン・プログラム全集』という本も注文してみた。

ESP8266 と DHT11 で温湿度測定

先月買ったキットに温湿度センサー DHT11 が入っていたので、ESP8266 に温湿度センサー DHT11 をつないで、温度と湿度を測定したい。

今回は以下のサイトを参考にした。

回路図は前者のサイトに従った。

まず、DHT11 を扱うためのライブラリ DHT sensor library をインストールしておく。依存ライブラリは、Arduino IDE からインストールするらしい。

f:id:mimikakimemo:20210118002949p:plain

PratformIOを使うと、依存関係をコード管理できるっぽい?)

DHT11 のデータピンの接続先を、最初は D8 ピンにしていたが、以下のエラーが出てスケッチが書き込めなかった。

Uploading...
esptool.py v2.8
Serial port /dev/tty.usbserial-0001
Connecting........_____....._____....._____....._____.....Traceback (most recent call last):
  File "/Users/***/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/upload.py", line 65, in <module>
    esptool.main(cmdline)
  File "/Users/***/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/esptool/esptool.py", line 2890, in main
    esp.connect(args.before)
  File "/Users/***/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/esptool/esptool.py", line 483, in connect
    raise FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error))
esptool.FatalError: Failed to connect to ESP8266: Timed out waiting for packet header
An error occurred while uploading the sketch
[Error] Exit with code=1

同じような issue を参考にして D6 ピンに変更したところ、解決した。

今回試したソースは以下の通り。温度と湿度を出力するだけの、ごく簡単なプログラム。

#include "DHT.h"

#define DHTPIN D6     // D6 ピンからセンサーの値を得る
#define DHTTYPE DHT11 // DHT 11 を使う

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Serial.begin(115200);
  dht.begin();
}

void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  Serial.println("Temperature: " + String(t, 1) + "°C\tHumidity: " + String(h, 0) + "%");

  delay(2000);
}

出力はこんな感じ。途中で息を吹きかけたので、温度・湿度ともに上昇しているのが分かる。

Temperature: 25.7°C Humidity: 46%
Temperature: 25.7°C    Humidity: 46%
Temperature: 25.7°C    Humidity: 46%
Temperature: 25.7°C    Humidity: 46%
Temperature: 25.7°C    Humidity: 46%
Temperature: 25.7°C    Humidity: 57%
Temperature: 25.8°C    Humidity: 60%
Temperature: 25.7°C    Humidity: 57%
Temperature: 25.7°C    Humidity: 54%
Temperature: 26.1°C    Humidity: 95%
Temperature: 26.7°C    Humidity: 95%
Temperature: 27.1°C    Humidity: 95%
Temperature: 27.3°C    Humidity: 95%
Temperature: 27.6°C    Humidity: 95%
Temperature: 28.1°C    Humidity: 95%

温度の分解能が 1℃ と書かれているサイトもある1が、0.1℃ 単位で値が取得できていた。湿度は 1% 単位。

次は Wifi 経由でデータを送信したい。

ESP8266 の開発を VS Code 上から行う

ESP8266 とか ESP32 とかいうのを使うと、Wifi につながる温湿度センサーなどが安く簡単に作れるらしい。しかも Arduino 互換とのこと。電子工作初心者なのでよくわかっていないが、手持ちのパーツも何もないので、とりあえず「OSOYOO ESP8266ではじめるNodeMCU IoT MQTTプログラミング学習キット」というセットを買ってみた。

Amazon の画像では Ai-Thinker 製のチップ(技適あり)になっているが、届いたのは技適なしのチップだったので、Wifi を使う場合は注意。

今回は、開発環境の構築から。Arduino IDE をそのまま使ってもよいが、VS Code からでも開発できるらしいので、そうしてみる。

  1. Arduino IDE をダウンロードしてインストール。現在のバージョンは 1.8.13
  2. Arduino IDEESP8266 core for Arduino をインストールする。以下の手順はドキュメントのとおり。
    1. Arduino IDE を起動し、Preferences ウィンドウを開く
    2. Additional Boards Manager URLs に https://arduino.esp8266.com/stable/package_esp8266com_index.json と入力し、[OK] をクリックしてウィンドウを閉じる
    3. メニューの Tools > Bord > Boards Manager… をクリックして、Boards Manager ウィンドウを開く
    4. esp8266 を検索し、[Install] ボタンをクリック
  3. Arduino IDE を閉じる
  4. VS Code に MS 製 Arduino 拡張機能をインストール
  5. 画面右下の <Select board type> をクリックして、NodeMCU 1.0 (ESP-12E Module) (esp8266) を選択
    • このあたりのボードの設定は .vscode/arduino.json に保存される様子
  6. USB ケーブルで ESP8266 ボードを接続する
  7. 「ESP8266 が検出されました。ボード設定を変更しますか?」的なトーストが VS Code に出るが、無視する
    • [Yes] を選択した場合、Adafruit Feather HUZZAH ESP8266 (esp8266) に変更されたが、これだとうまく動かない

そして HelloWorld/HelloWorld.ino に、適当なプログラムをコピペした。

void setup()
{
    Serial.begin(115200);
}

void loop()
{
    Serial.println("Hello World!");
    delay(5000);
}

コマンドパレット or エディタ右上のアイコンから、Arduino: Upload を実行して ESP8266 にアップロード。結構時間がかかる。完了後、Arduino: Open serial monitor コマンドで Serial monitor を開いたら、Hello World! という出力が確認できた。

次は LED でも。

参考