先に作成したCO2モニタ3号機(MH-Z19C搭載)にキャラクタ液晶を追加しました。今回は凝った表示はせずに、秋月のI2C接続小型LCDモジュール(8×2行)ピッチ変換キットをつないだだけです。電源(3.3V)とGNDとSCL、SDAを配線するだけで動くのだから簡単でいいですね。電源はSeeeduino Xiaoからもらっています。
LCDの表示を行うソースコードはLCDモジュールのAQM0802Aのライブラリで良さげなのがなかったので、直接I2Cで制御しています。
/*
CO2ガスモニタ
*/
#include <Wire.h>
const int ledPin = LED_BUILTIN; // ボード上のLED(PIN_LED_13)
bool errorstat = false;
void error(bool s){
errorstat = s;
if(s){
digitalWrite(ledPin, LOW); // エラー発生、LED点灯
} else {
digitalWrite(ledPin, HIGH); // エラーなし、LED消灯
}
}
// LCD(AQM0802A)の制御
void LcdDat(byte d) {
Wire.beginTransmission(0x3E);
Wire.write(0x40);
Wire.write(d);
Wire.endTransmission();
delayMicroseconds(30);
}
void LcdCmd(byte d) {
Wire.beginTransmission(0x3E);
Wire.write(0x00);
Wire.write(d);
Wire.endTransmission();
delay(2);
}
void InitLCD(){
// OSC,Contrast,Power/ICON/Contrast,Follower
const byte seq1[6] = {0x38,0x39,0x14,0x70,0x56,0x6C};
// ClearDisplay & Display ON
const byte seq2[3] = {0x38,0x01,0x0C};
delay(40);
for(int i=0;i<sizeof seq1;i++) LcdCmd(seq1[i]);
delay(200);
for(int i=0;i<sizeof seq2;i++) LcdCmd(seq2[i]);
}
void PrintLCD(char *txt,uint8_t len){
for(int i=0;i<len;i++){
LcdDat(txt[i]);
}
}
void PrintZNum(uint16_t num){
bool s=true; // ゼロサプレス中
uint16_t d=1000; // 4桁表示
uint16_t n=num;
uint8_t c,p=0,b[8];
if(n>9999) n=9999;
while(d>0){
c=n/d; n=n%d;
d=d/10;
if(d==0) s=false;
if(s==false || c!=0){
b[p++]=c+0x30;
s=false;
} else {
b[p++]=' ';
}
}
PrintLCD((char *)b,p);
}
#define BAUDRATE 9600 // MH-Z19との通信速度(変更不可)
uint16_t CO2;
int8_t DEG;
byte ReadCO2[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
byte SCalOn[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6};
byte SCalOff[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86};
byte RetVal[9];
void setup() {
Wire.begin();
InitLCD();
LcdCmd(0x80 | 0x00); // set address 0x00
//PrintLCD("MH-Z19C ",8);
PrintLCD("CO2 \xc9\xb3\xc4\xde",8);
LcdCmd(0x80 | 0x45); // set address 0x45
PrintLCD("ppm",3);
delay(1000);
Serial.begin(115200);
// 基板上のLED消灯(出力HIGH=消灯)
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
delay(2000);
Serial1.begin(BAUDRATE, SERIAL_8N1); // MH-Z19Cへのシリアルポート
Serial1.write(SCalOn,sizeof SCalOn);
// Serial1.write(SCalOff,sizeof SCalOff);
}
void loop() {
// CO2センサ処理
Serial1.write(ReadCO2,sizeof ReadCO2);
memset(RetVal,0x00,sizeof RetVal);
Serial1.readBytes((char *)RetVal, sizeof RetVal);
if(RetVal[0] == 0xff && RetVal[1] == 0x86){
CO2 = RetVal[2]*256 + RetVal[3];
DEG = RetVal[4]-40;
error(false);
} else {
error(true);
}
LcdCmd(0x80 | 0x40); // set address 0x40
PrintZNum(CO2);
// 通常表示
if(Serial && !errorstat){
//Serial.print(DEG);
//Serial.print(",");
Serial.println(CO2);
}
delay(3000);
}
後で3Dプリンタでケースを作るつもりです。
これ良いですね。私も作ろうと思います。頑張ってくださいね。
ありがとうございます。
MH-Z19Cは値段も手頃で、しかも秋月で入手できますし、NDIR方式なので結果も信用できそうな値が出力されますのでおすすめです。
簡単に作れますので、ぜひ試してみてください。