Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示

 前回、温度と湿度を測定し、ひとつの4桁の7セグメントLED表示器に交互に表示をしました。表示器は四つのスレーブ・アドレスを設定できるので、2個の7セグメントLED表示器を同時に利用すれば、視認性もよくなります。

 ここでは、複数の測定結果を表示するために、スイッチサイエンスで入手したAdafruitのグラフィック・ディスプレイを利用します。

 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 SSD1306Adafruit 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);
}

 実行例です。

前へ

Arduino UNO R4の登場で広がるArduinoの世界(2)Arduino UNO R4 Minimaを動かしてみる

次へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑥ 温湿度センサSHT40