***** A program testének részei ****** Változók megadása // a piezoelektromos kristály "hangszóró" a 9-ik // digitális tűre van csatlakoztatva int hangszoroTu = 9; // a hangjegyek száma a dallamban int ahangjegyekszama = 28; // a dallam egy sorozatban vannak megadva // a betűk a hangjegyeket, a végén a szóköz szünetet jelent char hangjegysor[] = "cecegg cecegg Chagfa gfedcc "; // az egymást követő hangok hossza egy sorozatban van megadva int hanghossza[] = { 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,1,1,1,2,1,1,1,1,1,1,2,1,4 }; int sebesseg = 300; ****** szolaHang függvény // létrehozza a szolaHang függvényt, amely megszólaltatja a hangot // a függvény két egész számú változót kér, melyek: hang és idotartam // a hang változó a szolaHangjegyHangja függvényben kap értéket // Itt rezegtetjük meg a membránt! void szolaHang(int hang, int idotartam) { // alább egy ismétlődő rész következik: // tedd, míg i kisebb (időtartam x 1000L) értékénél // Mi az L? Válasz itt, az U & L formatters cím alatt: // http://arduino.cc/en/Reference/IntegerConstants // i értékét növeld minden lépésben a hang változó kétszeresével // i += hang * 2 jelentése: i = i + hang x 2 for (long i = 0; i < idotartam * 1000L; i += hang * 2) { // 5 Voltot adunk a piezoelektromos kristálynak digitalWrite(hangszoroTu, HIGH); // legyen 5V a 'hang' értékének megfelelő időhosszig delayMicroseconds(hang); // 0 Voltot adunk a piezoelektromos kristálynak digitalWrite(hangszoroTu, LOW); // legyen 0V a 'hang' értékének megfelelő időhosszig delayMicroseconds(hang); } } ****** szolaHangjegyHangja függvény // létrehozza a szolaHangjegyHangja függvényt, amely // kér egy betűjel (hangjegy), és egy egész számú (idotartam) változót, // megadja a hangjegyek neveit és a nekik megfelelő hosszúságú időtartamot, // ameddig majd kapják a szögletes hullám MAGAS értékét. void szolaHangjegyHangja(char hangjegy, int idotartam) { char hangjegynevek[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'h', 'C' }; int hangok[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // lejátssza a hangjegy nevének megfelelő hangot for (int i = 0; i < 8; i++) { // ha a hangjegyeknevek sorozatból az egyik elem // megfelel a hangjegy változó pillanatnyi értékének if (hangjegynevek[i] == hangjegy) { // akkor hívja a szolaHang függvényt a következő változókkal // hangok és időtartam; itt a hangok[i] értéke // lesz a hang változó értéke a szolaHang függvény számára szolaHang(hangok[i], idotartam); } } } ****** Beállítások // a digitális 9-ik tű kimenetre van beállítva void setup() { pinMode(hangszoroTu, OUTPUT); } ****** Hurok rész // ezt ismételgeti, míg le nem játszotta // a dallam összes hangját void loop() { // amíg az i változó értéke nem lesz 28, addig ismétli // a lenti parancsokat, vagyis lejátssza egyenként // a dallam hangjait for (int i = 0; i < ahangjegyekszama; i++) { // ha a hangjegysor eleme szóköz, if (hangjegysor[i] == ' ') { // akkor szünet lesz egy darabig delay(hanghossza[i] * sebesseg); // ez a szünet } else { // máskülönben megszólal egy hang a hangjegysorból // hívjuk a szolaHangjegyHangja függvényt, megadva neki a // a hangjegysor egyik elemét, a hang hosszát szorozva a sebességgel szolaHangjegyHangja(hangjegysor[i], hanghossza[i] * sebesseg); } // szünet a dallam hangjai között delay(sebesseg / 2); } }