OLEDディスプレイにCO2濃度の測定結果を表示する(ESP32)
Contents
OLEDディスプレイ
0.96 インチの正方形の OLEDディスプレイを手に入れたので ESP32-WROOM-32 に接続して CO2センサー(MH-Z19C)の測定結果をディスプレイに表示してみた。
OLED ディスプレイのスペックは以下の通り。
- ディスプレイのサイズ:0.96 インチ
- 解像度:128×64 px
- 電源電圧:3.3V ~ 5V ※
- ディスプレイコントローラ:SSD1306
- 信号インターフェース:I2C
- 表示色:ホワイト
- I2Cアドレス:0x3C or 0x3D
※ 今回 3.3v と 5V の両方に接続してみたがどちらも問題なく表示された。
以前に LCD(液晶ディスプレイ)で試した時は 3.3V に接続すると表示がかなり暗くなったのが、この製品に関してはその様なことはなかった。
表面
裏面
- ピンは左からSDA、SCL、VCC、GND で I2C 接続に対応している
- I2C アドレスは(見づらいが)0x78 にショートしているので、0x3C になる。反対側の 0x7A にショートすれば 0x3D になる(試してはいない)
CO2センサーについて
二酸化炭素を測定する CO2センサーは MH-Z19C を使用した。
こちらのセンサーは CO2濃度を PWM または UART(シリアル)に出力が可能で、今回は UART 接続した。
MH-Z19C の詳細についてはこちらの記事を参照して欲しい。
配線図
配線図は以下の通り。
尚、今回使用した 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 はこちら。
スケッチ
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行目に温度が表示される。
以上で今回の記事は終了とする。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント