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 11:06]
adina.zugravescu [Hardware Design]
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 45: Line 45:
      - OUT la pinul digital D2 de pe Arduino      - OUT la pinul digital D2 de pe Arduino
      - EN lăsat neconectat      - EN lăsat neconectat
 +
 +
   2. Conectare LCD 1602 cu interfață I2C:   2. Conectare LCD 1602 cu interfață I2C:
      - GND la GND de pe Arduino      - GND la GND de pe Arduino
Line 50: Line 52:
      - SDA la pinul A4 de pe Arduino      - SDA la pinul A4 de pe Arduino
      - SCL la pinul A5 de pe Arduino      - SCL la pinul A5 de pe Arduino
 +
 +
   3. Conectare ventilator 12V:   3. Conectare ventilator 12V:
      - GND la drain al MOSFET-ului IRF520N      - GND la drain al MOSFET-ului IRF520N
Line 55: Line 59:
      - Source-ul MOSFET-ului la GND      - Source-ul MOSFET-ului la GND
      - Gate-ul MOSFET-ului la pinul D3 (PWM) al Arduino, printr-o rezistență de 220Ω      - Gate-ul MOSFET-ului la pinul D3 (PWM) al Arduino, printr-o rezistență de 220Ω
 +
 +
   4. Alte componente:   4. Alte componente:
      - Diodă 1N4007 în paralel cu ventilatorul:​ catodul la +5V, anodul la drain      - Diodă 1N4007 în paralel cu ventilatorul:​ catodul la +5V, anodul la drain
Line 63: Line 69:
 ===== Software Design ===== ===== Software Design =====
  
-<note tip> +**Mediu ​de dezvoltare:** Arduino IDE
-Descrierea codului aplicaţiei (firmware):​ +
-  ​mediu de dezvoltare ​(if any) (e.g. AVR Studio, CodeVisionAVR) +
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) +
-  ​algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  ​(etapa 3) surse şi funcţii implementate +
-</​note>​+
  
 +**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 \\
 +
 +**Funcții implementate:​**
 +  * 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();
 +
 +        // 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();​
 +            }
 +       }
 +    }
 +    </​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_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;
 +    </​code>​
 +
 +**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 =====
  
 <note tip> <note tip>
-Care au fost rezultatele obţinute în urma realizării proiectului vostru.+Proiectul funcționează conform așteptărilor. 
 + 
 +Video demonstrativ:​ https://​youtube.com/​shorts/​mH0Pf0XKjyc?​feature=share
 </​note>​ </​note>​
  
 ===== Concluzii ===== ===== Concluzii =====
  
 +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:​ dryer.zip}}
  
-<note warning> 
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). 
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. +===== Bibliografie/Resurse =====
-</note>+
  
-===== Jurnal =====+**Resurse Hardware:​** 
 +  * [[https://​docs.arduino.cc/​resources/​datasheets/​A000066-datasheet.pdf|Datasheet Arduino UNO]] 
 +  * [[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]]
  
-<note tip> 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. 
-</​note>​ 
  
-===== Bibliografie/​Resurse ===== 
- 
-<​note>​ 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. 
-</​note>​ 
  
pm/prj2025/avaduva/adina.zugravescu.1747123586.txt.gz · Last modified: 2025/05/13 11:06 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