This shows you the differences between two versions of the page.
pm:prj2023:apredescu:vumeter [2023/05/29 21:11] andreea.state2603 [Introducere] |
pm:prj2023:apredescu:vumeter [2023/05/30 10:44] (current) andreea.state2603 [Download] |
||
---|---|---|---|
Line 12: | Line 12: | ||
{{:pm:prj2023:apredescu:schema_bloc.jpg?700|}} | {{:pm:prj2023:apredescu:schema_bloc.jpg?700|}} | ||
- | Cele două benzi led vor avea mai multe tipuri de aprindere al beculețelor: | + | Banda led va avea mai multe tipuri de aprindere al beculețelor: |
* de jos în sus | * de jos în sus | ||
* de sus în jos | * de sus în jos | ||
Line 19: | Line 19: | ||
Utilizatorul poate să treacă de la un mod de aprindere la altul prin intermediul unui buton care va cicla prin cele 4 moduri de aprindere. Dacă timp de 10 de secunde nu este detectată nicio apăsare de buton, se va trece automat în următorul mod de aprindere. | Utilizatorul poate să treacă de la un mod de aprindere la altul prin intermediul unui buton care va cicla prin cele 4 moduri de aprindere. Dacă timp de 10 de secunde nu este detectată nicio apăsare de buton, se va trece automat în următorul mod de aprindere. | ||
+ | Pe ecranul LCD va apărea numele modului curent de aprindere al beculețelor și o scară de punctulețe care formează o reprezentare vizuală a creșterii intensității sunetului. | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 30: | Line 30: | ||
* LCD I2C 16x2 | * LCD I2C 16x2 | ||
- | **Schema electrica** | + | **Schema electrică** |
+ | {{:pm:prj2023:apredescu:circuit.png?700|}} | ||
- | |||
- | {{:pm:prj2023:apredescu:circuit_vumeter.png?700|}} | ||
{{:pm:prj2023:apredescu:whatsapp_image_2023-05-28_at_11.17.56_pm.jpeg?400|}} | {{:pm:prj2023:apredescu:whatsapp_image_2023-05-28_at_11.17.56_pm.jpeg?400|}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | |||
+ | <note tip> | ||
Codul proiectului a fost dezvoltat în Arduino IDE și am folosit bibliotecile FastLED pentru banda led și LiquidCrystal_I2C pentru afișarea pe ecranul LCD. | Codul proiectului a fost dezvoltat în Arduino IDE și am folosit bibliotecile FastLED pentru banda led și LiquidCrystal_I2C pentru afișarea pe ecranul LCD. | ||
+ | </note> | ||
+ | |||
+ | Funcții utilizate în cod: | ||
+ | * void setup() - inițializez banda led si ecranul LCD și configurez întreuperile pentru buton și pentru TIMER1 | ||
+ | * void myISR() - atunci când butonul este apăsat trec la următorul mod de afișare al led-urilor, resetez timer-ul și scriu pe ecranul LCD numele modului curent de afișare | ||
+ | * void displayLcdMode() - afișez pe LCD textul cu numele modului curent de afișsare al led-urilor | ||
+ | * void displayHearts(int noHearts) - afișez pe LCD inimioarele care reprezintă o scară a intensității sunetului | ||
+ | * struct my_leds colorWheel(int s) - în această funcție setez câte led-uri trebuie aprinse, culoarea acestora și numărul de inimioare afișate pe LCD (folosesc această funcție doar pentru modul 0 si modul 1) | ||
+ | * displayLedsAndHearts2(), displayLedsAndHearts3() - pentru modul 2 sau 3 trece prin vectorul de led-uri și setează culoarea led-urilor și apelează funcția de afișsare a inimioarelor de pe ecranul LCD | ||
+ | * upDown(int s), downUp(int s), intExt(int s), extInt(int s) - în funcție de valoarea citită de la senzorul de sunet stabilește intervalul de led-uri care trebuie aprinse si apelează funcția de displayLedsAndHearts() corespunzătoare modului de afișare | ||
+ | * void loop() - citesc inputul de la senzorul de sunet, verific dacă este nevoie să modific textul de pe ecranul LCD (dacă a fost apăsat butonul sau dacă au trecut 10 secunde de când nu a mai fost apăsat butonul) și verific care este modul curent de afișare al led-urilor și apelez funcția corespunzătoare | ||
+ | |||
+ | În structura my_leds păstrez câte led-uri trebuie aprinse, culoarea lor și numărul de inimi. | ||
Banda led are 4 moduri de afișare care se schimbă fie la o apăsare de buton, fie dupa 10 secunde în care nu a fost detectată nicio apăsare de buton. | Banda led are 4 moduri de afișare care se schimbă fie la o apăsare de buton, fie dupa 10 secunde în care nu a fost detectată nicio apăsare de buton. | ||
- | În implementare am folosit întreruperi pentru butonul de switch cu ajutorul căruia iteram prin cele 4 moduri de afișare ale led-urilor. Prima apăsare de buton face tranziția de la modul 0 la modul 1, a doua apăsare de buton face tranziția de la modul 1 la modul 2, a treia apăsare face tranziția de la modul 2 la modul 3, iar a patra apăsare face tranziția de la modul 3 la modul 0, astfel reluându-se ciclul. | + | În implementare am folosit întreruperi pentru butonul de switch cu ajutorul căruia iterez prin cele 4 moduri de afișare ale led-urilor. Prima apăsare de buton face tranziția de la modul 0 la modul 1, a doua apăsare de buton face tranziția de la modul 1 la modul 2, a treia apăsare face tranziția de la modul 2 la modul 3, iar a patra apăsare face tranziția de la modul 3 la modul 0, astfel reluându-se ciclul. |
- | În cazul în care timp de 10 secunde nu a fost detectă nicio apăsare de buton am folosit TIMER1 pentru a face tranziția către următorul mod de afișare. | + | În cazul în care timp de 10 secunde nu a fost detectată nicio apăsare de buton am folosit TIMER1 pentru a face tranziția către următorul mod de afișare. |
De asemenea, în cazul în care este detectată o apăsare de buton timerul este resetat pentru a evita situația în care unul dintre modurile de afișare ar fi durat mai puțin de 10 secunde. | De asemenea, în cazul în care este detectată o apăsare de buton timerul este resetat pentru a evita situația în care unul dintre modurile de afișare ar fi durat mai puțin de 10 secunde. | ||
- | Pe ecranul LCD se afișează în text a modului curent de afișare și o reprezentare vizuala a creșterii intensității sunetului. | + | Inițial am vrut să folosesc funcția de map de la arduino pentru a decide câte led-uri să se afișeze, dar efectul vizual rezultat nu era unul așa de frumos, întrucât numărul de led-uri aprinse se schimba brusc. Așa că am decis să verific eu de de mână pentru fiecare mod de aprindere câte led-uri să se aprindă în funcție de valoara primită de la senzorul de sunet. După multe testări cu diverse inputuri și după ajustarea senzitivității senzorului, am găsit combinațiile de input și număr de led-uri aprinse astfel încât să obțin un efect vizual gradual. Faptul ca eu decid pentru fiecare mod în parte ce beculețe să se aprindă m-a ajutat să obțin efectul vizual dorit, dar a rezultat în destul de mult cod de scris. |
- | <note tip> | ||
- | Arhiva ce conține codul sursă al proiectului: {{:pm:prj2023:apredescu:state_rebecca_soundreactivevumeter.zip|}} | ||
- | </note> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
Line 61: | Line 72: | ||
<html> | <html> | ||
<iframe | <iframe | ||
- | src="https://www.youtube.com/embed/ABr3lWAAWA0" | + | src="https://www.youtube.com/embed/LetYxORQ1os" |
title="YouTube video" | title="YouTube video" | ||
frameborder="0" | frameborder="0" | ||
Line 71: | Line 82: | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul este funcțional și am reușit să realizez tot ce mi-am propus să fac pentru acesta. Singurul lucru pe care aș vrea să îl mai îmbunătățesc pe viitor este afișarea pe ecranul LCD. Întrucât se primesc foarte multe imputuri de la senzorul de sunet, în momentul în care afișez inimioarele care reprezință intensitatea sunetului textul care apare pe ecran îsi pierde din claritate. | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | <note> |
- | 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**. | + | Arhiva ce conține codul sursă al proiectului: {{:pm:prj2023:apredescu:soundreactivemeter.zip|}} |
</note> | </note> | ||
- | ===== Jurnal ===== | ||
- | |||
- | <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 ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | FastLED: https://github.com/FastLED/FastLED/wiki/Basic-usage |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
- | </note> | + | LiquidCrystal_I2C: https://reference.arduino.cc/reference/en/libraries/liquidcrystal-i2c/ |
+ | |||
+ | Întrerupere buton: https://riptutorial.com/arduino/example/9856/interrupt-on-button-press | ||
+ | |||
+ | Datasheet ATmega328P: https://ocw.cs.pub.ro/courses/_media/pm/atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||