Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示
前回、温度と湿度を測定し、ひとつの4桁の7セグメントLED表示器に交互に表示をしました。表示器は四つのスレーブ・アドレスを設定できるので、2個の7セグメントLED表示器を同時に利用すれば、視認性もよくなります。
ここでは、複数の測定結果を表示するために、スイッチサイエンスで入手したAdafruitのグラフィック・ディスプレイを利用します。
●STEMMA QT/Qwiic互換 128x64 OLED モノクロ・ディスプレイの主なスペック
- コントローラ SSD1306
- 電源 3.3V
- スクリーン・サイズ(対角) 1.30インチ
- ピクセル数 128×64
- 色 モノクロ(白色発光)
- インターフェース I2C、アドレス(デフォルト0x3C、A0ジャンパをショートで0x3D(未確認))をジャンパー選択
●接続
温湿度センサSi7021の空いているStemma QT/Qwiicコネクタに、STEMMA QT/Qwiic互換 128x64 OLED モノクロ・ディスプレイを専用のケーブル(いろいろな長さが市販されている)でつなぎます。
●ライブラリの導入
Adafruit SSD1306とAdafruit GFXライブラリが必要です。Adafruit GFXは前回導入しました。また、Adafruit_BusIOなどが必要というメッセージが出たら、すべてインストールしておきます。
●動作を確認するスケッチ
ファイル->スケッチ例->Adafruit_SSD1306→SSD1306_128x64_i2c.inoを読み込みます。
setup{の最初の部分を修正します。
void setup() {
Serial.begin(9600);
while (!Serial) {
delay(10);
}
デモ中の様子です。
このSSD1306_128x64_i2c.inoをデモ表示部分を整理し、シンプルに温度と湿度を表示するように修正します。
- 枠をdrawRect()で描画
- Temperature: と Humidity: を表示
この2点をsetup{}内で実行します。
Loop{}では、温度と湿度を引数としてdispMeasurement()関数を呼び出し、温度と湿度の値を表示します。
// Written by Limor Fried/Ladyada for Adafruit Industries,
#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
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< 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);
while (!Serial) {
delay(10);
}
Serial.println("\n Si7021 sensor +SSD1306");
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.clearDisplay();
display.drawRect(0, 0, display.width(), display.height(), SSD1306_WHITE);
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(4,3);
display.println("Temperature:");
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(4,34);
display.println("Humidity:");
display.display();
delay(200);
}
void loop() {
float Temp = 25.67;
float Humi = 55.0;
dispMeasurement(Temp,Humi); // Draw 'stylized' characters
}
void dispMeasurement(float temp,float humi) {
display.setTextSize(2); // Draw 2X-scale text
display.setCursor(10,17);
display.println(temp);
display.setTextSize(2); // Draw 2X-scale text
display.setCursor(10,46);
display.println(humi);
display.display();
delay(2000);
}
実行例です。
●測定値を表示
上記のスケッチを修正し、温湿度センサSi7021の測定結果を表示するように変更します。
// Written by Limor Fried/Ladyada for Adafruit Industries,
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "Adafruit_Si7021.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_Si7021 sensorSi7021 = Adafruit_Si7021();
void setup() {
Serial.begin(9600);
while (!Serial) {
delay(10);
}
Serial.println("\n Si7021 sensor +SSD1306");
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.clearDisplay();
display.drawRect(0, 0, display.width(), display.height(), SSD1306_WHITE);
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(4,3);
display.println("Temperature:");
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(4,34);
display.println("Humidity:");
display.display();
delay(200);
sensorSi7021.begin();
}
void loop() {
float Temp = sensorSi7021.readTemperature();
float Humi = sensorSi7021.readHumidity();
dispMeasurement(Temp, Humi); // Draw 'stylized' characters
}
void dispMeasurement(float temp,float humi) {
display.setTextSize(2); // Draw 2X-scale text
display.setCursor(10,17);
display.fillRect(10, 17, 70, 16, SSD1306_BLACK);
display.println(temp);
display.setTextSize(2); // Draw 2X-scale text
display.setCursor(10, 46);
display.fillRect(10, 46, 70, 16, SSD1306_BLACK);
display.println(humi);
display.display();
delay(2000);
}
実行例です。