日別アーカイブ: 2021年2月4日

M5Stack + MHZ19C + WiFi (Local/http)

TODO あとでちゃんと書きなおす(余裕があれば)

飛ばす方 ソース

#include <M5Stack.h>
#include <MHZ19.h>
#include <WiFi.h>
#include <HTTPClient.h>

#define RX 16
#define TX 17
#define INTERVAL 6

const char* ssid     = "XXXXXXX";
const char* password = "XXXXXXX";

MHZ19 myMHZ19;

HardwareSerial  mySerial(1);

void setup(){

  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextSize(5);
  M5.Lcd.print("start");

  Serial.begin(115200);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.println("\r\n connected");
  M5.Lcd.print(WiFi. localIP());

  mySerial.begin(9600,SERIAL_8N1,RX,TX);
  delay(100);
  myMHZ19.begin(mySerial);
  myMHZ19.autoCalibration(false);

  delay(2000);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
    displayCo2(co2);
    doPost(co2);
  } else {
     M5.Lcd.print(".");
  }
  count++;
  delay(1000);
}

void displayCo2(int co2) {
  M5.Lcd.clear(); 
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.println("CO2 ppm");
  M5.Lcd.print(co2);
}

void doPost(int co2){
  char json[30];
  sprintf(json, "{\"co2\": \"%d\"}", co2);
  Serial.println(json);
  
  HTTPClient http;
  http.begin("http://192.168.1.3:8081/");
  http.addHeader("Content-Type", "application/json");
  int httpCode = http.POST(json);
  delay(1000);
  Serial.printf("[HTTP] GET... code: %d\n", httpCode);
  http.end();
     
}

受けるほう ソース index.ts (雰囲気)

import express from 'express'
import moment from 'moment'


const app: express.Express = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use(express.static('public'))

app.listen(8081, () => {
  console.log('Running at Port 8081...')
})


app.post('/', (req, res)=> {
  console.log("call")

  // console.log(moment().format())
  console.log(req.body )
  res.send('OK')
})

app.use((req, res) => {
  res.sendStatus(404)
})

URLの指定で末尾の/が抜けているとM5Stackがエラー&リブートを繰り返した。結構はまった。

試験用の配線は前のブログ参照。まだ、試験用でMHZへの電力がたぶんたりてないはず。

MH-Z19CとM5Stack(basic)の接続

(2021.4.27追記)MHZ19というライブラリを使っていますがMHZ19B用に調整された処理が入っているのでCを使う場合は、MHZ19_uartというライブラリの方が良さそうです。

githubにソースあげておきました。(github)

とり急ぎ、MH-Z19CとM5Stackを直結で動かす。機能は表示のみ。電圧は満たしていないのでソフトがプログラムが動く確認までの目的。電源まわりはきちんと作り直さないと数値は大体。(それでも多分うちのかDM306以外の一万円未満のセンサーよりはよいきがする。これで5/1時点でCO2-miniかうちの以外の1万円未満センサーよりは性能良い)

MH-Z19Cは5Vプラマイ0.1Vを要求して守らないと値が不安定になる。「ゆうても大丈夫だろ」と雑にやるとずれます。

配線は、左がM5Stackで右がMH-Z19Cで以下のようにつなぐ。16,17はプログラムで指定しているので変更可能。

  • 5V からVIN
  • G から GND
  • 16 から TX
  • 17 から RX

プログラム。いつもどおりMITライセンスです(ライブラリはLGPL使っているので書き込んだらLGPL)

#include <M5Stack.h>
#include <MHZ19.h>

#define RX 16
#define TX 17
#define INTERVAL 6

MHZ19 myMHZ19;

HardwareSerial  mySerial(1);

void setup(){

  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextSize(5);
  M5.Lcd.print("start");

  mySerial.begin(9600,SERIAL_8N1,RX,TX);
  delay(100);
  myMHZ19.begin(mySerial);
  myMHZ19.autoCalibration(false);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
  }
  displayCo2(co2, (count % 2));
  count++;
  delay(1000);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
    displayCo2(co2 );
  } else {
     M5.Lcd.print(".");
  }
  count++;
  delay(1000);
}

void displayCo2(int co2) {
  M5.Lcd.clear(); 
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.println("CO2 ppm");
  M5.Lcd.print(co2);
}