#if defined(ESP32)
#include <WiFi.h>
#endif
#include <Arduino_MQTT_Client.h>
#include <ThingsBoard.h>
#include <DHT.h>
// ===== WiFi cho Wokwi =====
constexpr char WIFI_SSID[] = "Wokwi-GUEST";
constexpr char WIFI_PASSWORD[] = "";
// ===== ThingsBoard Cloud =====
constexpr char TOKEN[] = "sxuPczhq98Q2Avjn805Z";
constexpr char THINGSBOARD_SERVER[] = "demo.thingsboard.io";
constexpr uint16_t THINGSBOARD_PORT = 1883U;
// ===== MQ-2 =====
const int mq2Pin = 3; // ADC GPIO3
// ===== DHT22 =====
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ===== Client =====
WiFiClient wifiClient;
Arduino_MQTT_Client mqttClient(wifiClient);
ThingsBoard tb(mqttClient);
uint32_t lastSend = 0;
void InitWiFi() {
Serial.println("Connecting to Wokwi WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(200);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
}
void setup() {
Serial.begin(115200);
analogReadResolution(12);
analogSetPinAttenuation(mq2Pin, ADC_11db);
dht.begin();
InitWiFi();
}
void loop() {
if (!tb.connected()) {
Serial.println("Connecting to ThingsBoard...");
if (!tb.connect(THINGSBOARD_SERVER, TOKEN, THINGSBOARD_PORT)) {
Serial.println("TB connection failed");
delay(2000);
return;
}
Serial.println("ThingsBoard connected");
}
tb.loop();
if (millis() - lastSend > 2000) {
lastSend = millis();
// ===== MQ-2 =====
int mq2Value = analogRead(mq2Pin);
float mq2Voltage = mq2Value * (3.3 / 4095.0);
// ===== DHT22 =====
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
Serial.print("MQ2: ");
Serial.print(mq2Value);
Serial.print(" | Volt: ");
Serial.print(mq2Voltage);
tb.sendTelemetryData("mq2_raw", mq2Value);
tb.sendTelemetryData("mq2_voltage", mq2Voltage);
if (!isnan(temperature) && !isnan(humidity)) {
Serial.print(" | Temp: ");
Serial.print(temperature);
Serial.print("C | Hum: ");
Serial.println(humidity);
tb.sendTelemetryData("temperature", temperature);
tb.sendTelemetryData("humidity", humidity);
} else {
Serial.println(" | DHT error");
}
}
}