Nume: Buracu Ştefan Paul
Grupa: 331CB
Îndrumător: Ionuț Oțelea
Conectarea componentelor: Modul card microSD:
Banda LED:
Senzor sunet:
Amplificator Audio LM386:
Difuzor:
Butoane: conectate cu un picior la GND si celalalt la D5, D6, D7
Pentru inceput am incarcat cantece pe cardul microSD in formatul .wav cu specificatiile:
Variabile globale
#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};
Functii
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.
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."); } }
Calculeaza valoarea semnalului in functie de un semnal de la senzor
// functie calculat semnal void FilterSignal(float sensorSignal) { filteredSignal = (0.8 * filteredSignal) + (0.04995 * sensorSignal); }
Compara semnalul si decide in ce interval se afla acesta pentru a aprinde ledurile cu o culoare corespunzatoare
// 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); } }
Alege la ce cantec sa dea play in functie de variabila temp
// functie alegere cantec in functie de variabila temp void song (void) { if (temp == i) { char song[] = "song_i.wav"; tmrpcm.play(song); } }
Aceasta functie are in vedere functionalitatea principala a programului dupa cum urmeaza:
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(); } } }
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
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 . 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 .
Videoclipuri utile: