Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:avaduva:adina.zugravescu [2025/05/13 18:27]
adina.zugravescu
pm:prj2025:avaduva:adina.zugravescu [2025/05/29 18:03] (current)
adina.zugravescu [Download]
Line 24: Line 24:
 **Lista de componente:​** **Lista de componente:​**
  
-  * Arduino UNO 16U2 \\ +  *[[https://​www.optimusdigital.ro/​ro/​placi-avr/​4561-placa-de-dezvoltare-compatibila-cu-arduino-uno-r3-atmega328p-atmega16u2-cablu-50-cm.html?​search_query=arduino+uno&​results=129|Arduino UNO 16U2]] \\ 
-  * Senzor IR KY-032 \\ +  *[[https://​www.emag.ro/​modul-senzor-de-evitare-a-obstacolelor-cu-infrarosu-robofun-ky-032-00005437/​pd/​DS3YZDYBM/​|Senzor IR KY-032]] \\ 
-  * LCD 1602 cu I2C \\ +  *[[https://​www.optimusdigital.ro/​ro/​optoelectronice-lcd-uri/​2894-lcd-cu-interfata-i2c-si-backlight-albastru.html?​search_query=1602+i2c&​results=4|LCD 1602 cu I2C]] \\ 
-  * Ventilator 12V (PC fan, fire) \\ +  *[[https://​www.optimusdigital.ro/​ro/​componente-electronice-tranzistoare/​11864-tranzistor-mosfet-irf520n-canal-n-70w-100v-10a.html?​search_query=irf+520&​results=2|MOSFET IRF520N]] \\ 
-  * MOSFET IRF520N \\ +  *[[https://​www.optimusdigital.ro/​ro/​componente-electronice-diode/​7457-dioda-1n4007.html?​search_query=1N4007&​results=12|Diodă 1N4007 (flyback pentru protecție)]] \\ 
-  * Diodă 1N4007 (flyback pentru protecție) \\ +  *[[https://​www.optimusdigital.ro/​ro/​componente-electronice-condensatoare/​7817-condensator-ceramic-47-nf-50-v.html?​search_query=Condensator+ceramic+47+nF%2C+50+V+&​results=19|Condensator ceramic 47nF (filtrare zgomot)]] \\ 
-  * Condensator ceramic 47nF (filtrare zgomot) \\ +  *[[https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​1097-rezistor-025w-220.html?​search_query=rezistor+0.25W+220%CE%A9+&​results=3|Rezistență 220Ω]] \\ 
-  * Rezistență 220Ω \\ +  *[[https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​1088-rezistor-025w-100k.html?​search_query=10k&​results=80|Rezistență 10kΩ]] \\ 
-  * Rezistență 10kΩ \\ +  *[[https://​www.optimusdigital.ro/​ro/​prototipare-breadboard-uri/​44-breadboard-400-points.html?​search_query=breadboard&​results=126|Breadboard]] \\ 
-  * Breadboard \\+  * Ventilator 12V (PC fan) \\
   * Fire jumper \\   * Fire jumper \\
  
Line 77: Line 77:
     LiquidCrystal_I2C.h – pentru controlul afișajului LCD 1602 cu interfață I2C     LiquidCrystal_I2C.h – pentru controlul afișajului LCD 1602 cu interfață I2C
  
-**Structura logică și funcționarea sistemului**+**Descrierea codului aplicației:**
  
-  * Sistemul este organizat pe bază de stări logice: standby → activare → finalizare → revenire. \\ +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 secundeAfișajul LCD conectat prin I2C arată un countdown, iar în ultimele 8 secunde viteza ventilatorului scade treptat ​(PWM: 15010050). După încheiereventilatorul se oprește ​și se afișează mesajul „Done!”, urmat de revenirea la starea „Ready”.
-  * În starea de standby, se monitorizează ​constant ieșirea ​digitală a senzorului IR pentru a detecta prezența unei mâini ​(cu digitalRead) \\ +
-  * La declanșarese trece în starea de uscare: ​se pornește ​ventilatorul folosind ​un semnal ​PWM aplicat unui tranzistor MOSFET\\ +
-  * Este folosită o structură de temporizare software cu millis()ce permite măsurarea duratei fără blocarea execuției. \\ +
-  * Pe toată durata uscăriiLCD-ul este actualizat continuu cu un countdown\\ +
-  * După expirarea celor 60 de secundesistemul ​oprește ​ventilatorul, ​afișează mesajul „Done!” ​și revine în starea ​inițială („Ready”)\\+
  
-**Definiții, Variabile ​și Funcții:**+**Algoritmi ​și structuri implementate:**
  
-#define FAN_PIN 3 +  * Sistem pe stări logice: standby → activare → rampă PWM → finalizare → standby \\ 
-  ​pinul D3 de pe Arduino este utilizat ​pentru ​controlul ​ventilatorului +  ​* 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 \\ 
-#define SENSOR_PIN 2 +  ​* Afișare dinamică pe LCD: mesajele ​și countdown-ul sunt actualizate în timp real \\ 
-  pinul D2 de pe Arduino primește semnalul digital de la senzorul IR  +  ​* Optimizare a mesajelor transmise ​în Serial Monitor: evitarea afișărilor redundante \\
-   +
-LiquidCrystal_I2C lcd(0x27, 16, 2+
-  ​obiect care controlează un afișaj LCD 1602 conectat prin interfață I2C, cu adresa 0x27 +
-  ​ +
-bool drying +
-  indică dacă sistemul se află în starea activă de uscare+
  
-unsigned long startTime +**Funcții implementate:​** 
-  ​momentul în care a început uscarea+  ​* setup(): configurarea pinilor, inițializarea LCD și Serial Monitor 
 +    <​code>​ 
 +    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);​ 
 +    </​code>​ 
 +  * loop(): verifică senzorul, declanșează ciclul de uscare și gestionează afișajul 
 +    <​code>​ 
 +    // Update every 1 second to monitor the status 
 +    if (millis() - lastUpdateTime >= updateInterval) { 
 +        lastUpdateTime = millis();
  
-const unsigned long dryingDuration +        // If not currently drying and a hand is detected 
-  ​60000 – durata uscării în milisecunde ​(60 secunde) +        if (!drying && isHandDetected()) { 
-   +            drying = true; 
-setup() +            startTime = millis(); 
-  ​configurare pini pentru ventilator ​și senzorinițializare LCD+            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();​ 
 +            } 
 +       } 
 +    } 
 +    </​code>​ 
 +  ​* isHandDetected():​ verifică dacă senzorul IR detectează o mână (semnal LOW) 
 +    <​code>​ 
 +    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; 
 +    </​code>​ 
 +  * handlePWMSpeedControl():​ reduce progresiv viteza ventilatorului în ultimele 8 secunde 
 +    <​code>​ 
 +    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 
 +        } 
 +    } 
 +    </​code>​ 
 +  * resetDryingProcess():​ oprește ventilatorul,​ afișează „Done!” ​și revine la starea „Ready” 
 +    <​code>​ 
 +    analogWrite(FAN_PIN0);  // Stop the fan 
 +    Serial.print("​Fan state: "); 
 +    Serial.println(fanState);​ 
 +    lcd.clear();​ 
 +    lcd.setCursor(5,​ 0); 
 +    lcd.print("​Done!"​);​ 
 +    delay(2000);  ​
   ​   ​
-loop() +    lcd.clear(); 
-  ​logică principală de control și afișare +    ​lcd.setCursor(50); 
-   +    lcd.print("​Ready"​)
-millis(+    drying = false; 
-  temporizare non-blocantă pentru countdown +    </​code>​
-   +
-analogWrite(FAN_PINduty+
-  ​control PWM pentru ventilator +
-   +
-lcd.*() +
-  ​pentru inițializarea și manipularea afișajului+
  
 +**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:**
 +  * Rampă de coborâre a turației ventilatorului pe finalul ciclului
 +  * Countdown afișat pe LCD fără blocare
 +  * Diagnostic și urmărire prin mesaje în Serial Monitor
 +
 +**Optimizări realizate:​**
 +  * Afișarea valorii PWM în Serial Monitor se face doar atunci când aceasta se modifică, evitând mesaje redundante
 +  * Cod structurat în funcții dedicate cu responsabilitate unică
 +  * Afișare eficientă pe LCD fără suprascrieri inutile
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
Line 133: Line 224:
 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. 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.
 ===== Download ===== ===== Download =====
-{{:​pm:​prj2025:​avaduva: ​automatic_dryer.zip}}+{{:​pm:​prj2025:​avaduva: ​dryer.zip}}
  
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +**Resurse Hardware:** 
-Listă cu documente, ​datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** ​şi **Resurse Hardware**. +  * [[https://​docs.arduino.cc/​resources/​datasheets/​A000066-datasheet.pdf|Datasheet Arduino UNO]] 
-</note>+  * [[https://​www.vishay.com/​docs/​91017/​irf520.pdf|Datasheet IRF520N]] 
 +  * [[https://​arduinomodules.info/​ky-032-infrared-obstacle-avoidance-sensor-module/​|Senzor IR KY-032]] 
 +  * [[https://​www.optimusdigital.ro/​ro/​optoelectronice-lcd-uri/​2894-lcd-cu-interfata-i2c-si-backlight-albastru.html?​search_query=lcd+i2c&​results=17|LCD 1602 cu Interfață I2C]] 
 +  
 +**Resurse Software:** 
 +  ​[[https://​www.arduino.cc/​reference/​en/​language/​functions/​time/​millis/​|Arduino millis() Reference]] 
 +  ​[[https://​tenbaht.github.io/​sduino/​api/​LiquidCrystal_I2C/​|LiquidCrystal_I2C Library]] 
 +  * [[https://​docs.arduino.cc/​learn/​microcontrollers/​analog-output/​|Arduino PWM Reference]] 
 + 
  
pm/prj2025/avaduva/adina.zugravescu.1747150058.txt.gz · Last modified: 2025/05/13 18:27 by adina.zugravescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0