Aizu Advent Calendar 2020の13日目の記事です
埋まってなくて、かつ投稿率があれだったので遅れて参加しました()
以前やったこれをESP32(m5stack)でやりたくなった
使うセンサーはmh-z19とbme280
よしなに作ったサーバーに対して、ESP32から定期的にPOSTするのを作る
mh-z19はRX(16pin) TX(17pin)で、bme280はよしなに配線
tinygoはESP32には一部対応したけれど、まだUARTの読み取りができなかったり、I2Cもできなかったりするので、Arduino IDEを使う
使うライブラリは
コード
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();
}
モニター裏から電源供給してこんな感じに完成した
パーマセルテープで無理やり固定している

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

終