/*
To upload through terminal you can use: curl -F "[email protected]" esp8266-webupdate.local/update
---------------------
Centralina rilevamento gas - G.B. 2024 -
Sensore: MQ2
MCU: ESP8266 D1 mini
*/
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <mDNS.h>
#include <HTTPUpdateServer.h>
#include <PubSubClient.h>
#ifndef STASSID
#define STASSID "Wokwi-GUEST"
#define STAPSK ""
#endif
const char* host = "GasSens#1-webupdate";
const char* ssid = STASSID;
const char* password = STAPSK;
ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;
const char* mqtt_server = "192.168.28.165";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long currentMillis = 0;
unsigned long millisRele = 0;
unsigned long millisBuzz = 0;
unsigned long interval = 5000;
uint8_t gasAnIn = A0; //AI sensore gas
uint8_t ledPin = D5; //LED segnalazione livello gas alto
uint8_t relePin = D7; //uscita digitale per comando relè tramite transistor per valvola di sicurezza gas
String stgS1;
char S1Char[50];
const char* TopicS1 = "localbroker/smarthome/sensors/gasCucina";
bool rem = false;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
pinMode(relePin, OUTPUT);
Serial.println();
Serial.println("Booting Sketch...");
//WiFi.mode(WIFI_AP_STA);
//WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
WiFi.begin(ssid, password);
Serial.println("WiFi failed, retrying.");
}
MDNS.begin(host);
httpUpdater.setup(&httpServer);
httpServer.begin();
MDNS.addService("http", "tcp", 80);
Serial.printf("HTTPUpdateServer ready! Open http://%s.local/update in your browser\n", host);
client.setServer(mqtt_server, 1883);
//client.setCallback(callback);
}
void loop() {
httpServer.handleClient();
MDNS.update();
if (!client.connected()) {
reconnect();
}
client.loop();
int gasVal = analogRead(gasAnIn);
//gestione uscita LED e cicalino
if (gasVal > 350) {
digitalWrite(ledPin, HIGH);
}
if (gasVal < 280) {
digitalWrite(ledPin, LOW);
}
//--- logica per relè---
if (gasVal > 450 && rem == false) {
rem = true;
millisRele = millis();
}
if (rem == true && millisRele >= 5000) {
digitalWrite(relePin, LOW);
}
if (gasVal < 300) {
rem = false;
millisRele = 0;
digitalWrite(relePin, HIGH);
}
//-----------------------
if (millis() - currentMillis > interval) {
Serial.print("Gas level: ");
Serial.println(gasVal);
if (client.connected()) {
stgS1 = String(gasVal);
stgS1.toCharArray(S1Char, stgS1.length() + 1);
client.publish(TopicS1, S1Char);
}
currentMillis = millis();
}
delay(10);
}
boolean reconnect() {
if (client.connect("MQTTClient_GasSens_1")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("localbroker/smarthome/sensors", "GasSens_1 Connesso");
//client.subscribe("localbroker/smarthome/sensors");
}
return client.connected();
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String msgIn;
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)message[i]);
msgIn += (char)message[i];
}
}