Lekcja 8: Zagrajmy muzyczkę.
            Lekcja dotyczy wykorzystania tzw. buzzera do wydawania dźwięków. Zagramy znaną przez wszystkich melodię. Ciekawe
            czy ją znacie...
            Buzzer to element magnetyczny generujący dźwięk. Jego specyfikacja znajduje się w tabeli poniżej.
        
                    Symbol: Buzzer z generatorem 5V 12mm - THT   
                   
  | 
                
                     
                 |     
       
        
Z teorii muzyki wiemy, że określone dźwięki mają swoje częstotliwości jak przedstawiono w tabeli poniżej.
| Dźwięk | Częstotliwość [Hz] | Długość | Ton | 
| c | 261 Hz | 3830 | 1915 | 
| d | 294 Hz | 3400 | 1700 | 
| e | 329 Hz | 3038 | 1519 | 
| f | 349 Hz | 2864 | 1432 | 
| g | 392 Hz | 2550 | 1275 | 
| a | 440 Hz | 2272 | 1136 | 
| h | 493 Hz | 2028 | 1014 | 
| C | 523 Hz | 1912 | 956 | 
Wykorzystamy buzzer w prosty sposób generując dźwięki o określonej długości i wysokości. Jako, że nasz buzzer może być zasilany napięciem 5V, podłączymy go bezpośrednio do Arduino do pinu np. numer 13 wg schematu jak poniżej:
 
        
 
        
       Piszemy kod jak poniżej:
        int PIN = 13;
        int dlugosc = 32; 
        char nuty[] = "eefggfedccdeeddeefggfedccdedcc "; 
        int bity[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2 };
        int tempo = 200;
        
        void grajTon(int tone, int czastrwania) {
            for (long i = 0; i < czastrwania * 1000L; i += tone * 2) {
                digitalWrite(PIN, HIGH);
                delayMicroseconds(tone);
                digitalWrite(PIN, LOW);
                delayMicroseconds(tone);}
            }
        void graj(char nuta, int czastrwania) {
            char symbol[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
            int tony[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
            for (int i = 0; i < 8; i++) {
                if (symbol[i] == nuta) {
                    grajTon(tony[i], czastrwania);}
            }}
        void setup() {
            pinMode(PIN, OUTPUT);
            }
        void loop() {
            for (int i = 0; i < dlugosc; i++) {
            if (nuty[i] == ' ') {
                    delay(bity[i] * tempo);} 
                else {
                    graj(nuty[i], bity[i] * tempo);}
            delay(tempo / 2); 
            }}
         
            Jak widzimy, nasz kod jest trochę bardziej skomplikowany niż poprzednie.
            W linii 1 deklarujemy zmienną PIN, która będzie przechowywać numer pinu 13 do późniejszych funkcji. 
            W linii 2 deklarujemy długość naszej melodii, a dokładnie ilość dźwięków. 
            W linii 3 deklarujemy zmienną typu char o nazwie nuty, która będzie przechowywać naszą melodię. Zauważmy, że
            to nowy typ zmiennej, która przechowuje ciąg znaków. Spacja na końcu jest przerwą między powtórzeniami melodii. 
            W linii 4 deklarujemy zmienną bity, która przechowuje bit melodii, a dokładnie długość trwania jednego bitu.
            W linii 5 deklarujemy tempo grania melodii.
            W linii 7 pojawia się zdefiniowana przez nas nowa funkcja o nazwie grajTon, której zadaniem jest odtworzenie tonu
            przez wykonanie funkcji digitalWrite. Jak pamiętamy z wcześniejszych lekcji, podanie numeru pinu i polecenia HIGH
            lub LOW włącza lub wyłącza sygnał na danym pinie.
            W linii 10 i 11 pojawia się nowa funkcja delayMicroseconds, która tak jak znana już nam funkcja delay
            odpowiada za przerwę w działaniu kodu, ale tym razem czas przerwy podajemy w mikrosekundach. 
            W linii 14 zaczyna się zdefiniowana przez nas funkcja graj, której zadaniem jest dopasowanie symbolu do danej
            wartości tonów, których zestaw widzieliśmy wcześniej w tabeli. Funkcja zawiera dwie zmienne: typu char i int. Po dopasowaniu
            tonu wywoływana jest w linii 19 poprzednia funkcja grajTon o zadanej wartości tonu i czasie trwania. 
            W linii 21 mamy standardową funkcję z przypisaniem numeru do pinu. 
            W linii 24 zaczyna się funkcja loop, której zadaniem jest ciągłe odtwarzanie sekwencji tonów w pętli  z 
            określony tempem. Funkjca if sprawdza tylko czy dany ton nie jest spacją, która ma 'wygrać' ciszę  
            (spacja jako ostatni symbol w deklaracji w linii 3). 
            Sprawdzamy teraz działanie naszego układu. 
            Znacie tę melodię?
             
         
Powrót do spisu materiałów






