05_Temp-OLED

温度と湿度をOLEDに表示する

温湿度センサーで測定した値をOLEDディスプレイに表示します。

温湿度センサーモジュールOLEDモジュール
1

準備する

CherryIoTとモジュールを接続する

CherryIoTの指定コネクタに以下のモジュールを接続し、CherryIoTをPCのUSB-A挿入口に接続します。

温湿度センサーモジュール

温湿度センサーモジュール

接続先:A

OLEDモジュール

OLEDモジュール

接続先:B

Arduino IDEに必要なライブラリをインストールする

このサンプルでは、次のライブラリを追加する必要があります。

  • DHT20 by Rob Tillaart
  • Adafruit GFX Library by Adafruit
  • Adafruit SSD1306 by Adafruit

初めて使用する場合のみインストールしてください。

ライブラリをインストールする
2

サンプルコード

GitHubで公開しているサンプルコードです。コードをコピーして Arduino IDEで使用します。

05_Temp-OLED.ino
GitHubで開く
GitHubからコードを読み込んでいます...
3

プログラムを書き込む

上のサンプルコードをコピーし、Arduino IDEに貼りつけます。

ボードとポートの設定を確認し、左上の 「→(書き込みボタン)」を押してCherryIoTに書き込みます。

初めて書き込む方は「はじめてのCherryIoT」で詳しい手順を確認してください。

4

動作確認

Arduino IDEの画面右上にあるアイコンをクリックすると、 画面下にシリアルモニターが表示されます。

Arduino IDEでシリアルモニターを表示する場所

OLEDに現在の温度と湿度が表示されるなら成功です。

動作中、シリアルモニターには温湿度センサーで測定した温度と湿度が表示されます。

5

コードの解説

AとBのI2C通信を順番に開始し、取得した温湿度をOLEDへ描画します。

05_Temp-OLED.ino
GitHubで開く
GitHubからコードを読み込んでいます...

#include <Wire.h>温湿度センサーとOLEDでI2C通信を行うため、Wireライブラリを読み込みます。I2CはSDAとSCLの2本の信号線でデータをやり取りする通信方式です。

#include <DHT20.h>DHT20温湿度センサーを操作するため、DHT20ライブラリを読み込みます。

#include <Adafruit_GFX.h>OLEDへ文字や図形を描く基本機能を使うため、Adafruit GFXライブラリを読み込みます。

#include <Adafruit_SSD1306.h>SSD1306方式のOLEDを操作するため、Adafruit SSD1306ライブラリを読み込みます。

DHT20 DHT;DHT20を操作するDHTオブジェクトを作ります。以降はDHTという名前で測定値を読み取ります。

#define SCREEN_WIDTH 128OLEDの横幅128ピクセルを、SCREEN_WIDTHという名前で定義します。

#define SCREEN_HEIGHT 64OLEDの縦幅64ピクセルを、SCREEN_HEIGHTという名前で定義します。

#define OLED_RESET -1OLED専用のリセット端子を使わないことを示す-1を、OLED_RESETとして定義します。

#define SCREEN_ADDRESS 0x3COLEDのI2Cアドレス0x3Cを、SCREEN_ADDRESSとして定義します。I2Cアドレスは通信相手を識別する番号です。

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);画面サイズ、I2C通信、リセット設定を指定し、OLEDを操作するdisplayオブジェクトを作ります。

void setup() {setup関数は最初に1回だけ実行されます。ここでは測定結果を確認するためのシリアル通信を開始します。

Serial.begin(115200);温度と湿度の測定結果をPCへ表示するため、115200bpsでシリアル通信を開始します。

void loop() {loop関数は繰り返し実行されます。コネクタAの温湿度センサーから値を読み取り、通信先をコネクタBへ切り替えてOLEDに表示します。

Wire.begin(1, 3);コネクタAのSDAに対応するGPIO1とSCLに対応するGPIO3を指定し、温湿度センサーとのI2C通信を開始します。ESP32-C3では同時に1組のI2C端子を使うため、あとで一度終了してOLED側へ切り替えます。

DHT.read();DHT20へ測定を指示し、現在の温度と湿度のデータを読み取ります。

float Temperature = DHT.getTemperature();読み取った温度を取得し、float型の変数Temperatureへ保存します。

float Humidity = DHT.getHumidity();読み取った湿度を取得し、float型の変数Humidityへ保存します。

Serial.print(String(Temperature) + "℃");Temperatureを文字列へ変換し、「℃」を付けてシリアルモニターへ表示します。

Serial.print(" / ");温度と湿度の間に区切りとして「 / 」を表示します。

Serial.println(String(Humidity) + "%");Humidityを文字列へ変換し、「%」を付けて表示して改行します。

delay(200);0.2秒待ちます。

Wire.end();温湿度センサーとのI2C通信を終了し、通信に使う端子をOLED側へ切り替えられるようにします。

Wire.begin(5, 4);コネクタBのSDAに対応するGPIO5とSCLに対応するGPIO4を指定し、OLEDとのI2C通信を開始します。

if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {指定したI2CアドレスのOLEDを初期化します。先頭の!により、初期化に失敗した場合だけ直後の処理へ進みます。

for(;;);OLEDの初期化に失敗した場合は、終了条件のないfor文で処理を止めます。使用できない状態のまま先へ進まないためです。

display.clearDisplay();メモリー上に残っている前回の画面データを消去します。

display.setTextSize(2);表示する文字の大きさを2倍に設定します。

display.setTextColor(SSD1306_WHITE);文字色を白に設定します。

display.setCursor(0, 5);温度を書き始める位置を、左端から0ピクセル、上端から5ピクセルに設定します。

display.print(String(Temperature) + "'C");現在の位置へ温度と「'C」を書き込みます。

display.setCursor(0, 25);湿度を書き始める位置を、左端から0ピクセル、上端から25ピクセルに設定します。

display.print(String(Humidity) + "%");現在の位置へ湿度と「%」を書き込みます。

display.display();メモリー上に作成した温度と湿度の画面データをOLEDへ送り、実際の画面に表示します。

delay(1000);1秒待ちます。

Wire.end();OLEDとのI2C通信を終了し、次の繰り返しで温湿度センサー側へ切り替えられるようにします。