OLED ディスプレイ SSD1306 (I2C) を使ってみる(Arduino)
今回は、OLED ディスプレイ SSD1306(I2C) を使った、
・スケッチ例のデモ表示
・気圧・温度センサモジュール(I2C接続)を接続して、
気圧・温度の表示
をしてみます。
私の製品です。
・OLED ディスプレイ(青)
0.96インチOLED I2C 青 128*64 SSD1306
¥174-
![OLED ディスプレイ(青)](https://shinog.jp/wp-content/uploads/2021/08/OLED_21_02_1.jpg)
いつもの大陸調達品ですが、
国内通販サイトでも、検索してみました。
”OLED ディスプレイ SSD1306 通販”
などと検索すると、多くのサイトで販売されています。
aitendo
★0.96インチ★OLEDモジュール★I2C★ [OLED096UNO-A]
https://www.aitendo.com/product/18634
¥500-
この製品は、青、白、青/黄色 などの単色表示で、
通信方式は、 I2C(IIC)です。
I2C通信は、通信線が2本というシンプルさで、
ピン数が少ないマイコンなどではありがたいのですが、
通信速度は、SIP通信より低速です。
![I2C通信概要図](https://shinog.jp/wp-content/uploads/2021/08/OLED_21_04_1.jpg)
信号線の名称 | 信号線 | 内容 |
SDA | 共有 | シリアルデータ (Serial Data) |
SCL | 共有 | シリアルクロック (Serial Clock) |
SDA、SCL線は、プルアップの必要があります。 (プルアップする抵抗値は、接続機器に合わせて、 数百Ω~数キロΩを使用することが多い) | ||
- - - - - - I2C通信仕様外 - - - - - - - | ||
VCC | 電源(VCC) | |
GND | グランド(Ground) |
という配線になります。
回路は図の通りです。
この回路図の作図には fritzing を利用させて頂いております。
https://fritzing.org/home/
![回路図1](https://shinog.jp/wp-content/uploads/2021/08/OLED_21_03_1.jpg)
OLEDSSD1306側 | Arduino UNO側 |
SDA | A4(SDA) |
SCK | A5(SCL) |
VDD | 電源(5V) |
GND | GND |
では、スケッチ例を実行してみます。
今回のOLED ディスプレイ SSD1306 の使用に必要な
ライブラリ群をインストールします。
・Adafruit-GFX-ライブラリ
・Adafruit_SSD1306 ライブラリ
の2つが必要になります。
ライブラリのインストール手順です。
1.Adafruit-GFX-ライブラリのインストール
メニュー「スケッチ」 → 「ライブラリインストール」
→ 「ライブラリ管理」 を選択します。
![ライブラリのインストール選択](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_002_1.png)
開いた、ライブラリマネジャ画面の検索欄に、
”Adafruit GFX”
と入力し、
表示された一覧から、
”Adafruit GFX Library” を選択し、
バージョン選択から、最新バージョンを選択し、
〔インストール〕ボタンをクリックします。
![”Adafruit GFX Library” の選択](https://shinog.jp/wp-content/uploads/2021/08/ST7789_01_002_1.png)
インストール内容の選択画面が表示された場合は、
〔Install all〕 をクリックします。
![インストール内容の選択](https://shinog.jp/wp-content/uploads/2021/08/ST7789_01_003_1.png)
インストールが完了したら、
〔閉じる〕ボタンをクリックします。
![インストール完了](https://shinog.jp/wp-content/uploads/2021/08/ST7789_01_004_1.png)
※GitHub の Adafruit-GFX-ライブラリ ページから、
https://github.com/adafruit/Adafruit-GFX-Library
ダウンロードして、
![ライブラリのダウンロードページ](https://shinog.jp/wp-content/uploads/2021/08/ST7789_01_017_1.png)
メニュー「スケッチ」 → 「ライブラリインストール」
→ 「.ZIP形式のライブラリインストール…」 を選択して、
インストールすることも可能です。
![Zip型式ライブラリのインストール選択](https://shinog.jp/wp-content/uploads/2021/08/ST7789_01_006_1.png)
2.Adafruit_SSD1306 ライブラリのインストール
メニュー「スケッチ」 → 「ライブラリインストール」
→ 「ライブラリ管理」 を選択します。
![ライブラリのインストール選択](https://shinog.jp/wp-content/uploads/2021/08/ST7789_01_001_1.png)
開いた、ライブラリマネジャ画面の検索欄に、
”Adafruit SSD1306”
と入力し、
表示された一覧から、
”Adafruit SSD1306” を選択し、
バージョン選択から、最新バージョンを選択し、
〔インストール〕ボタンをクリックします。
![”Adafruit SSD1306” の選択](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_003_2.png)
※インストール内容の選択画面が表示された場合は、
〔Install all〕 をクリックします。
インストールが完了したら、
〔閉じる〕ボタンをクリックします。
![インストール完了](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_004_2.png)
※GitHub の Adafruit_SSD1306 ライブラリ ページから、
https://github.com/adafruit/Adafruit_SSD1306
ダウンロードして、
![ライブラリのダウンロードページ](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_005_2.png)
メニュー「スケッチ」 → 「ライブラリインストール」
→ 「.ZIP形式のライブラリインストール…」 を選択して、
インストールすることも可能です。
![Zip型式ライブラリのインストール 選択](https://shinog.jp/wp-content/uploads/2021/08/ST7789_01_006_2.png)
これで、ライブラリのインストールは完了です。
では、サンプル例の
”ssd1306_128x64_i2c” スケッチを実行してみます。
1.Arduino UNO と PC を接続し、
ボード、シリアルポートを選択(設定)します。
メニュー「ツール」
→ 「ボード:xxxxx」 または、→ 「シリアルポート:xxxxx」
![ボード、シリアルポートの選択](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_007_1.png)
2.”ssd1306_128x64_i2” を開きます。
メニュー「ファイル」 → 「スケッチ例」
→ 「Adafruit SSD1306」 → 「ssd1306_128x64_i2c」 を選択します。
![スケッチ例の選択](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_006_1.png)
3.スケッチの修正を行います。
OLED ディスプレイ SSD1306 のアドレスを
#define SCREEN_ADDRESS 0x3D
↓
#define SCREEN_ADDRESS 0x3C
に変更します。
4.アイコンメニュー「検証」をクリックし、検証します。
![検証](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_008_1.png)
5.アイコンメニュー「マイコンボードに書き込む」をクリックし、
マイコンボードに書き込み、実行します。
![マイコンボードへ書き込み](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_009_1.png)
OLED ディスプレイ SSD1306 に、
文字やグラフィックがデモ表示されます。
このスケッチは、
各図形描画や文字表示関数を、
void setup(void) 関数から呼び出されるかたちで
記述されていますので分かりやすいと思います。
![実行結果表示](https://shinog.jp/wp-content/uploads/2021/08/OLED_21_32_1.jpg)
続いて、このArduino UNOに、気圧センサモジュールを
接続し、この気圧、温度を、
OLED ディスプレイ SSD1306 に表示させてみます。
回路は図の通りです。
![回路図2](https://shinog.jp/wp-content/uploads/2021/08/OLED_21_23_1.jpg)
※使用する気圧センサモジュールは、
”気圧センサモジュールを使ってみる Arduino”
で使用した、気圧センサモジュール BMP180です。
![気圧センサモジュール BMP180](https://shinog.jp/wp-content/uploads/2021/08/IMG_5325_1.jpg)
この気圧センサモジュールは、I2C接続なので、
OLED ディスプレイ SSD1306 と 同じ I2C 回路に
接続して使用してみます。
このセンサは、3.3V仕様なので、
3.3V端子から電源を供給して使用します。
スケッチは、
サンプル例の ”ssd1306_128x64_i2c” スケッチに、
気圧センサモジュール BMP180関連の記述を
追加することにします。
このスケッチでは、
気圧センサモジュール BMP180 用に、
・Adafruit BMP085 Library
のライブラリのインストールが必要です。
インストールは、
”気圧センサモジュールを使ってみる” ページ https://shinog.jp/computer/arduino/%e6%b0%97%e5%9c%a7%e3%82%bb%e3%83%b3%e3%82%b5%e3%83%a2%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/
に記載しています。
追加スケッチは、
1.グローバル領域に、インクルード宣言とオブジェクト生成
2.void setup(void) 関数に、センサの初期化と
花びら表示のループ停止
3.void loop() 関数に、気圧・温度の取得と表示
の3点について追加、修正します。
1.の部分
(グローバル領域に、インクルード宣言、変数宣言、オブジェクト生成)
// インクルード宣言
#include <Adafruit_BMP085.h> // 気圧センサ用
// 変数宣言
double t_data; // 温度情報用
double d_data; // 気圧情報用
// オブジェクト生成
Adafruit_BMP085 a_bmp;
2.の部分
void setup(void) 関数に、センサの初期化と花びら表示のループ停止
void setup() {
// 気圧センサ起動
if ( !a_bmp.begin() ) {
Serial.println( "センサ起動エラー" );
while(1); // エラー時の強制ループ
}
// 花びら表示関数の呼び出し停止
// testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}
3.の部分
void loop() 関数に、気圧・温度の取得と表示
void loop() {
// 温度情報取得
t_data = a_bmp.readTemperature();
// 気圧情報取得
d_data= (double)a_bmp.readPressure()/100;
// OLED ディスプレイ SSD1306へ表示
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println( t_data );
display.println( d_data );
display.display();
// 2000ms待機
delay( 2000 );
}
スケッチの追加修正部分( 1, 2, 3の部分 )の抜粋です。
~ 略 ~
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// インクルード宣言
#include <Adafruit_BMP085.h> // 気圧センサ用
// 変数宣言
double t_data; // 温度情報用
double d_data; // 気圧情報用
// オブジェクト生成
Adafruit_BMP085 a_bmp;
// 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 4 // 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() {
Serial.begin(9600);
// 気圧センサ起動
if ( !a_bmp.begin() ) {
Serial.println( "センサ起動エラー" );
while(1); // エラー時の強制ループ
}
// 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
}
~ 略 ~
// Invert and restore display, pausing in-between
display.invertDisplay(true);
delay(1000);
display.invertDisplay(false);
delay(1000);
// 花びら表示関数の呼び出し停止
// testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}
void loop() {
// 温度情報取得
t_data = a_bmp.readTemperature();
// 気圧情報取得
d_data= (double)a_bmp.readPressure()/100;
// OLED ディスプレイ SSD1306へ表示
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println( t_data );
display.println( d_data );
display.display();
// 2000ms待機
delay( 2000 );
}
~ 略 ~
アイコンメニュー「検証」をクリックし、検証します。
![検証](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_010_1.png)
アイコンメニュー「マイコンボードに書き込む」をクリックし、
マイコンボードに書き込み、実行します。
![マイコンボードへ書き込み](https://shinog.jp/wp-content/uploads/2021/08/OLED_01_011_1.png)
OLED ディスプレイ SSD13069 に、
文字やグラフィックがデモ表示された後、
気圧と温度が表示されます。
![実行結果表示](https://shinog.jp/wp-content/uploads/2021/08/OLED_21_42_1.jpg)
デモが必要ない場合、
void setup(void) 関数内の、
各デモ関数の呼び出しを停止(コメントアウト)します。