CO2モニタ3号機にLCDを追加

先に作成した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プリンタでケースを作るつもりです。

“CO2モニタ3号機にLCDを追加” への2件の返信

    1. ありがとうございます。
      MH-Z19Cは値段も手頃で、しかも秋月で入手できますし、NDIR方式なので結果も信用できそうな値が出力されますのでおすすめです。
      簡単に作れますので、ぜひ試してみてください。

tomono へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)