This shows you the differences between two versions of the page.
pm:prj2024:iotelea:stefan_paul.buracu [2024/05/26 19:43] stefan_paul.buracu |
pm:prj2024:iotelea:stefan_paul.buracu [2024/05/27 00:17] (current) stefan_paul.buracu |
||
---|---|---|---|
Line 79: | Line 79: | ||
</note> | </note> | ||
==== Implementare: ==== | ==== Implementare: ==== | ||
- | <note tip> | ||
Pentru inceput am incarcat cantece pe cardul microSD in formatul .wav cu specificatiile: | Pentru inceput am incarcat cantece pe cardul microSD in formatul .wav cu specificatiile: | ||
* rate: 16000 Hz | * rate: 16000 Hz | ||
* audio channels: mono | * audio channels: mono | ||
* format: PCM unsigned 8-bit | * format: PCM unsigned 8-bit | ||
- | </note> | + | **Variabile globale** |
+ | <code c> | ||
+ | #include <SD.h> // biblioteca pentru cardul SD | ||
+ | #include <TMRpcm.h> // biblioteca pentru controlul difuzorului | ||
+ | #include <FastLED.h> // biblioteca pentru banda LED | ||
+ | #include <SPI.h> | ||
+ | |||
+ | // LED STRIP | ||
+ | #define LED_PIN 8 | ||
+ | #define NUM_LEDS 10 | ||
+ | #define LED_TYPE WS2812B | ||
+ | #define COLOR_ORDER GRB | ||
+ | CRGB leds[NUM_LEDS]; | ||
+ | int pause_nr = 1; | ||
+ | uint8_t start_rainbow = 0; | ||
+ | |||
+ | // SD | ||
+ | #define SD_ChipSelectPin 4 // pinul de selectie a cipului pentru cardul SD | ||
+ | TMRpcm tmrpcm; // un obiect pentru biblioteca TMRpcm | ||
+ | int temp = 1; // variabila pentru selectarea cantecului | ||
+ | // butoane | ||
+ | int prev = 5; | ||
+ | int pause = 6; | ||
+ | int next = 7; | ||
+ | |||
+ | // senzor sunet | ||
+ | #define sensorPin A0 | ||
+ | // valori de calcul | ||
+ | float sensorValue = 0, filteredSignal = 0; | ||
+ | float filteredSignalValues[] = {5.3, 5.2, 5.1, 5.05, 5.0, 4.95, 4.9, 4.85, 4.8, 4.6, 4.4, 4.2, 4.0, 3.7, 3.4, 3.1, 2.7, 2.4, 2.0, 1.6, 1.2, 0.8, 0.4, 0.20, 0.19, 0.18, 0.17, 0.16, 0.15, 0.14, 0.13}; | ||
+ | |||
+ | </code> | ||
+ | **Functii** | ||
+ | * 1. //setup():// | ||
+ | Defineste ledurile, configureaza pinii pentru butoane, pinul pentru difuzor, face verificarile pentru cardul microSD, seteaza volumul pentru muzica, verifica daca exista primul cantec si da play la acesta. | ||
+ | <code c> | ||
+ | void setup() { | ||
+ | delay(2000); | ||
+ | // initializare banda LED | ||
+ | FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS); | ||
+ | FastLED.setBrightness(50); | ||
+ | // butoane | ||
+ | pinMode(pause, INPUT_PULLUP); | ||
+ | pinMode(next, INPUT_PULLUP); | ||
+ | pinMode(prev, INPUT_PULLUP); | ||
+ | |||
+ | tmrpcm.speakerPin = 9; // pin pentru difuzor | ||
+ | Serial.begin(9600); // serial communication | ||
+ | |||
+ | Serial.print("Initializing SD card..."); | ||
+ | if (!SD.begin(SD_ChipSelectPin)) { // incerc sa citesc cardul SD | ||
+ | Serial.println("Card failed, or not present"); | ||
+ | return; // return daca nu il gaseste | ||
+ | } | ||
+ | Serial.println("SD card initialized."); | ||
+ | char song[] = "song1.wav"; | ||
+ | // verifica daca am cantec | ||
+ | if (SD.exists(song)) { | ||
+ | Serial.println("File exists."); | ||
+ | } else { | ||
+ | Serial.println("File does not exist."); | ||
+ | } | ||
+ | |||
+ | // setez volum (0 to 7) | ||
+ | tmrpcm.setVolume(6); | ||
+ | |||
+ | // play song | ||
+ | tmrpcm.play(song); | ||
+ | if (tmrpcm.isPlaying()) { | ||
+ | Serial.println("The sound is playing."); | ||
+ | } else { | ||
+ | Serial.println("The sound is not playing."); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | * 2. //FilterSignal(float sensorSignal):// | ||
+ | Calculeaza valoarea semnalului in functie de un semnal de la senzor | ||
+ | <code c> | ||
+ | // functie calculat semnal | ||
+ | void FilterSignal(float sensorSignal) { | ||
+ | filteredSignal = (0.8 * filteredSignal) + (0.04995 * sensorSignal); | ||
+ | } | ||
+ | </code> | ||
+ | * 3. //CompareSignal(float filteredSignal):// | ||
+ | Compara semnalul si decide in ce interval se afla acesta pentru a aprinde ledurile cu o culoare corespunzatoare | ||
+ | <code c> | ||
+ | // functie colorare banda LED in functie de semnal | ||
+ | void CompareSignal(float filteredSignal) { | ||
+ | if (filteredSignal > filteredSignalValues[i]) { | ||
+ | fill_solid(leds, NUM_LEDS, CRGB::COLOR_i); | ||
+ | FastLED.show(); | ||
+ | delay(50); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | * 4. //song (void):// | ||
+ | Alege la ce cantec sa dea play in functie de variabila temp | ||
+ | <code c> | ||
+ | // functie alegere cantec in functie de variabila temp | ||
+ | void song (void) | ||
+ | { | ||
+ | if (temp == i) | ||
+ | { | ||
+ | char song[] = "song_i.wav"; | ||
+ | tmrpcm.play(song); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | * 5. //loop():// | ||
+ | Aceasta functie are in vedere functionalitatea principala a programului dupa cum urmeaza: | ||
+ | * extrage semnalul senzorului in functie de ce aude | ||
+ | * foloseste functia de filtrare a semnalului | ||
+ | * verific daca butonul de pauza este apasat si aprind ledurile in model de curcubeu ce se deplaseaza atata timp cat e muzica oprita | ||
+ | * daca nu am pauza apelez functia de comparare a semnalului pentru a si aprinde ledurile dupa acest semnal | ||
+ | * daca am apasat butonul de pauza se opreste muzica | ||
+ | * daca am apasat butonul de next se incrementeaza temp si se apeleaza functia song pentru a da play la urmatorul cantec | ||
+ | * daca am apasat butonul de prev se decrementeaza temp si se apeleaza functia song pentru a da play la cantecul precedent | ||
+ | <code c> | ||
+ | |||
+ | void loop() { | ||
+ | // calculez o valoare pentru senzor | ||
+ | sensorValue = (float) analogRead(sensorPin) * (5.0 / 1024.0); | ||
+ | Serial.println(sensorValue); | ||
+ | FilterSignal(sensorValue); | ||
+ | // apelez functia pentru a aprinde banda LED in functie de semnal | ||
+ | if (pause_nr % 2 == 0) { | ||
+ | fill_rainbow(leds, NUM_LEDS, start_rainbow, 255/NUM_LEDS); | ||
+ | FastLED.show(); | ||
+ | delay(10); | ||
+ | start_rainbow ++; | ||
+ | } else{ | ||
+ | CompareSignal(filteredSignal); | ||
+ | } | ||
+ | // verific daca am apasat un buton | ||
+ | while (digitalRead(pause) == 0 || digitalRead(next) == 0 || digitalRead(prev) == 0) | ||
+ | { | ||
+ | // am dat pauza | ||
+ | if (digitalRead(pause) == 0) | ||
+ | { | ||
+ | pause_nr ++; | ||
+ | tmrpcm.pause(); | ||
+ | while (digitalRead(pause) == 0); | ||
+ | } | ||
+ | // am dat next | ||
+ | else if (digitalRead(next) == 0) | ||
+ | { | ||
+ | if (temp < 20) { | ||
+ | temp = temp + 1; | ||
+ | } else { | ||
+ | temp = 1; | ||
+ | } | ||
+ | while (digitalRead(next) == 0); | ||
+ | song(); | ||
+ | } | ||
+ | // am dat prev | ||
+ | else if (digitalRead(prev) == 0) | ||
+ | { | ||
+ | if (temp > 1) { | ||
+ | temp = temp - 1; | ||
+ | } else { | ||
+ | temp = 20; // Set temp to the last song | ||
+ | } | ||
+ | while (digitalRead(prev) == 0); | ||
+ | song(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
===== Rezultate ===== | ===== Rezultate ===== | ||
- | Am reusit sa imi acopar toate planificarile pentru acest proiect ;-) | + | Am reusit sa imi acopar toate planificarile pentru acest proiect folosind concepte spi pentru card SD, transformare din semnal analogic in digital cu senzor dar si pwm cu leduri ;-) |
<note> | <note> | ||
- | Am atasat clipul:[[https://drive.google.com/file/d/19ob7ntD0efW2cOoPPEui_bF5H2s1pgUn/view?usp=drive_link]] | + | Am atasat clipul: |
+ | * [[https://drive.google.com/file/d/13v_hs0RTp1iZvAQ_Inq0mK0wcsWTKSM7/view?usp=drive_link]] | ||
+ | * [[https://www.youtube.com/watch?v=v2Cs-0qUORs&t=7s]] | ||
</note> | </note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Mi-a placut sa lucrez la acest proiect, chiar daca la inceput am avut dificultati legate de ce piese sa cumpar si cum sa le leg impreuna, dupa mult stres a aparut si satisfactia cand am vazut ca totul functioneaza si ma pot juca cu melodiile si ledurile. Desi am ars un arduino si un difuzor, nu m-a oprit nimic sa continui proiectul si sa merg mai departe m(. Am avut de munca cu tema culorilor alese pentru a reinterpreta globul original din apollo, dar eu spun ca am facut o treaba buna si acum il am si acasa :-P. | ||
===== Download ===== | ===== Download ===== | ||
- | <note>Arhiva cu codul: </note> | + | <note>Arhiva cu codul: |
+ | {{:pm:prj2024:iotelea:apollo_party_buracustefan331cb.zip|}} | ||
+ | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 102: | Line 273: | ||
* 15 mai: Comandat alte piese | * 15 mai: Comandat alte piese | ||
* 17 mai: Hardware | * 17 mai: Hardware | ||
+ | * 19 mai: Am scris cod pentru cardSD si cumva am reusit sa ard arduinoul 8-O | ||
+ | * 20 mai: Am luat alt arduino si am confectionat castile pentru proiect in loc de difuzorul pe care il aveam initial in plan | ||
+ | * 21 mai: Am continuat codul si am reusit sa redau melodiile pe casti si sa adaug butoane | ||
+ | * 22 mai: Am lucrat cu banda led si senzorul si le-am facut sa se aprinda in functie de acesta | ||
+ | * 23 mai: Am adaugat aprinderea ledurilor in curcubeu atunci cand muzica e data pe pauza | ||
+ | * 24 mai: Am mai retusat pagina de pe ocw | ||
</note> | </note> | ||
Line 116: | Line 293: | ||
</note> | </note> | ||
+ | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||