This shows you the differences between two versions of the page.
pm:prj2024:vstoica:robert.petre0406 [2024/05/24 17:01] robert.petre0406 [Schemă Electrică] |
pm:prj2024:vstoica:robert.petre0406 [2024/05/27 13:29] (current) robert.petre0406 [Concluzii] |
||
---|---|---|---|
Line 5: | Line 5: | ||
Cred că este util pentru toată lumea deoarece este mai confortabil să îți umple paharul cu precizie un dozator decât să îți torni singur băutura în pahar. De asemenea, ar trebui să prevină și accidentele de neîndemânare (de exemplu, răsturnatul paharului atunci cand vrem să îl umplem). | Cred că este util pentru toată lumea deoarece este mai confortabil să îți umple paharul cu precizie un dozator decât să îți torni singur băutura în pahar. De asemenea, ar trebui să prevină și accidentele de neîndemânare (de exemplu, răsturnatul paharului atunci cand vrem să îl umplem). | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | {{:pm:prj2024:vstoica:schema_bloc_RP.png}} | + | {{pm:prj2024:vstoica:schema_bloc_rp_2.png}} |
Atunci când se apasă pe buton, senzorul ultrasonic va trimite către Arduino distanța la care se află paharul, și se va verifica dacă acesta este pus în pozitie (adica dacă se află într-o distanță limită față de senzor). Dacă se află în poziție ok, se va afișa pe ecran un mesaj cum că dozatorul începe să toarne băutura și plăcuța Arduino va porni pompa de apă pentru un timp definit ( volumul paharului / debitul pompei) folosind un timer. După ce paharul a fost umplut, pe ecran se va afișa un mesaj sugestiv. | Atunci când se apasă pe buton, senzorul ultrasonic va trimite către Arduino distanța la care se află paharul, și se va verifica dacă acesta este pus în pozitie (adica dacă se află într-o distanță limită față de senzor). Dacă se află în poziție ok, se va afișa pe ecran un mesaj cum că dozatorul începe să toarne băutura și plăcuța Arduino va porni pompa de apă pentru un timp definit ( volumul paharului / debitul pompei) folosind un timer. După ce paharul a fost umplut, pe ecran se va afișa un mesaj sugestiv. | ||
Line 11: | Line 11: | ||
=== Lista de piese === | === Lista de piese === | ||
- | ^ Componentă ^ Cantitate ^ Descriere ^ | + | ^ Componentă ^ Cantitate ^ Descriere ^ |
- | | Plăcuță Arduino Uno R3 | 1 | Placuta care controleaza celelalte piese | | + | | Plăcuță Arduino Uno R3 | 1 | Placuta care controleaza celelalte piese | |
- | | Ecran LCD 1602 I2C | 1 | Afișează mesaje sugestive legate de procesul de umplere al paharului| | + | | Ecran LCD 1602 I2C | 1 | Afișează mesaje sugestive legate de procesul de umplere al paharului | |
- | | Buton | 1 | Declanșează începerea umplerii paharului | | + | | Buton | 1 | Declanșează începerea umplerii paharului | |
- | | Rezistor 1.8KΩ | 1 | Sa functioneze corect butonul | | + | | Rezistor 1.8KΩ | 1 | Sa functioneze corect butonul | |
- | | Pompă de apă 3-6V | 1 | Responsabila pt a transfera apă din sticlă în pahar | | + | | Pompă de apă 3-6V | 1 | Responsabila pt a transfera apă din sticlă în pahar | |
- | | Breadboard 400 puncte | 1 | Rol de conectare a pieselor | | + | | Breadboard 400 puncte | 1 | Rol de conectare a pieselor | |
- | | Fire jumper | x | Rol de conectare a pieselor | | + | | Fire jumper | x | Rol de conectare a pieselor | |
- | | Modul releu 1 canal | 1 | Ajută la conectarea pompei de apă la Arduino și la baterie | | + | | Modul releu 1 canal | 1 | Ajută la conectarea pompei de apă la Arduino și la baterie | |
- | | Senzor ultrasonic HC-SR04 | 1 | Detectează dacă există un pahar în care să se toarne apă | | + | | Senzor ultrasonic HC-SR04 | 1 | Detectează dacă există un pahar în care să se toarne apă | |
+ | | Dioda 1N4001 | 2 | Asigura trecerea curentului intr-o singura directie si previne zgomotul produs de pompa| | ||
+ | | Socket baterii 4xAA | 1 | Alimenteaza pompa de apa | | ||
+ | | Socket baterie 9v | 1 | Alimenteaza placa Arduino | | ||
Line 28: | Line 31: | ||
==== Schemă Electrică ==== | ==== Schemă Electrică ==== | ||
{{pm:prj2024:vstoica:robert_petre_circuit2.png?600}} | {{pm:prj2024:vstoica:robert_petre_circuit2.png?600}} | ||
+ | |||
+ | ==== Montaj (nearanjat in carcasa) ==== | ||
+ | {{pm:prj2024:vstoica:robert_petre_montaj.jpeg?600}} | ||
==== Alegerea pinilor ==== | ==== Alegerea pinilor ==== | ||
* Pentru alimentare am conectat pinii de 5V si GND la breadboard pentru a putea conecta toate componentele de care am nevoie. | * Pentru alimentare am conectat pinii de 5V si GND la breadboard pentru a putea conecta toate componentele de care am nevoie. | ||
* Pentru toate piesele am conectat alimentarea pe breadboard VCC la + si GND la -. | * Pentru toate piesele am conectat alimentarea pe breadboard VCC la + si GND la -. | ||
- | * LCD I2C: am conectat cei 2 pini SDA si SCL la pinii analog A4 si A5 pe Arduino conform datasheet-ului. | + | * LCD I2C: am conectat cei 2 pini SDA (linia de date pentru comunicatia I2C) si SCL (linia de ceas pentru comunicatia I2C) la pinii analog A4 si A5 pe Arduino. |
- | * Senzor Ultrasonic: am conectat Trig si Echo la pinii digitali D13 si D12 pe Arduino conform datasheet-ului. | + | * Senzor Ultrasonic: am conectat Trig si Echo la pinii digitali D13 si D12 pe Arduino. |
- | * Butonul trebuie conectat la un pin digital asa ca am ales sa il conectez la D2. | + | * Butonul functioneaza cu intreruperi deci trebuie conectat la un pin digital care suporta (D2 sau D3) asa ca am ales sa il conectez la D2. |
- | * Releul trebuie conectat la un pin digital asa ca am ales sa il conectez la D7. La pinul NO (Normally Open) am conectat +ul bateriei, la pinul COM (Common) am conectat +ul pompei de apa apoi am conectat -ul pompei cu -ul bateriei | + | * Releul il activez cu un semnal digital asa ca l-am conectat la un pin digital D7. La pinul NO (Normally Open) am conectat +ul bateriei, la pinul COM (Common) am conectat +ul pompei de apa apoi am conectat -ul pompei cu -ul bateriei |
+ | |||
+ | ===== Software Design ===== | ||
+ | * Mediu de dezvoltare ARDUINO IDE | ||
+ | * Librării şi surse 3rd-party: Wire.h și LiquidCrystal_I2C.h pentru comunicație I2C și afișarea pe ecran LCD. | ||
<note tip> | <note tip> | ||
- | Aici puneţi tot ce ţine de hardware design: | + | COD SURSA |
- | * listă de piese | + | #include <Wire.h> |
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | #include <LiquidCrystal_I2C.h> |
- | * diagrame de semnal | + | |
- | * rezultatele simulării | + | |
- | </note> | + | |
- | ===== Software Design ===== | + | // initializeaza ecranul lcd |
+ | LiquidCrystal_I2C lcd(0x27, 16, 2); | ||
+ | // decrarare pini componente | ||
+ | const int trigPin = 13; | ||
+ | const int echoPin = 12; | ||
+ | const int relayPin = 7; | ||
+ | const int buttonPin = 2; | ||
- | <note tip> | + | // declarare variabile ajutatoare |
- | Descrierea codului aplicaţiei (firmware): | + | long duration; |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | int distance; |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | int buttonState = 0; |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
- | ===== Rezultate Obţinute ===== | + | void setup() { |
+ | // initializare lcd | ||
+ | lcd.init(); | ||
+ | lcd.backlight(); | ||
- | <note tip> | + | Serial.begin(9600); |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
- | ===== Concluzii ===== | + | // initializare senzor ultrasonic |
+ | pinMode(trigPin, OUTPUT); | ||
+ | pinMode(echoPin, INPUT); | ||
- | ===== Download ===== | + | // initializare releu |
+ | pinMode(relayPin, OUTPUT); | ||
+ | digitalWrite(relayPin, HIGH); | ||
- | <note warning> | + | // initializare buton |
- | 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ă ;-). | + | pinMode(buttonPin, INPUT); |
+ | } | ||
- | 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**. | + | void loop() { |
- | </note> | + | // citeste state-ul butonului |
+ | buttonState = digitalRead(buttonPin); | ||
- | ===== Jurnal ===== | + | // daca se apasa pe buton |
+ | if (buttonState == HIGH) { | ||
- | <note tip> | + | // se calculeaza distanta la care se afla paharul |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | // cu ajutorul senzorului ultrasonic |
- | </note> | + | digitalWrite(trigPin, LOW); |
+ | delayMicroseconds(2); | ||
- | ===== Bibliografie/Resurse ===== | + | digitalWrite(trigPin, HIGH); |
+ | delayMicroseconds(10); | ||
+ | digitalWrite(trigPin, LOW); | ||
- | <note> | + | duration = pulseIn(echoPin, HIGH); |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
+ | distance = duration * 0.034 / 2; | ||
+ | |||
+ | // afiseaza distanta pe lcd | ||
+ | lcd.clear(); | ||
+ | lcd.setCursor(0, 0); | ||
+ | lcd.print("Distance: "); | ||
+ | lcd.print(distance); | ||
+ | lcd.print(" cm"); | ||
+ | |||
+ | Serial.print("Distance: "); | ||
+ | Serial.print(distance); | ||
+ | Serial.println(" cm"); | ||
+ | |||
+ | // verifica daca paharul se afla in distanta dorita | ||
+ | if (distance <= 5) { | ||
+ | // activeaza releul (adica porneste pompa) | ||
+ | digitalWrite(relayPin, LOW); | ||
+ | |||
+ | // afiseaza un mesaj sugestiv pe ecran | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print("se umple"); | ||
+ | |||
+ | // timer pana se umple un pahar (6s) | ||
+ | delay(6000); | ||
+ | |||
+ | // dupa trecerea timpului se dezactiveaza releul | ||
+ | digitalWrite(relayPin, HIGH); | ||
+ | } else { | ||
+ | |||
+ | // daca nu se afla pahar in distanta dorita | ||
+ | // se afiseaza un mesaj | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print("nu umple"); | ||
+ | delay(1000); | ||
+ | } | ||
+ | delay(500); | ||
+ | } else { | ||
+ | // daca nu se apasa pe buton se afiseaza pe ecran | ||
+ | // un mesaj de idle | ||
+ | lcd.clear(); | ||
+ | lcd.setCursor(0, 0); | ||
+ | lcd.print("Idle"); | ||
+ | delay(500); | ||
+ | } | ||
+ | } | ||
</note> | </note> | ||
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | |
+ | ===== Rezultate Obţinute ===== | ||
+ | |||
+ | <html> | ||
+ | <iframe width="560" height="315" src="https://www.youtube.com/embed/u2XAiRkbJLs?si=WdWQncqFd19Jr105" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> | ||
+ | </html> | ||
+ | ===== Concluzii ===== | ||
+ | |||
+ | A fost interesant sa realizez proiectul. Am invatat cum sa conectez diferite componente hardware intre ele si cum sa le controlez. Mi-am dat seama ca un astfel de proiect trebuie planificat foarte bine si ca piesele trebuie atent studiate deoarece pare ca fac acelasi lucru si sunt asemanatoare, de fapt, nu e chiar asa. | ||
+ | ===== Download ===== | ||
+ | |||
+ | <html><a class="media mediafile mf_zip" href="https://ocw.cs.pub.ro/courses/_media/pm/prj2024/vstoica/RP_proiect.zip">Download archive</a></html> | ||
+ | |||
+ | |||
+ | ===== Bibliografie/Resurse ===== | ||
+ | RESURSE: | ||
+ | * https://www.handsontec.com/dataspecs/HC-SR04-Ultrasonic.pdf | ||
+ | * https://www.optimusdigital.ro/ro/electronica-de-putere-module-cu-releu/39-modul-cu-releu-cu-doua-canale.html | ||
+ | * https://www.optimusdigital.ro/ro/optoelectronice-lcd-uri/62-lcd-1602-cu-interfata-i2c-si-backlight-galben-verde.html | ||
+ | * https://roboticsbackend.com/arduino-push-button-tutorial/ | ||
+ | * https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf |