This shows you the differences between two versions of the page.
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, 2 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> | ||