トップ «前の日記(2025/06/29(Sun)) 最新 次の日記(2025/07/19(Sat))» RSS

titletitle


2025/07/12(Sat) [長年日記]

uk-icon [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に描画する
}

画像の説明