2025/07/12(Sat) [長年日記]
[hard] シリアルOLED液晶ディスプレイモジュール I2C SSD1306用0.91インチOLEDをArduino Nano Everyで使う
そもそもはAliExpressで見つけて買おうかと思ってたのだが、2個買うとAmazonで買っても送料の関係で値段が変わらないのでAmazonで買ったのだった。
届いたら思ったよりも小さくて、ゲッとなったけど取り敢えず使ってみようかと。よく考えたら、0.91インチなので当然なのだが。
調べたところ、Adafruit GFX LibraryとAdafruit_SSD1306というライブラリをArduino IDEからインストールしてincludeしてやれば使える。
GitHub - adafruit/Adafruit_SSD1306にサンプルがあるのでそれを参考にして試行錯誤して、以下のソースコードで画像の表示をすることができた。フォントも変えたかったのだが、小さいフォントが見つからなかったので諦めた。
ちなみに、以下のサンプルは1秒毎に表示が点滅します。
#include#include #include #include //#include #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) // The pins for I2C are defined by the Wire-library. // On an arduino UNO: A4(SDA), A5(SCL) // On an arduino MEGA 2560: 20(SDA), 21(SCL) // On an arduino LEONARDO: 2(SDA), 3(SCL), ... #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { // put your setup code here, to run once: Serial.begin(9600); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } // Show initial display buffer contents on the screen -- // the library initializes this with an Adafruit splash screen. // Clear the buffer display.clearDisplay(); } void loop() { display.clearDisplay(); // LCDのクリア display.display(); // LCDの描画をしてクリアを適用 delay(1000); disp_temp_and_level(88.88, 88); // 温度とアクセル開度を引数に入れる delay(1000); } // 温度とアクセル開度をLCDに表示するサンプル void disp_temp_and_level(float temp, int lv) { display.setTextSize(1); // Normal 1:1 pixel scale display.setTextColor(SSD1306_WHITE); // Draw white text display.setCursor(0,0); // Start at top-left corner display.println(F("Water Temp")); float f_dot = 0; // 温度の小数部分 int i_temp = 0; // 温度の整数部分 int i_dot = 0; // 小数部分を整数にしたもの i_temp = (int)temp; display.setCursor(0,10); // 温度を表示する座標 display.setTextSize(3); // 3倍の大きさのフォント char buf[10], buf2[10]; sprintf(buf, "%03d", i_temp); // 温度の整数部分を3桁で表示 display.write(buf); // 温度の整数部分を表示 display.setCursor(48,16); // 温度の小数点以降の表示座標 display.setTextSize(2); // Draw 2X-scale text f_dot = temp - i_temp; i_dot = (int)(f_dot * 10); // 温度の小数部分を1桁で得る sprintf(buf2, ".%d", i_dot); display.write(buf2); // 温度の小数部分を表示 display.setTextSize(1); // Normal 1:1 pixel scale display.setCursor(67,10); // ℃を表示する座標 display.cp437(true); // ゜を表示するための指定 display.write(167); // ゜を表示する display.print("C"); // 上下で℃と表示 display.setTextSize(1); // Normal 1:1 pixel scale display.setCursor(77,0); // 座標を移動 display.println(F("Accel Lv")); display.setTextSize(3); // 3倍のフォントサイズ display.setCursor(90,10); // アクセル開度の表示座標 display.println(lv); // アクセル開度を表示 display.display(); // LCDに描画する }
[ツッコミを入れる]