こんばんは、よつばです。
ESP8266 ESP-WROOM-02でOLED(有機EL) SSD1306が表示できなかった件、解決しました。
この記事の続きです。
→ ESP-WROOM-02でOLED(有機EL) SSD1306が動作しない (1)
→ ESP-WROOM-02でOLED(有機EL) SSD1306が動作しない (2)
前の記事で動かない旨、書いていたところ、コメント欄で「通りすがり」さんから情報を頂きました。
どうやらボード「esp8266」のバージョンが2.4.0-rc1では、AdafruitのGFXライブラリでExceptionがでて動作しないようです。
→print() throws exception on 2.4.0-rc1 with Adafruit GFX libraries #3589
解決策は2.3.0にすることだそうです。
私のボードのバージョンを確認したところ、まさに2.4.0-rc1でした。そこでツール -> ボード -> ボードマネージャからバージョンを2.3.0に変更し、更新しました。
動作確認
文字列を表示するプログラムを実行したところ、無事表示できました。
感動です。情報くださった方にとても感謝しております。
追加実装
正常に使えるようになったので、早速文字がスクロールするようにしてみました。
ソースコード
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 2 Adafruit_SSD1306 display(OLED_RESET); // 初期化 void setup() { Serial.println("Setup Start"); Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); Serial.println("Setup End"); } int posX1 = 0; int posX2 = 0; // 繰り返し void loop() { display.clearDisplay(); // 画面バッファをクリア display.setTextSize(1); // 横6ドットx縦16ドットの文字サイズ display.setTextColor(WHITE); posX1 = (posX1 + 1) % 128; // スクロール度合い(画面幅128ドット) display.setCursor(56 - posX1, 0); // 描画開始位置(56=128-6ドット*11文字) display.println("Hello World"); display.setTextSize(2); // 横12ドットx縦32ドットの文字サイズ display.setTextColor(WHITE); posX2 = (posX2 + 2) % 128; // スクロール度合い(↑より速いスクロール) display.setCursor(44 - posX2, 16); // 描画開始位置(44=128-12ドット*7文字) display.println("Welcome"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(31, 40); // 中央位置(31=(128-6x11)/2) display.println("OpenBetaLab"); display.display(); delay(1); }
このディスプレイ、幅128x高さ64ドットで、上部16ドットは黄色、下部48ドットは青色でした。
display.setCursor()でx座標に56や44としているのは、xが128だと画面から右にはみ出た部分は折り返して下部にでてしまうためです(下部の文字と重なって表示される)。簡易的な対策として、折り返しが発生しないよう、表示文字数×6ドット分、左にずらした位置からスクロール開始としました。
一般的なスクロールのイメージでは、右端から1文字ずつ入ってくると思うので、改良するとしたら、スクロール度合いに応じて表示文字列を削ることを考えています。
まとめ
最新バージョンではなく、以前のバージョンに変更することでESP-WROOM-02(ESP8266)でOLED SSD1306を制御できるようになりました。
解決までの軌跡として、前の記事も残しておきます。文字のスクロールを実装しました。
2 Replies to “ESP-WROOM-02でOLED(有機EL) SSD1306が動作しない (3) → 解決しました”