Files
ESP32/ESP32_MQTT_AM1008WK/ESP32_MQTT_AM1008WK.ino
2025-11-17 22:54:37 +09:00

145 lines
4.3 KiB
C++

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <am1008w_k_i2c.h>
#include <Wire.h>
const char* WIFI_SSID = "";
const char* WIFI_PASSWORD = "";
const char* MQTT_SERVER = "";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "";
const char* MQTT_PASSWORD = "";
const char* MQTT_CLIENT_ID = "esp32-sensor-001";
const char* TOPIC_CO2 = "homeassistant/sensor/esp32/co2";
const char* TOPIC_VOC = "homeassistant/sensor/esp32/voc";
const char* TOPIC_TEMP = "homeassistant/sensor/esp32/temperature";
const char* TOPIC_HUMIDITY = "homeassistant/sensor/esp32/humidity";
const char* TOPIC_PM1 = "homeassistant/sensor/esp32/pm1";
const char* TOPIC_PM25 = "homeassistant/sensor/esp32/pm25";
const char* TOPIC_PM10 = "homeassistant/sensor/esp32/pm10";
const char* TOPIC_AVAILABILITY = "homeassistant/sensor/esp32/availability";
#define DELAY 2000
AM1008W_K_I2C am1008w_k_i2c;
WiFiClientSecure espClient;
PubSubClient mqttClient(espClient);
unsigned long lastReconnect = 0;
unsigned long lastPublish = 0;
boolean reconnectMQTT() {
Serial.print("Connecting to MQTT...");
if (mqttClient.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASSWORD,
TOPIC_AVAILABILITY, 0, true, "offline")) {
Serial.println("connected!");
mqttClient.publish(TOPIC_AVAILABILITY, "online", true);
return true;
}
Serial.print("failed, rc=");
Serial.println(mqttClient.state());
return false;
}
void publishSensorData() {
Serial.println(">>");
uint8_t ret = am1008w_k_i2c.read_data_command();
if (ret == 0) {
int co2 = am1008w_k_i2c.get_co2();
int voc = am1008w_k_i2c.get_voc();
float humidity = am1008w_k_i2c.get_humidity();
float temperature = am1008w_k_i2c.get_temperature();
int pm1 = am1008w_k_i2c.get_pm1p0();
int pm25 = am1008w_k_i2c.get_pm2p5();
int pm10 = am1008w_k_i2c.get_pm10();
Serial.printf("> CO2: %d ppm\n", co2);
Serial.printf("> VOC: %d (Lv 0-3)\n", voc);
Serial.printf("> Temp: %.1f°C\n", temperature);
Serial.printf("> Hum: %.1f%%\n", humidity);
Serial.printf("> PM1.0: %d µg/m³\n", pm1);
Serial.printf("> PM2.5: %d µg/m³\n", pm25);
Serial.printf("> PM10: %d µg/m³\n", pm10);
char payload[50];
snprintf(payload, sizeof(payload), "%d", co2);
mqttClient.publish(TOPIC_CO2, payload);
snprintf(payload, sizeof(payload), "%d", voc);
mqttClient.publish(TOPIC_VOC, payload);
snprintf(payload, sizeof(payload), "%.1f", temperature);
mqttClient.publish(TOPIC_TEMP, payload);
snprintf(payload, sizeof(payload), "%.1f", humidity);
mqttClient.publish(TOPIC_HUMIDITY, payload);
snprintf(payload, sizeof(payload), "%d", pm1);
mqttClient.publish(TOPIC_PM1, payload);
snprintf(payload, sizeof(payload), "%d", pm25);
mqttClient.publish(TOPIC_PM25, payload);
snprintf(payload, sizeof(payload), "%d", pm10);
mqttClient.publish(TOPIC_PM10, payload);
Serial.println(">>");
} else {
Serial.println("!! Sensor fail !!");
}
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Initializing I2C...");
Wire.begin(1, 2);
am1008w_k_i2c.begin(Wire);
Serial.println("Done.\n");
Serial.print("Connecting to WiFi");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println();
espClient.setInsecure();
mqttClient.setServer(MQTT_SERVER, MQTT_PORT);
mqttClient.setKeepAlive(60);
mqttClient.setBufferSize(512);
Serial.println("Init complete.\n");
}
void loop() {
if (!mqttClient.connected()) {
if (millis() - lastReconnect > 5000) {
lastReconnect = millis();
reconnectMQTT();
}
} else {
mqttClient.loop();
}
if (mqttClient.connected() && (millis() - lastPublish > DELAY)) {
publishSensorData();
lastPublish = millis();
}
delay(100);
}