This is an old revision of the document!
Nume: Zugravescu Adina-Andreea
Grupa: 331CD
Ideea a pornit de la dorința de a automatiza un proces simplu, dar des întâlnit, oferind o soluție practică. Dispozitivul este ușor de folosit, eficient și util atât acasă, cât și în saloane.
Lista de componente:
Diagrama circuit
1. Conectare senzor IR (KY-032): - GND la GND de pe Arduino - VCC la +5V de pe Arduino - OUT la pinul digital D2 de pe Arduino - EN lăsat neconectat
2. Conectare LCD 1602 cu interfață I2C: - GND la GND de pe Arduino - VCC la +5V de pe Arduino - SDA la pinul A4 de pe Arduino - SCL la pinul A5 de pe Arduino
3. Conectare ventilator 12V: - GND la drain al MOSFET-ului IRF520N - VCC la +5V de pe USB - Source-ul MOSFET-ului la GND - Gate-ul MOSFET-ului la pinul D3 (PWM) al Arduino, printr-o rezistență de 220Ω
4. Alte componente: - Diodă 1N4007 în paralel cu ventilatorul: catodul la +5V, anodul la drain - Rezistență de pull-down de 10kΩ între gate și GND (pentru a menține MOSFET-ul oprit când nu e activat) - Condensator ceramic de 47nF între +5V și GND pentru filtrarea alimentării
Notă: GND-ul Arduino și GND-ul alimentării externe sunt unite pe breadboard pentru a asigura masă comună.
Mediu de dezvoltare: Arduino IDE
Biblioteci folosite:
Wire.h – pentru comunicarea I2C cu LCD-ul
LiquidCrystal_I2C.h – pentru controlul afișajului LCD 1602 cu interfață I2C
Descrierea codului aplicației
Codul monitorizează un senzor IR digital pentru a detecta prezența unei mâini. La detecție, se pornește un ventilator controlat prin PWM timp de 60 de secunde. Afișajul LCD conectat prin I2C arată un countdown, iar în ultimele 8 secunde viteza ventilatorului scade treptat (PWM: 150, 100, 50). După încheiere, ventilatorul se oprește și se afișează mesajul „Done!”, urmat de revenirea la starea „Ready”.
Algoritmi și structuri implementate
* Sistem pe stări logice: standby → activare → rampă PWM → finalizare → standby
* Temporizare non-blocantă cu
millis()
– folosită pentru countdown și control treptat al ventilatorului
* Control PWM gradual:
analogWrite()
cu valori 200 → 150 → 100 → 50 în ultimele 8 secunde
* Afișare dinamică pe LCD: mesajele și countdown-ul sunt actualizate în timp real
* Optimizare a mesajelor transmise în Serial Monitor: evitarea afișărilor redundante
*
setup()
: configurarea pinilor, inițializarea LCD și Serial Monitor *
loop()
: verifică senzorul, declanșează ciclul de uscare și gestionează afișajul *
isHandDetected()
: verifică dacă senzorul IR detectează o mână (semnal LOW) *
handlePWMSpeedControl(elapsed)
: reduce progresiv viteza ventilatorului în ultimele 8 secunde *
resetDryingProcess()
: oprește ventilatorul, afișează „Done!” și revine la starea „Ready”
* Ventilatorul pornește automat la 200 PWM când senzorul detectează o mână * LCD-ul afișează countdown-ul de 60 de secunde în timp real * În ultimele 8 secunde, PWM-ul este redus gradual: 150 → 100 → 50 * După terminare, este afișat „Done!”, urmat de revenirea la „Ready” * Pe Serial Monitor se afișează „Hand detected”, valorile PWM și „Fan state: 0” după finalizare
* Rampă inteligentă de coborâre a turației ventilatorului pe finalul ciclului * Countdown afișat pe LCD fără blocare (fără
delay()
) * Cod curat, modularizat, ușor de extins * Diagnostic și urmărire prin mesaje în Serial Monitor
* Eliminarea variabilelor nefolosite din versiunile anterioare * Evitarea afișării repetate prin memorarea valorii PWM precedente * Cod structurat în funcții dedicate cu responsabilitate unică * Afișare eficientă pe LCD fără suprascrieri inutile
Video demonstrativ: https://youtube.com/shorts/mH0Pf0XKjyc?feature=share
Proiectul m-a ajutat să înțeleg mai bine integrarea componentelor hardware cu logica software într-un sistem automat. A fost o experiență practică utilă, care mi-a consolidat noțiunile studiate în cadrul laboratoarelor de PM.
Resurse Hardware:
Resurse Software: