This is an old revision of the document!
Proiectul propune un sistem de monitorizare si protectie pentru o linie de productie industriala simulata. in centrul sistemului se va afla un motor stepper 28BYJ-48 care reprezinta echipamentul principal de productie - de exemplu o masa rotativa de asamblare sau un conveyor. in jurul lui vor fi dispusi mai multi senzori care detecteaza situatiile periculoase: prezenta personalului in zona de operare, apropierea unor obiecte, infiltratii de apa, zgomote anormale si conditii de mediu nepotrivite.
Punctul de plecare a fost o intrebare destul de concreta: cum opresti in siguranta un echipament industrial cand apare o anomalie? in aplicatiile reale, timpul de raspuns trebuie sa fie de ordinul milisecundelor, iar sistemul trebuie sa functioneze fiabil chiar si atunci cand o parte din componencate cedeaza. Aceste cerinte motiveaza arhitectura propusa, cu doua microcontrollere avand roluri distincte.
Consider proiectul util din mai multe motive. in primul rand, abordeaza o problema reala - siguranta in mediile industriale automatizate. in al doilea rand, integreaza majoritatea conceptelor parcurse la curs: senzori analogici si digitali, comunicatie seriala intre microcontrollere, conectivitate WiFi, interfata cu utilizatorul. in al treilea rand, arhitectura dual-microcontroller cu separarea functiilor de siguranta hard real-time de cele de procesare si conectivitate este o abordare des intalnita in aplicatiile industriale serioase.
Sistemul va avea doua microcontrollere care isi impart responsabilitatile:
Aceasta separare ofera doua avantaje importante. Primul este redundanta: daca ESP32 devine indisponibil (pierdere de WiFi, crash software, etc.), Arduino continua sa asigure siguranta echipamentului. Al doilea este performanta: fiecare microcontroller poate fi optimizat pentru rolul sau, fara compromisuri.
Fluxul de date planificat:
Logica de siguranta va fi organizata ca o cascada cu prioritati: EMERGENCY > SOUND SHUTDOWN > MAINTENANCE > WARNING > NORMAL. Starile cu prioritate mai mare le suprascriu pe cele inferioare, iar tranzitiile sunt deterministe.
Componentele vor fi distribuite pe doua breadboard-uri pentru a separa logic responsabilitatile sistemului si pentru a facilita mentenanta.
Breadboard principal (Arduino):
Breadboard secundar (ESP32):
Alimentarea va pleca de la adaptorul de 9V care intra in jack-ul DC al Arduino-ului. Regulatorul intern al placii furnizeaza 5V stabil, care va alimenta toti senzorii si ESP32-ul (prin pinul Vin). ESP32-ul are propriul regulator intern care coboara tensiunea la 3.3V pentru functionarea interna. Toate componentele vor imparti o masa comuna distribuita prin rail-urile negative ale celor doua breadboard-uri.
Arduino MEGA:
| Componenta | Pini Arduino |
|---|---|
| PIR HC-SR501 | OUT → D2, VCC → 5V, GND → GND |
| HC-SR04 | Trig → D3, Echo → D4 |
| Sound Sensor | A0 → A0, D0 → D5 |
| Water Sensor | Signal → A1 |
| Emergency Button | D18 cu INPUT_PULLUP, celalalt capat → GND |
| Stepper ULN2003 | IN1→D8, IN2→D9, IN3→D10, IN4→D11 |
| Buzzer | + → D12, - → GND |
| UART catre ESP32 | TX2 (D16), RX2 (D17) |
ESP32:
| Componenta | Pini ESP32 |
|---|---|
| DHT11 | GPIO32 |
| LCD1602 | RS→GPIO5, EN→GPIO18, D4→GPIO19, D5→GPIO21, D6→GPIO22, D7→GPIO23 |
| UART catre Arduino | RX2 (GPIO16), TX2 (GPIO17) |
Principalul aspect electric care trebuie luat in considerare este interfatarea intre Arduino (logica 5V) si ESP32 (logica 3.3V). Conform datasheet-ului, pinii GPIO ai ESP32 sunt 5V tolerant pe input, ceea ce permite conectarea directa a liniei TX a Arduino-ului la RX-ul ESP32-ului fara level shifter. Pentru directia inversa (ESP32 TX 3.3V → Arduino RX 5V), tensiunea de 3.3V ar trebui interpretata ca HIGH, intrucat pragul de detectie al Arduino-ului este in jur de 3V.
LCD-ul este alimentat la 5V dar accepta semnale de control de 3.3V, deoarece pragul sau de HIGH este in jurul valorii de 2.5V.
Toti senzorii sunt compatibili cu alimentarea la 5V (verificat in datasheet-uri), iar curentul total estimat ar trebui sa se incadreze in capacitatea regulatorului intern al Arduino-ului.
Valorile de mai jos sunt estimate pe baza datasheet-urilor componentelor.
| Componenta | Curent (estimat) | Putere |
|---|---|---|
| Arduino MEGA active | 200 mA | 1000 mW |
| ESP32 cu WiFi activ | 240 mA | 792 mW |
| PIR | 50 mA | 250 mW |
| HC-SR04 | 15 mA | 75 mW |
| Sound sensor | 4 mA | 20 mW |
| Water sensor | 5 mA | 25 mW |
| DHT11 | 0.3 mA | 1.5 mW |
| LCD1602 | 20 mA | 100 mW |
| Stepper activ | 300 mA | 1500 mW |
| Buzzer activ | 30 mA | 150 mW |
Consumul total maxim estimat este de aproximativ 840 mA (3.9 W), iar consumul tipic - cu stepper-ul in functiune intermitenta si buzzer-ul activat ocazional - ar trebui sa fie in jur de 550 mA (2.8 W).
Pentru o eventuala alimentare cu acumulatori NiMH de 1.2V / 2500 mAh, ar fi necesari 8 acumulatori in serie pentru a obtine 9.6V (compatibil cu intrarea Vin a Arduino-ului). Autonomia estimata ar fi de aproximativ 4.5 ore (2500 mAh / 550 mA).
Pe Arduino:
Stepper.h - control motor stepper (librarie standard)Pe ESP32:
WiFi.h - conectarea la reteaHTTPClient.h - cereri catre server-ul FlaskLiquidCrystal.h - controlul LCD-uluiDHT.h (Adafruit) - citirea senzorului DHT11ArduinoJson.h - serializarea datelor pentru transmisia HTTPPe server:
Flask - framework web minimalistsqlite3 (din biblioteca standard Python) - persistenta datelorChart.js (incarcat din CDN) - grafice pe dashboardState machine pentru siguranta (Arduino)
Sistemul va functiona pe baza unei masini cu stari avand 5 niveluri de prioritate:
EMERGENCY - buton apasat sau conditie critica detectata SOUND_SHUTDOWN - 5 secunde de pauza dupa un spike de zgomot MAINTENANCE - 10 secunde dupa detectie PIR, cu queuing WARNING - operare continua, dar cu o anomalie semnalata NORMAL - functionare nominala, motor la 15 RPM
La fiecare iteratie a buclei principale, conditiile vor fi evaluate de la prioritatea cea mai mare catre cea mai mica. Prima conditie indeplinita va determina starea curenta.
Protocolul de comunicatie Arduino → ESP32
Pentru transmisia datelor intre microcontrollere am proiectat un protocol simplu:
0xAA 0x55) pentru sincronizareValidarea prin checksum este utila in special pentru rezilienta la interferentele electromagnetice generate de motorul stepper, care ar putea afecta liniile UART.
Calculul scorului de sanatate (ESP32)
Scorul va fi calculat pe o scara 0-100, ponderat in functie de mai multi parametri:
Scorul va fi o varianta simplificata a ceea ce ar exista intr-o aplicatie industriala reala. intr-un sistem complet ar fi utila includerea unor parametri suplimentari precum vibratiile (de exemplu prin MPU6050), curentul consumat de motor, presiunea sau calitatea aerului. Numarul redus de fire jumper disponibile este factorul limitativ in adaugarea altor senzori.
Watchdog timer
Pe Arduino voi activa watchdog-ul cu timeout de 4 secunde. Daca bucla principala se blocheaza din orice motiv (deadlock, ciclu infinit intr-o functie, etc.), microcontrollerul se va reseta automat. Este o protectie elementara, dar esentiala pentru un sistem care trebuie sa functioneze continuu.
Pe Arduino:
readAllSensors() - citeste toti senzorii si actualizeaza un struct comunevaluateSafetyState() - aplica logica state machinecontrolMotor() - porneste, opreste sau seteaza viteza motoruluisendDataToESP32() - impacheteaza datele cu header si checksum si le transmitetriggerBuzzer(pattern) - genereaza diferite pattern-uri sonore in functie de starePe ESP32:
receiveFromArduino() - parseaza pachetul UART si valideaza checksum-ulcalculateHealthScore() - calculeaza scorul de sanatate descris anteriorupdateLCD() - roteste intre seturi de informatii la fiecare 3 secunde in modul normalsendToServer() - construieste payload JSON si efectueaza POST HTTPreconnectWiFi() - reconectare automata la pierderea reteleiPe server (Flask):
/api/data (POST) - primeste datele de la ESP32 si le salveaza in SQLite/api/history (GET) - returneaza ultimele N puncte pentru graficele dashboard-ului/ (GET) - serveste dashboard-ul HTML
Resurse Hardware:
Resurse Software: