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:
Funcții implementate:
pinMode(FAN_PIN, OUTPUT); // Set FAN_PIN as an output pin for controlling the fan pinMode(SENSOR_PIN, INPUT); // Set SENSOR_PIN as an input for reading sensor data analogWrite(FAN_PIN, 0); // (PWM 0%) lcd.init(); lcd.backlight(); lcd.setCursor(5, 0); lcd.print("Ready"); // Display "Ready" on the LCD initially // Start serial monitor for debugging Serial.begin(9600);
// Update every 1 second to monitor the status if (millis() - lastUpdateTime >= updateInterval) { lastUpdateTime = millis(); // If not currently drying and a hand is detected if (!drying && isHandDetected()) { drying = true; startTime = millis(); analogWrite(FAN_PIN, 200); // Start the fan immediately at 200 PWM fanState = 1; // Update fan state to "on" lcd.clear(); lcd.setCursor(1, 0); lcd.print("Drying started"); Serial.println("Hand detected"); } if (drying) { unsigned long elapsed = millis() - startTime; unsigned long remaining = (dryingDuration - elapsed) / 1000; lcd.setCursor(4, 1); lcd.print("Time: "); lcd.print(remaining); lcd.print("s "); // Handle gradual PWM ramp-down in the last 8 seconds handlePWMSpeedControl(); // Check if the drying duration has expired if (elapsed >= dryingDuration) { // Automatically reset drying process when the time expires fanState = 0; resetDryingProcess(); } } }
int sensorValue = digitalRead(SENSOR_PIN); // Read the digital value from the sensor if (sensorValue == LOW) { // If the sensor detects a hand return true; } return false;
unsigned long elapsedTime = millis() - startTime; if (elapsedTime >= 52000) { // After 52 seconds, start ramp-down int pwmValue = 0; // Ramp down the PWM speed to 150, 100, 50 over the last 8 seconds if (elapsedTime <= dryingDuration - 7000) { pwmValue = 150; } else if (elapsedTime <= dryingDuration - 4000) { pwmValue = 100; } else if (elapsedTime <= dryingDuration - 1000) { pwmValue = 50; } pwmValue = constrain(pwmValue, 0, 200); // Only print PWM value if it's different from the previous one static int lastPWMValue = -1; if (pwmValue != lastPWMValue) { analogWrite(FAN_PIN, pwmValue); Serial.print("Fan PWM: "); Serial.println(pwmValue); lastPWMValue = pwmValue; // Update the last PWM value } }
analogWrite(FAN_PIN, 0); // Stop the fan Serial.print("Fan state: "); Serial.println(fanState); lcd.clear(); lcd.setCursor(5, 0); lcd.print("Done!"); delay(2000); lcd.clear(); lcd.setCursor(5, 0); lcd.print("Ready"); drying = false;
Validare funcționalități:
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.
Elemente de noutate:
Optimizări realizate:
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: