#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "mqtt.beebotte.com";
const char* mqtt_user = "token_xwchibA0EziyA4Yh";
const char* mqtt_channel = "calidad_del_ire";
const char* co_resource = "co";
const char* no2_resource = "no2";
const int pinMQ7 = 35; // Pin analógico del sensor MQ-7
const int pinMQ135 = 34; // Pin analógico del sensor MQ-135
const int pinLED = 2; // Pin GPIO para el LED de advertencia
// Variables globales
WiFiClient espClient;
PubSubClient client(espClient);
// Prototipos de funciones
void setup_wifi();
void reconnect();
void publishData(const char* resource, float data);
void setup() {
pinMode(pinLED, OUTPUT);
Serial.begin(9600);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void loop() {
// Lecturas de los sensores
int valorMQ7 = analogRead(pinMQ7);
int valorMQ135 = analogRead(pinMQ135);
// Cálculos de ppm
float ppmMQ7 = (valorMQ7 * (3.3 / 4095.0) - 0.22) / 0.00776;
float ppmNO2 = (valorMQ135 * (3.3 / 4095.0) - 0.1) / 0.04;
// Impresión de los datos en el puerto serie
Serial.println("Sensor MQ-7:");
Serial.print("Valor del sensor: ");
Serial.println(valorMQ7);
Serial.print("Concentración de CO (ppm): ");
Serial.println(ppmMQ7);
Serial.println("Sensor MQ-135:");
Serial.print("Valor del sensor: ");
Serial.println(valorMQ135);
Serial.print("Aproximación de NO2 (ppm): ");
Serial.println(ppmNO2);
// Reconectar al servidor MQTT si es necesario
if (!client.connected()) {
reconnect();
}
client.loop();
// Publicar datos en los recursos MQTT
publishData(co_resource, ppmMQ7);
publishData(no2_resource, ppmNO2);
// Control del LED de advertencia
digitalWrite(pinLED, (ppmMQ7 > 100 || ppmNO2 > 0.1) ? HIGH : LOW);
delay(1000);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Dirección IP: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando al servidor MQTT...");
if (client.connect("ESP32Client", mqtt_user, "")) {
Serial.println("Conectado");
} else {
Serial.print("falló, rc=");
Serial.print(client.state());
Serial.println(" intentando de nuevo en 5 segundos");
delay(5000);
}
}
}
void publishData(const char* resource, float data) {
StaticJsonDocument<200> doc;
doc["resource"] = resource;
doc["data"] = data;
char buffer[256];
size_t n = serializeJson(doc, buffer);
client.publish(mqtt_channel, buffer, n);
}