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: