OLEDディスプレイにCO2濃度の測定結果を表示する(ESP32) | そう備忘録

OLEDディスプレイにCO2濃度の測定結果を表示する(ESP32)

OLEDディスプレイ

0.96 インチの正方形の OLEDディスプレイを手に入れたので ESP32-WROOM-32 に接続して CO2センサー(MH-Z19C)の測定結果をディスプレイに表示してみた。

Co2濃度をOLEDディスプレイに表示

OLED ディスプレイのスペックは以下の通り。

  • ディスプレイのサイズ:0.96 インチ
  • 解像度:128×64 px
  • 電源電圧:3.3V ~ 5V ※
  • ディスプレイコントローラ:SSD1306
  • 信号インターフェース:I2C
  • 表示色:ホワイト
  • I2Cアドレス:0x3C or 0x3D

※ 今回 3.3v と 5V の両方に接続してみたがどちらも問題なく表示された。

以前に LCD(液晶ディスプレイ)で試した時は 3.3V に接続すると表示がかなり暗くなったのが、この製品に関してはその様なことはなかった。

表面

OLEDディスプレイ 表面

裏面

OLEDディスプレイ裏面
  • ピンは左からSDA、SCL、VCC、GND で I2C 接続に対応している
  • I2C アドレスは(見づらいが)0x78 にショートしているので、0x3C になる。反対側の 0x7A にショートすれば 0x3D になる(試してはいない)

CO2センサーについて

二酸化炭素を測定する CO2センサーは MH-Z19C を使用した。

こちらのセンサーは CO2濃度を PWM または UART(シリアル)に出力が可能で、今回は UART 接続した。

MH-Z19C の詳細についてはこちらの記事を参照して欲しい。

配線図

配線図は以下の通り。

Co2濃度をOLEDディスプレイに表示 配線図

尚、今回使用した ESP32-WROOM-32 モジュールのピン配置は ESP32 DEVKIT V1(30ピン)の配置になっている。

基板上では左下のピンは VIN と印刷されているが実際には 5V の端子になっている。

ESP32 DEVKIT V1 のピン配置についてはこちらの記事を参照して欲しい。

また前述したが OLEDディスプレイは 3.3V でも問題なく動作した。

配線図では 5V から電源をとっているが右下の 3V3 からとっても問題なかった。

事前準備

開発環境は Windows10 上の Arduino IDE(v1.8.19)を使用した。

SSD1306ライブラリ

この OLEDディスプレイはディスプレイコントローラに SSD1306 を使用しているので Adafruit SSD1306 ライブラリーが使えるだろうと予想をつけて事前にインストールしておく。

Arduino IDE を起動してツールー>ライブラリを管理でライブラリマネージャーを起動して、”SSD1306″で検索して表示された「Adafruit SSD1306」をインストールした。

Github はこちら

Adafruit SSD1306ライブラリのインストール

スケッチ

CO2 濃度を OLEDディスプレイに表示するスケッチは以下の通り。

/*
 * CO2 Sensor(MH-Z19C)の測定値をOLED(有機ELディスプレイ)に表示する
 * CO2 Sensor:UART接続
 * LCD:I2C
 */

#include <MHZ.h> // CO2 Sensor
#include <Adafruit_SSD1306.h> // OLEDディスプレイ

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define RX_PIN 16 // GPIO16
#define TX_PIN 17 // GPIO17
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C // I2C Address

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
MHZ co2(RX_PIN, TX_PIN, MHZ19C); // CO2 Sensor

void setup() {
    Serial.begin(115200);
    if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        Serial.println(F("SSD1306 allocation failed"));
        for(;;); // Don't proceed, loop forever
    }

    display.display(); // 初期表示はAdafruitのスプラッシュロゴ
    delay(2000);
    display.clearDisplay(); // Buffer Clear

    delay(100);
    if (co2.isPreHeating()) { // 起動してから一定時間待つ
        display.setTextSize(1); // size1(最小)
        display.setTextColor(SSD1306_WHITE);
        display.setCursor(0, 0); // X Y位置
        display.println(F("Preheating"));
        display.display();
        delay(100);
        int x_pos = 0; // X軸位初期置
        int y_pos = 10; // Y軸位初期置

        while (co2.isPreHeating()) {
            delay(5000);
            display.setCursor(x_pos, y_pos); // X Y
            display.cp437(true); // Code Page 437 font(full 256 char)
            display.write('.');
            display.display();
            if (x_pos <= SCREEN_WIDTH){ // 右端に行ったら行を変える
                x_pos +=10;
            } else {
                x_pos =0;
                y_pos +=10;
            }
        }
    }
    // co2.setAutoCalibrate(true); // 自動キャリブレーション
}

void loop() {
    int ppm_uart = co2.readCO2UART();
    Serial.println("CO2:" + String(ppm_uart) + " ppm");
    display.clearDisplay(); // Buffer Clear
    display.setCursor(0, 0); // X Y
    display.println("CO2:" + String(ppm_uart) + " ppm");
    int temperature = co2.getLastTemperature();
    Serial.println("temp:" + String(temperature) + " c");
    display.setCursor(0, 20); // X Y
    display.println("temp:" + String(temperature) + " c");
    display.display();
    // display.startscrollleft(0x00, 0x0F); // 左にスクロール

    delay(120000); // 2分程度間隔をあける
}

補足説明

CO2濃度の取得

MH-Z19C による CO2濃度の取得のロジックに関しては以前の記事を参照して欲しい。

スクロール表示

コメントアウトしているが 70行目を活かすと表示文字列が左にスクロールする。

    // display.startscrollleft(0x00, 0x0F); // 左にスクロール

実行結果

実行時の画像は以下の通り。

1行目に CO2濃度、2行目に温度が表示される。

Co2濃度の測定結果をOLEDディスプレイに表示

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。