OLED ディスプレイ SSD1306 (I2C) を使ってみる(Arduino)
今回は、OLED ディスプレイ SSD1306(I2C) を使った、
・スケッチ例のデモ表示
・気圧・温度センサモジュール(I2C接続)を接続して、
気圧・温度の表示
をしてみます。
私の製品です。
・OLED ディスプレイ(青)
0.96インチOLED I2C 青 128*64 SSD1306
¥174-
いつもの大陸調達品ですが、
国内通販サイトでも、検索してみました。
”OLED ディスプレイ SSD1306 通販”
などと検索すると、多くのサイトで販売されています。
aitendo
★0.96インチ★OLEDモジュール★I2C★ [OLED096UNO-A]
https://www.aitendo.com/product/18634
¥500-
この製品は、青、白、青/黄色 などの単色表示で、
通信方式は、 I2C(IIC)です。
I2C通信は、通信線が2本というシンプルさで、
ピン数が少ないマイコンなどではありがたいのですが、
通信速度は、SIP通信より低速です。
信号線の名称 | 信号線 | 内容 |
SDA | 共有 | シリアルデータ (Serial Data) |
SCL | 共有 | シリアルクロック (Serial Clock) |
SDA、SCL線は、プルアップの必要があります。 (プルアップする抵抗値は、接続機器に合わせて、 数百Ω~数キロΩを使用することが多い) | ||
- - - - - - I2C通信仕様外 - - - - - - - | ||
VCC | 電源(VCC) | |
GND | グランド(Ground) |
という配線になります。
回路は図の通りです。
この回路図の作図には fritzing を利用させて頂いております。
https://fritzing.org/home/
OLEDSSD1306側 | Arduino UNO側 |
SDA | A4(SDA) |
SCK | A5(SCL) |
VDD | 電源(5V) |
GND | GND |
では、スケッチ例を実行してみます。
今回のOLED ディスプレイ SSD1306 の使用に必要な
ライブラリ群をインストールします。
・Adafruit-GFX-ライブラリ
・Adafruit_SSD1306 ライブラリ
の2つが必要になります。
ライブラリのインストール手順です。
1.Adafruit-GFX-ライブラリのインストール
メニュー「スケッチ」 → 「ライブラリインストール」
→ 「ライブラリ管理」 を選択します。
開いた、ライブラリマネジャ画面の検索欄に、
”Adafruit GFX”
と入力し、
表示された一覧から、
”Adafruit GFX Library” を選択し、
バージョン選択から、最新バージョンを選択し、
〔インストール〕ボタンをクリックします。
インストール内容の選択画面が表示された場合は、
〔Install all〕 をクリックします。
インストールが完了したら、
〔閉じる〕ボタンをクリックします。
※GitHub の Adafruit-GFX-ライブラリ ページから、
https://github.com/adafruit/Adafruit-GFX-Library
ダウンロードして、
メニュー「スケッチ」 → 「ライブラリインストール」
→ 「.ZIP形式のライブラリインストール…」 を選択して、
インストールすることも可能です。
2.Adafruit_SSD1306 ライブラリのインストール
メニュー「スケッチ」 → 「ライブラリインストール」
→ 「ライブラリ管理」 を選択します。
開いた、ライブラリマネジャ画面の検索欄に、
”Adafruit SSD1306”
と入力し、
表示された一覧から、
”Adafruit SSD1306” を選択し、
バージョン選択から、最新バージョンを選択し、
〔インストール〕ボタンをクリックします。
※インストール内容の選択画面が表示された場合は、
〔Install all〕 をクリックします。
インストールが完了したら、
〔閉じる〕ボタンをクリックします。
※GitHub の Adafruit_SSD1306 ライブラリ ページから、
https://github.com/adafruit/Adafruit_SSD1306
ダウンロードして、
メニュー「スケッチ」 → 「ライブラリインストール」
→ 「.ZIP形式のライブラリインストール…」 を選択して、
インストールすることも可能です。
これで、ライブラリのインストールは完了です。
では、サンプル例の
”ssd1306_128x64_i2c” スケッチを実行してみます。
1.Arduino UNO と PC を接続し、
ボード、シリアルポートを選択(設定)します。
メニュー「ツール」
→ 「ボード:xxxxx」 または、→ 「シリアルポート:xxxxx」
2.”ssd1306_128x64_i2” を開きます。
メニュー「ファイル」 → 「スケッチ例」
→ 「Adafruit SSD1306」 → 「ssd1306_128x64_i2c」 を選択します。
3.スケッチの修正を行います。
OLED ディスプレイ SSD1306 のアドレスを
#define SCREEN_ADDRESS 0x3D
↓
#define SCREEN_ADDRESS 0x3C
に変更します。
4.アイコンメニュー「検証」をクリックし、検証します。
5.アイコンメニュー「マイコンボードに書き込む」をクリックし、
マイコンボードに書き込み、実行します。
OLED ディスプレイ SSD1306 に、
文字やグラフィックがデモ表示されます。
このスケッチは、
各図形描画や文字表示関数を、
void setup(void) 関数から呼び出されるかたちで
記述されていますので分かりやすいと思います。
続いて、このArduino UNOに、気圧センサモジュールを
接続し、この気圧、温度を、
OLED ディスプレイ SSD1306 に表示させてみます。
回路は図の通りです。
※使用する気圧センサモジュールは、
”気圧センサモジュールを使ってみる Arduino”
で使用した、気圧センサモジュール BMP180です。
この気圧センサモジュールは、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 );
}
~ 略 ~
アイコンメニュー「検証」をクリックし、検証します。
アイコンメニュー「マイコンボードに書き込む」をクリックし、
マイコンボードに書き込み、実行します。
OLED ディスプレイ SSD13069 に、
文字やグラフィックがデモ表示された後、
気圧と温度が表示されます。
デモが必要ない場合、
void setup(void) 関数内の、
各デモ関数の呼び出しを停止(コメントアウト)します。