ESP32-CAMはESP32-WROOMのGPIOをほぼ使い尽くしていて、空きピンはGPIO-16の1本のみしかない。
GPIO-0はFirmwareの書き込みモードにするときに使うので使用できない。
U0TXDとU0RXDを流用した。
このピンはシリアルコンソールとしてデバッグに使用する以外に、Firmwareを書き込むためのピンにも使われている。
Firmware書き込み時以外は自由に使えるので、シリアルコンソールをあきらめれば2本解放できる。
ESP32はI2Cピンを任意のピンに再アサインできるので、シリアルポートにI2Cを割り当てた。
OLEDのライブラリはこちらを使用した。
https://github.com/ThingPulse/esp8266-oled-ssd1306
このライブラリは使い勝手が良いが、スクロール機能を持っていないのが唯一の難点。
OLEDの焼き付き防止については、一定時間表示したら消すのと、ノーマル&リバースを切り替える方法がある。寿命的には前者が良いが、とりあえずノーマル&リバース切り替えで使ってみよう。
OLED | ESP32 |
VCC | VCC(3.3V) |
GND | GND |
SCL | GPIO-1(U0TXD) |
SDA | GPIO-3(U0RXD) |
#include <Wire.h> #include <SSD1306Wire.h> SSD1306Wire display(0x3c, 3, 1, GEOMETRY_128_64); Wire.begin();
SDカードを使用しない場合はUARTをデバッグ用に生かしたまま接続可能。
SDカード用IOを転用する。
OLED | ESP32 |
VCC | VCC(3.3V) |
GND | GND |
SCL | GPIO-15(CLK) |
SDA | GPIO-14(CMD) |
#include <Wire.h> #include <SSD1306Wire.h> SSD1306Wire display(0x3c, 15, 14, GEOMETRY_128_64); Wire.begin();
app_httpd.cppを編集して、LEDを点灯させるコマンドを追加する。
適当な時間点灯させてから、撮影し、その後消灯させる。
適当な時間点灯させるのは、カメラのAEを安定させるため。
これで、静止画撮影時にLEDが光る。
フラッシュ用LEDは、GPIO-4につながっている。
void setup() { : pinMode(4, OUTPUT); }
このLEDには電流制限抵抗が無いので長時間光らせるのは怖い。
よって、必要最小限の点灯時間とする。
ここでは実験の結果250msにしている。
captureハンドラー関数の頭にLED点灯を追加する。 点灯させてから撮影までの待ち時間(ここでは250ms)も追加する。
static esp_err_t capture_handler(httpd_req_t *req){ // LED ON digitalWrite(4, HIGH); delay(250);
他、複数あるreturnの直前行にLED消灯を追加
digitalWrite(4, LOW); // LED OFF return ESP_FAIL;
digitalWrite(4, LOW); // LED OFF return res;
どんな結果であっても、LEDを消灯させてから抜けるように。
I2Cが使用できるようになったので、BME280(気圧・温度・湿度)を接続して、
定期的に測定した結果をOLEDに表示させるようにした。
最終的にはカメラ撮影時のWebサーバから参照したい。
こちらのサンプルコードがそのまま使用できた。
http://trac.switch-science.com/wiki/BME280
メインループ内でOLED表示を白黒反転を繰り返し表示させているので、ここで
測定して結果を整形してIPアドレスと共にOEDに表示させるだけ。
測定結果の数値はdouble型の変数に格納されているので、Stringでキャストして
OLEDに送った。
スケッチにFLASHメモリーを67%使用。