mirror of
https://github.com/morgan9e/ESP32
synced 2026-04-14 16:34:04 +09:00
145 lines
4.3 KiB
C++
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);
|
|
} |