This is an old revision of the document!
Tonita Cosmin Cristian - 334CD
Alimentarea se face de la un adaptor 12V/3A, conectat spre o mufa jack. 12V este directionat catre releele care controleaza pompa si electrovalva, si convertit la 5V prin convertorul pentru alimentarea ESP32, LCD (cu adaptor I2C) si senzorul capacitiv.
Sistemul foloseste 2 tipuri de senzori pentru reduntanta si o detectie mai precisa: unul capacitiv care masoara nivelul apei, dand un rezultat analogic catre placuta, si unul flotant care functioneaza ca un intrerupator.
Cand este detectata o inundatie, acest lucru e indicat pe ecran, iar ESP-ul inchide electrovalva pentru a opri trecerea apei (conducta) si porneste pompa pentru a evacua apa acumulata.
Schema electrica
Schema prezinta conexiunile intre componentele sistemului. Datorita specificitatii unelor componente utilizate, au fost facute urmatoarele adaptari in CAD:
* Pompa si electrovalva sunt reprezentate generic ca sarcini cu doua borne
* LCD-ul este reprezentat prin interfata sa I2C cu 4 pini (VCC, GND, SDA, SCL), desi in realitate e un modul LCD 16×2 cu adaptor I2C atasat.
* Senzorul flotant este reprezentat generic ca un intrerupator cu 2 borne, corespunzator functiei sale de baza - inchidearea circuitului cand e detectata apa.
* Modulele releu au fost modificate fata de footprint-uri pentru a reflecta realitatea.
* Convertorul DC-DC transforma tensiunea de 12V de la sursa principala la 5V pentru componentele electronice (ESP-ul, LCD-ul, senzorul capacitiv)
Cablaj (Breadboard)
Cablaj (Protoboard)
Descrierea codului aplicaţiei (firmware):
- LiquidCrystal_I2C - Marco Shwartz - comunicatie I2C cu ecranul LCD
- ESP Mail Client - Mobizt - trimitere mail-uri ca notificari
Functii implementate:
- LCD I2C:
// setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Starting...");
// afiseaza diverse informatii despre sistem
lcd.print("FLOOD! V:ON P:ON"); // v = valva, p = pompa
lcd.setCursor(0, 0);
lcd.print("Water level:");
lcd.setCursor(0, 1);
lcd.print("System Ready ");
- Intreruperi relee (electrovalva si pompa):
volatile bool floodDetected = false;
volatile bool systemActive = false;
// setup
attachInterrupt(digitalPinToInterrupt(4), floodISR, CHANGE);
void IRAM_ATTR floodISR() {
floodDetected = true;
}
digitalWrite(valveRelayPin, HIGH); // închide electrovalvă
digitalWrite(pumpRelayPin, HIGH); // pornește pompă
digitalWrite(valveRelayPin, LOW); // deschide electrovalvă
digitalWrite(pumpRelayPin, LOW); // oprește pompă
- Senzori (flotant-digital si capacitiv-analog pe pin ADC):
pinMode(floatSensorPin, INPUT_PULLUP); pinMode(capSensorPin, INPUT); int floatState = digitalRead(floatSensorPin); int capacitiveValue = analogRead(capSensorPin); bool flood = (floatState == HIGH) || (capacitiveValue > 400);
- Wifi:
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println(WiFi.localIP());
// verificare reconectare
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, password);
}
- Notificare prin email (SMTP):
// configurare
config.server.host_name = SMTP_HOST; // smtp.gmail.com
config.server.port = SMTP_PORT; // 587
config.login.email = AUTHOR_EMAIL;
config.login.password = AUTHOR_PASSWORD;
// trimitere mesaj
SMTP_Message message;
message.sender.name = F("Sistem Anti-Inundatie");
message.sender.email = AUTHOR_EMAIL;
message.subject = F("ALERTA INUNDATIE!");
message.addRecipient(F("Proprietar"), RECIPIENT_EMAIL);
String textMsg = "ALERTA DE INUNDATIE!\n\n";
textMsg += "Masuri luate automat:\n";
textMsg += "- Electrovalva INCHISA\n";
textMsg += "- Pompa PORNITA\n";
if (smtp.connect(&config)) {
if (MailClient.sendMail(&smtp, &message)) {
emailSent = true;
lastEmailTime = millis();
}
smtp.closeSession();
}
Functionarea sistemului (fara tuburi/apa, doar logica): https://youtu.be/BqaRONiYr7U