This shows you the differences between two versions of the page.
|
pm:prj2025:fstancu:cosmin.tonita [2025/05/18 20:47] cosmin.tonita [Hardware Design] |
pm:prj2025:fstancu:cosmin.tonita [2025/05/28 10:38] (current) cosmin.tonita [Software Design] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Sistem prevenire inundatie ====== | + | ====== Sistem prevenire inundatie - TONIȚĂ Cosmin-Cristian ====== |
| Tonita Cosmin Cristian - 334CD | Tonita Cosmin Cristian - 334CD | ||
| ===== Introducere ===== | ===== Introducere ===== | ||
| Line 9: | Line 9: | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | {{:pm:prj2025:fstancu:block_tonita_cosmin.png?200|}} | + | {{:pm:prj2025:fstancu:block_tonita_cosmin.png?600|}} |
| 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. | 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. | ||
| Line 33: | Line 33: | ||
| | Electrovalva cu solenoid, 12V | 1 | https://filtro.ro/electrovalva-cu-solenoid-12v-normal-inchisa-conectori-rapizi-1-4-6-mm-putere-6-5w-legatura-prin-lamele | | | Electrovalva cu solenoid, 12V | 1 | https://filtro.ro/electrovalva-cu-solenoid-12v-normal-inchisa-conectori-rapizi-1-4-6-mm-putere-6-5w-legatura-prin-lamele | | ||
| | Alimentator Universal, AC/DC 12V 3A | 1 | https://www.emag.ro/alimentator-universal-ac-dc-12v-3a-negru-miromotor-q-12v/pd/D42RKKYBM/?ref=history-shopping_423191891_51747_1 | | | Alimentator Universal, AC/DC 12V 3A | 1 | https://www.emag.ro/alimentator-universal-ac-dc-12v-3a-negru-miromotor-q-12v/pd/D42RKKYBM/?ref=history-shopping_423191891_51747_1 | | ||
| + | |||
| + | |||
| **Schema electrica** | **Schema electrica** | ||
| - | {{:pm:prj2025:fstancu:cad_tonita_cosmin.png?200|}} | ||
| + | |||
| + | {{:pm:prj2025:fstancu:cad_tonita_cosmin.png?600|}} | ||
| + | |||
| + | 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 16x2 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)** | ||
| + | |||
| + | {{:pm:prj2025:fstancu:breadboard_tonita_cosmin.jpeg?400 |}} | ||
| + | |||
| + | |||
| + | |||
| + | **Cablaj (Protoboard)** | ||
| + | |||
| + | |||
| + | |||
| + | {{:pm:prj2025:fstancu:proto-tonita-cosmin.jpeg?400|}} | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | <note tip> | ||
| Descrierea codului aplicaţiei (firmware): | Descrierea codului aplicaţiei (firmware): | ||
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * Mediu de dezvoltare : Arduino IDE |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * Librarii externe : |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | |
| - | ===== Rezultate Obţinute ===== | + | - **LiquidCrystal_I2C - Marco Shwartz** - comunicatie I2C cu ecranul LCD |
| - | <note tip> | + | - **ESP Mail Client - Mobizt** - trimitere mail-uri ca notificari |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | **Functii implementate**: |
| - | ===== Concluzii ===== | + | - LCD I2C: |
| + | <code>// 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 "); | ||
| + | </code> | ||
| - | ===== Download ===== | + | - Operatii GPIO cu registri |
| - | <note warning> | + | <code> |
| - | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | #define FLOAT_SENSOR_MASK (1ULL << floatSensorPin) |
| + | #define PUMP_PIN_MASK (1ULL << PumpPin) | ||
| + | #define VALVE_PIN_MASK (1ULL << ValvePin) | ||
| - | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | gpio_config_t io_conf = {}; |
| - | </note> | + | io_conf.intr_type = GPIO_INTR_DISABLE; |
| + | io_conf.mode = GPIO_MODE_INPUT; | ||
| + | io_conf.pin_bit_mask = FLOAT_SENSOR_MASK; | ||
| + | io_conf.pull_up_en = GPIO_PULLUP_ENABLE; | ||
| + | gpio_config(&io_conf); | ||
| + | |||
| + | bool readFloatSensorRegister() { | ||
| + | uint32_t gpio_input = REG_READ(GPIO_IN_REG); | ||
| + | return (gpio_input & FLOAT_SENSOR_MASK) != 0; | ||
| + | } | ||
| + | |||
| + | void setPumpRegister(bool state) { | ||
| + | if (state) { | ||
| + | REG_WRITE(GPIO_OUT_W1TS_REG, PUMP_PIN_MASK); // Set bit | ||
| + | } else { | ||
| + | REG_WRITE(GPIO_OUT_W1TC_REG, PUMP_PIN_MASK); // Clear bit | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void setValveRegister(bool state) { | ||
| + | if (state) { | ||
| + | REG_WRITE(GPIO_OUT_W1TS_REG, VALVE_PIN_MASK); | ||
| + | } else { | ||
| + | REG_WRITE(GPIO_OUT_W1TC_REG, VALVE_PIN_MASK); | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | - Intreruperi relee (electrovalva si pompa): | ||
| + | <code> | ||
| + | volatile bool floodDetected = false; | ||
| + | volatile bool systemActive = false; | ||
| + | |||
| + | |||
| + | // setup | ||
| + | attachInterrupt(digitalPinToInterrupt(4), floodISR, CHANGE); | ||
| + | |||
| + | void IRAM_ATTR floodISR() { | ||
| + | floodDetected = true; | ||
| + | } | ||
| + | |||
| + | setPumpRegister(true); // porneste pompa | ||
| + | setValveRegister(false); // inchide electrovalva | ||
| + | setPumpRegister(false); // opreste pompa | ||
| + | setValveRegister(true); // deschide electrovalva | ||
| + | </code> | ||
| + | |||
| + | - Senzori (flotant-digital si capacitiv-analog pe pin ADC): | ||
| + | <code> | ||
| + | pinMode(floatSensorPin, INPUT_PULLUP); | ||
| + | pinMode(capSensorPin, INPUT); | ||
| + | |||
| + | bool floatState = readFloatSensorRegister(); | ||
| + | uint32_t capacitiveValue = readCapacitiveSensorRegister(); | ||
| + | |||
| + | bool flood = (floatState == HIGH) || (capacitiveValue > 400); | ||
| + | </code> | ||
| + | |||
| + | - Wifi: | ||
| + | |||
| + | <code> | ||
| + | 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); | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | - Notificare prin email (SMTP): | ||
| + | |||
| + | <code> | ||
| + | // 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(); | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | |||
| + | Functionarea sistemului (fara tuburi/apa, doar logica): | ||
| + | [[https://youtu.be/BqaRONiYr7U]] | ||
| + | ===== Rezultate Obţinute ===== | ||
| - | ===== Jurnal ===== | + | {{:pm:prj2025:fstancu:final-tonita-cosmin.jpeg?400|}} |
| - | <note tip> | + | Demo sistem final: |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | [[https://youtu.be/E7gNnOIGIbs]] |
| - | </note> | + | |
| - | ===== Bibliografie/Resurse ===== | ||
| - | <note> | ||
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
| - | </note> | ||
| <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||