CO2 センサーを作成し使用を開始して約1年経った頃からOLEDの表示が暗くなった様に見え、よく見るとドット欠けも発生しています。
同じ位置に長期間表示していた結果OLEDが焼き付きを起こしドット欠けや表示が暗くなったようです。
OLEDの寿命がどれくらいなのかは不明ですが意外と早く表示不良が起きました。
そこで、押しボタンスイッチを取り付けボタンを押した時だけOLEDに表示させるように改良することにします。
Blynkローカルサーバーを使用しているので、スマフォではリアルタイムにCO2濃度をモニターできます。
またLEDの点滅でもある程度のCO2濃度も分かりますのでOLEDに常時表示する必要もなさそうです。
作成したCO2センサーの過去記事
書き加えたスケッチ
以前のスケッチに押しボタンを押した時だけOLEDにCO2濃度を表示させるように書き加えます。
変更したスケッチです
/* CO2Monitor
* CO2センサーMH-Z19E
* OLED1.3inch SH1106
* CO2濃度を スイッチが押されたときOLEDに表示する
* 2025/11/10
* BLYNK Local Server の使用を前提にしたスケッチです
*/
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
/*OLED設定*/
#define i2c_Address 0x3c
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
/*LED_pin*/
int LED_Blue = 1 ;
int LED_Green = 3 ;
int LED_Yellow = 14 ;
int LED_Red = 16 ;
/*display SW */
#define SW 2 // GPIO2とGND間に押しボタンスイッチを取り付け
/* Blynk Auth Token and WiFi credentials */
#define AUTH_TOKEN "Your AUTH_TOKEN"
#define WIFI_SSID "Your SSID"
#define WIFI_PASS "Your Pass"
/* Define ESP8266 TX RX pin */
#define ESP8266_TX 12
#define ESP8266_RX 13
/* MH-Z19 Commands */
byte cmd_read_co2[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
byte cmd_calibrate_zero[9] = {0xFF,0x01,0x87,0x00,0x00,0x00,0x00,0x00,0x78};
byte cmd_Self_calibration_off[9] = {0xFF,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x86}; // Self-calibration OFF
byte cmd_Self_calibration_on[9] = {0xFF,0x01,0x79,0xA0,0x00,0x00,0x00,0x00,0xE6}; // Self-calibration ON
byte cmd_detection_range_2000[9] = {0xFF,0x01,0x99,0x00,0x00,0x00,0x07,0xD0,0x8F}; // 0~2000ppm
byte cmd_detection_range_5000[9] = {0xFF,0x01,0x99,0x00,0x00,0x00,0x13,0x88,0xCB}; // 0~5000ppm
/* Global Objects */
SoftwareSerial co2Serial (ESP8266_RX, ESP8266_TX) ;
BlynkTimer timer;
/* Calibration Button*/
BLYNK_WRITE(V2) {
if (param.asInt()) {
co2Serial.write(cmd_calibrate_zero, 9);
}
}
/* Soft reset Button*/
BLYNK_WRITE(V6) {
if (param.asInt()) {
ESP.restart();
}
}
void sendSensor() {
unsigned char response[9]; // for answer
co2Serial.write(cmd_read_co2, 9); // request PPM CO2
co2Serial.readBytes(response, 9);
unsigned int responseHigh = (unsigned int) response[2];
unsigned int responseLow = (unsigned int) response[3];
int ppm = (256 * responseHigh) + responseLow;
Blynk.virtualWrite(V1, ppm);
bool currentSwitchState = digitalRead(SW); //スイッチの状態を読み取る
if (currentSwitchState == LOW ) { //スイッチが押されたらOLEDに表示する
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
display.setTextSize(1);
display.setCursor(15, 10);
display.println("CO2-Monitor(PPM)");
display.setTextSize(2);
display.setCursor(15, 35);
display.println("CO2: ");
display.setCursor(65, 35);
display.println(ppm);
display.display();
}
else if (currentSwitchState == HIGH){ //スイッチが押されない場合はOLED非表示
display.clearDisplay();
display.display();
}
if (ppm >= 3000) {
digitalWrite(LED_Red, HIGH);
digitalWrite(LED_Yellow, HIGH);
digitalWrite(LED_Green, HIGH);
digitalWrite(LED_Blue, HIGH);
delay(1000);
digitalWrite(LED_Red, LOW);
delay(1000);
}
else if (ppm > 2000) {
digitalWrite(LED_Red, LOW);
digitalWrite(LED_Yellow, HIGH);
digitalWrite(LED_Green, HIGH);
digitalWrite(LED_Blue, HIGH);
delay(1000);
digitalWrite(LED_Yellow, LOW);
delay(1000);
}
else if (ppm > 1000) {
digitalWrite(LED_Red, LOW);
digitalWrite(LED_Yellow, LOW);
digitalWrite(LED_Green, HIGH);
digitalWrite(LED_Blue, HIGH);
delay(1000);
digitalWrite(LED_Green, LOW);
delay(1000);
}
else {
digitalWrite(LED_Red, LOW);
digitalWrite(LED_Yellow, LOW);
digitalWrite(LED_Green, LOW);
digitalWrite(LED_Blue, HIGH);
delay(1000);
digitalWrite(LED_Blue, LOW);
delay(1000);
}
}
void setup() {
Serial.begin(115200);
co2Serial.begin(9600);
display.begin(i2c_Address, true);
display.clearDisplay();
display.display();
/*LED設定*/
pinMode(LED_Blue, OUTPUT);
pinMode(LED_Green, OUTPUT);
pinMode(LED_Yellow, OUTPUT);
pinMode(LED_Red, OUTPUT);
/*display SW*/
pinMode(SW, INPUT_PULLUP); // 内蔵プルアップ抵抗を有効にする
/* Initialize MH-Z19E */
// co2Serial.write(cmd_Self_calibration_on, 9); // 自己校正機能は使わない
co2Serial.write(cmd_detection_range_5000, 9);
/* Initialize Blynk */
Blynk.begin(AUTH_TOKEN, WIFI_SSID, WIFI_PASS, IPAddress(192, 168, ***, *** ), 8080);
/* Initialize BlynkTimer */
timer.setInterval(3000, sendSensor); // every 2 seconds
}
void loop() {
Blynk.run();
timer.run();
}
