ESP32(m5stack)で部屋の部屋のCO2濃度とかモニタリングする

ESP32(m5stack)で部屋の部屋のCO2濃度とかモニタリングする

ガジェット

Aizu Advent Calendar 2020の13日目の記事です
埋まってなくて、かつ投稿率があれだったので遅れて参加しました()

以前やったこれをESP32(m5stack)でやりたくなった

Software Design 2020年10月号に寄稿しました。 https://gihyo.jp/magazine/SD/archive/2020/2020…
www.nozograph.com

使うセンサーはmh-z19とbme280

created by Rinker
LaDicha
¥3,899 (2020/12/29 18:06:41時点 Amazon調べ-詳細)
B07B3VGGNLnzmt-22

よしなに作ったサーバーに対して、ESP32から定期的にPOSTするのを作る

mh-z19はRX(16pin) TX(17pin)で、bme280はよしなに配線
tinygoはESP32には一部対応したけれど、まだUARTの読み取りができなかったり、I2Cもできなかったりするので、Arduino IDEを使う

使うライブラリは

📟 JSON library for Arduino and embedded C++. Simple and efficient. - bblanchon/A…
github.com
MH-Z19 CO2 sensor library for ESP8266 or Arduino. Contribute to crisap94/MHZ19 d…
github.com
Arduino Library for BME280 sensors. Contribute to adafruit/Adafruit_BME280_Libra…
github.com

コード

Wifiがよく切れるのでloop毎に接続をチェックしている
だいたい一分ごとにPOSTするようにしている

#include <Adafruit_BME280.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <SoftwareSerial.h>
#include <WiFi.h>
#include "MHZ19.h"          

#define RX_PIN 16
#define TX_PIN 17
#define BAUDRATE 9600
#define WIFISSID "WIFISSID"
#define PASSWORD "WIFIPASS"
#define APIURL "APIPATH"
#define INTERVAL 60000

Adafruit_BME280 bme280;
MHZ19 mhz19;
SoftwareSerial co2Serial(RX_PIN, TX_PIN);

float temp;
float pressure;
float humid;
float co2;
unsigned bme280status;

void setup() {
  Serial.begin(9600);
  while(!Serial);

  connectWifi();

  co2Serial.begin(BAUDRATE);
  mhz19.begin(co2Serial);
  mhz19.autoCalibration();
  bme280status = bme280.begin();  
  while (!bme280status) {
    Serial.println("can not use bme280");
    bme280status = bme280.begin(0x76);
    delay(1000);
  }
}

void loop() { 
  temp=bme280.readTemperature();
  pressure=bme280.readPressure();
  humid=bme280.readHumidity();
  co2 = mhz19.getCO2();

  printData();
  sendRequest();
  delay(INTERVAL);
}

void printData() {
  Serial.print("温度:");
  Serial.print(temp);
  Serial.println("°C");
  Serial.print("気圧:");
  Serial.print(pressure);
  Serial.println("hPa");
  Serial.print("湿度:");
  Serial.print(humid);
  Serial.println("%");
  Serial.print("二酸化炭素濃度:");
  Serial.print(co2);
  Serial.println("ppm");
}

void connectWifi() {
  WiFi.begin(WIFISSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print("connectiong to wifi");
    delay(1000);
  }
}

const int capacity = JSON_OBJECT_SIZE(4);
StaticJsonDocument<capacity> json_request;
void sendRequest() {
  if (WiFi.status() != WL_CONNECTED) {
    connectWifi();
  }
  
  char buffer[4096];
  json_request["co2"] = (int)co2;
  json_request["humidity"] = (int)humid*100;
  json_request["pressure"] = ((int)pressure)/ 100;
  json_request["temperature"] = (int)temp*100;
  serializeJson(json_request, buffer, sizeof(buffer));
  HTTPClient http;
  http.begin(APIURL);
  http.addHeader("Content-Type", "application/json");
  int status_code = http.POST((uint8_t*)buffer, strlen(buffer));
  if ( status_code == 201 ) {
     Serial.print("success request");
  }
  http.end();
}

モニター裏から電源供給してこんな感じに完成した
パーマセルテープで無理やり固定している

完成図

こんな感じにデータが送られてる