Program namijenjen zabavi, a omogućuje korisniku ovisno o donacijama njegova tri prijatelja pustiti određenu pjesmu s Jukebox-a pošto svaka pjesma ima svoju cijenu.
1. ZADATAK
Program se sastoji od:
- 3x LED-ice namijenjene za prikaz određenih uzoraka svijetljenja dok svira pjesma na zvučniku
- 1x Integrirano tipkalo za Hardwareski interrupt
- 1x Piezzo buzzer koji služi za reproduciranje određene pjesme
- 1x NUCLEO-F072RB pločica mikroupravljača
- Serial Terminal za ispis određenih poruka tokom izvršenja programa, te za odabir određene pjesme od ponuđenih
- 1x LCD zaslon s dva retka po 16 znakova za prikaz
U uvodu programa definirane su varijable koje se koriste u programu, od kojih su one ili osnovnog tipa (integer, float, char) ili su tipa objekta kojim se pzivaju za izvršavanje zadane rednja s definiranim pinom na koji su spojeni.
Program započinje uvodom i upoznavanjem s glavnim korisnikom programa nazvanim Mate. Radnja se odvija u pred-COVID razdoblje dok se još moglo nesmetano boraviti u kafićima.
Dakle, Mate želi pustiti pjesmu preko Jukebox-a. No, igrom slučaja, zabravio je ponijeti novčanik sa sobom. U ovoj situaciji moli svoja tri prijatelja da mu posude određenu svotu novca (oni su definirani kao varijable x, y i z) te smo ograničili da mu mogu dati iznos u rasponu od 0 do 50 kuna. Nakon toga, program pozivom naredbe x=(rand() %51) (isto vrijedi i za varijable y i z) pridodaje varijabli x određenu proizvoljnu vrijednost iz tog raspona brojeva. Program nam na taj način ispiše koliko mu je svaki od prijatelja dao novca (paralelno na zaslonu računala i na LCD zaslonu), te nakon toga ispisuje se koliko Mate ukupno ima novaca nakon donacija od prijatelja.
Nakon toga, Mate se upućuje k Jukebox-u na kojemu se ispisuje trenutni novčani status Matin i ponuda pjesama. Kako se radi o pametnom Jukebox-u, nakon što obradi koliko Mate posjeduje novaca, sukladno tome mu izbacuje koje sve pjesme može pustiti. Caka je u tome što svaka pjesma ima određenu cijenu pa se sukladno tome i iznosu koji Mate posjeduje može i određena pjesma pustiti.
Ovdje se uvjeti ispituju pomoću if petlje pri kojemu se Matin trenutni novčani status uspoređuje s cijenama pjesama i sukladno tome mu Jukebox nudi izbor koje su mu pjesme na raspolaganju. Nakon toga, ako postoji izbor pjesama, mora se unijeti slovo pored pjesme koju se želi pustiti, te se nakon toga pjesma pušta preko piezo zvučnika.
Svaka pjesma je definirana s dva niza pri kojemu jedan niz sadrži frekvencije svake note, dok drugi niz sadrži duljinu trajanja pojedine note. Izvođenje pjesme ostvaruje se kroz for petlju koja kad naiđe na zadnji član niza završava, te sukladno tome završava i pjesma. Nakon završetka željene pjesme, ispisuje se poruka na zaslonu računala i na LCD zaslonu, te se prikaže koliko je dugo izvršenje programa trajalo upotrebom Timer-a.
Program sadrži i integrirani hardverski interrupt koji predstavlja ometača, odnosno prijatelja koji se ubaci i inzistira puštanje pjesme po njegovom izboru, pa se pritiskom prekidača svira definirana pjesma funkcijom ometac.
2. SHEMA SPOJA
Diff: Jukebox.cpp
- Revision:
- 0:837b9834f505
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Jukebox.cpp Thu Nov 26 01:26:24 2020 +0000 @@ -0,0 +1,409 @@ +#include "mbed.h" +#include "TextLCD.h" +#include "Ledice.h" +InterruptIn button(PC_13); +Ticker turn_me_on1, turn_me_on2, turn_me_on3; //probati napraviti zaglavlje i cpp za funkcije, te zaglavlje i cpp za frekvencije pjesama :D +Timer vrijeme; +PwmOut buzzer(PB_4); +Serial pc(USBTX, USBRX); +//frekvencija melodije "Lijepa naša" +float f1[]= {659.3, 659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 392, 349.2, 329.6, 349.2, + 392, 440, 392, 349.2, 329.6, 349.2, 392, 659.3, 659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 392, + 349.2, 329.6, 349.2, 392, 440, 493.9, 493.9, 587.3, 523.3, 493.9, 493.9, 493.9, 440, 493.9, + 493.9, 523.3, 587.3, 493.9, 587.3, 587.3, 587.3, 587.3, 587.3, 523.3, 493.9, 440, 392, 659.3, + 659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 392, 349.2, 329.6, 349.2, 392, 440, 493.9, 493.9, + 587.3, 523.3 + };//70 notes +//trajanje nota +float b1[]= {1, 1, 1.5, 0.5, 0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5, 0.5, 0.5, 0.5, 2, 1, 1, 1.5, 0.5, + 0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5, 0.5, 1, 2, 1, 1, 1.5, 0.5, 1, 0.5, 0.5, 1.5, 0.5, 0.5, 0.5, 0.5, + 0.5, 1, 1, 1, 1, 2, 1, 1, 1.5, 0.5, 0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5, 0.5, 1, 2, 0.5 + }; //70 notes +//frekvencija melodije "Zvončići" +float f2[]= {329.6, 329.6, 329.6, 329.6, 329.6, 329.6, 329.6, 392, 261.6, 293.6, 329.6, 349.2, 349.2, 349.2, 349.2, 349.2, + 329.6, 329.6, 329.6, 329.6, 329.6, 293.6, 293.6, 329.6, 293.6, 392, 329.6, 329.6, 329.6, 329.6, 329.6, 329.6, + 329.6, 392, 261.6, 293.6, 329.6, 349.2, 349.2, 349.2, 349.2, 349.2, 329.6, 329.6, 329.6, 329.6,392, 392, 349.2, + 293.6, 261.6 + }; //51 notes +//trajanje nota +float b2[]= {1, 1, 2, 1, 1, 2, 1, 1, 1.5, 0.5, 4, 1, 1, 1.5, 0.5, 1, 1, 1, 0.5, 0.5, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, + 1.5, 0.5, 4, 1, 1, 1.5, 0.5, 1, 1, 1, 0.5, 0.5, 1, 1, 1, 1, 4 + };//51 notes +//frekvencija melodije "Dvadesete" +float f3[]= {1, 523.3, 587.3, 659.3, 659.3, 659.3, 659.3, 587.3, 523.3, 659.3, 587.3, 587.3, 1, 587.3, 659.3, 698.5, 698.5, 659.3, + 659.3, 587.3, 523.3, 523.3, 659.3, 587.3, 440, 440, 1, 523.3, 587.3, 659.3, 659.3, 659.3, 659.3, 587.3, 523.3, 659.3, + 587.3, 587.3, 1, 587.3, 659.3, 698.5, 698.5, 659.3, 659.3, 587.3, 523.3, 523.3, 659.3, 587.3, 440, 440, 440, 1 + }; //53 notes +//trajanje nota +float b3[]= {2, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 0.5, 0.5, 1, 0.5, 1, 0.5, 0.5, 0.5, 1, 0.5, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 1, 0.5, 1, + 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 0.5, 0.5, 1, 0.5, 1, 0.5, 0.5, 0.5, 1, 0.5, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 1, 0.5, 1, 1 + };//53 notes +//frekvencija melodije "Moj Ivane" +float f4[]= {493.9, 587.3, 523.3, 523.3, 698.5, 659.3, 659.3, 587.3, 587.3, 523.3, 587.3, 587.3, 523.3, 587.3, 698.5, 659.3, 659.3, 587.3, + 587.3, 523.3, 523.3, 587.3, 523.3, 493.9, 493.9, 587.3, 523.3, 523.3, 698.5, 659.3, 659.3, 587.3, 587.3, 523.3, 587.3, 587.3, + 523.3, 587.3, 698.5, 659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 587.3, 523.3, 493.9, 587.3, 523.3, 523.3 + };//51 notes +//trajanje nota +float b4[]= {1, 1, 0.5, 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 0.5, 0.5, 0.5, 0.5, + 1, 1, 0.5, 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 0.5, 0.5, 0.5, 0.5, + 0.5, 0.5, 3 + };//51 notes + +TextLCD lcd(PA_0, PA_1, PA_4, PB_0, PC_1, PC_0); // rs, e, d4-d7 +int x=0; +int y=0; +int s=0; +int z=0; +int t=0; +int i=0; +int pjesma1=50, pjesma2=60, pjesma3=90; +char c; +void ometac(void); +void led (void); +void led1 (void); +void led2 (void); +void led3 (void); +void led4 (void); +void svegori(void); +void knightrider(void); +Ledice redled(PA_10); +Ledice yellowled(PB_3); +Ledice greenled(PB_5); +int main() +{ + vrijeme.start(); + button.rise(&ometac); + lcd.locate(0,0); + srand(time(0)); //current time as seed of random number generator + x = (rand() %51); + y = (rand() %51); + z = (rand() %51); + pc.printf("\n\rMate je odlucio naruciti pjesmu za ekipu, ali zaboravio je novcanik.\n\rZamolio je svoja tri prijatelja Jozu, Peru i Ivu da mu posude odredjeni iznos novca kako bi mogao naruciti zeljenu pjesmu.\n\rKvaka je ta da svaka pjesma ima odredjni iznos. Zato ce Mate moci pustiti pjesmu ovisno o donacijama svojih prijatelja.\n\r"); + pc.printf("\n\rJozo je dao Mati %d kn\n", x); + lcd.printf("Jozo je dao\nMati %d kn", x); + wait(2); + lcd.cls(); + pc.printf("\n\rPero je dao Mati %d kn\n", y); + lcd.printf("Pero je dao\nMati %d kn", y); + wait(2); + lcd.cls(); + pc.printf("\n\rIvo je dao Mati %d kn\n", z); + lcd.printf("Ivo je dao\nMati %d kn", z); + wait(2); + lcd.cls(); + s=x+y+z; + pc.printf("\n\rMate sad posjeduje %d kn. Kao takav, upucuje se ka Jukebox-u!\n\r",s); + lcd.printf("Mate sad ima\n%d kn!", s); + wait(2); + lcd.cls(); + lcd.printf("Slijedi izbor\npjesme"); + wait(2); + lcd.cls(); + pc.printf("\n\rNa jukebox-u svaka pjesma ima svoj odredjeni iznos koji se mora uplatiti kako bi ju se pustilo.\n\rIzbor je slijedeci:\n\ra. Lijepa nasa 50kn\n\rb. Zvoncici 60kn\n\rc. Cajka majka 90kn\n\rSad slijedi Matin izbor...\n\r"); + pc.printf("\n\rJukebox ispisuje vas raspolozivi iznos:\n\rImate na raspolaganju %d kn", s); +//ovdje samo ide poruka da ništa od pjesme + if (s < pjesma1) { + led(); + pc.printf("\n\rPrijatelju, neces ti nista pustati veceras. Vrati se za svoj stol!\n\r"); + lcd.printf("Nema za tebe\nnista!"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } +//ovdje kreće loop s jednom pjesmom + else if ((s > pjesma1) && (s < pjesma2)) { + lcd.cls(); + pc.printf("\n\rMozes dobiti samo prvu pjesmu. Sviram: Lijepa nasa...\n"); + lcd.printf("Moze samo prva\npjesma!"); + wait(1); + lcd.cls(); + turn_me_on1.attach(&led1, 0.2); + for (i=0; i<=70; i++) { + lcd.printf("Svira:\nLijepa nasa..."); + buzzer.period(1/(f1[i])); // set PWM period + buzzer=0.5; // set duty cycle + wait(0.5*b1[i]); + buzzer=0.0; + lcd.cls(); + if (i==70) { + lcd.printf("To bi bilo to!"); + pc.printf("\n\rTo je to za danas!\n\r"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } + } + led(); + } +//ovdje kreće loop s dvije pjesme + else if ((s > pjesma2) && (s < pjesma3)) { + pc.printf("\n\rMozes dobiti prvu ili drugu pjesmu pjesmu. Odaberi sto ces:\n\r"); + lcd.printf("Moze prva ili\ndruga pjesma!"); + lcd.cls(); + lcd.printf("Odaberi pjesmu.."); + wait(1); + lcd.cls(); + c=pc.getc(); + if (c=='a') { + pc.printf("\n\rDobar odabir! Svira: Lijepa nasa...\n\r"); + turn_me_on1.attach(&led1, 0.2); + for (i=0; i<=70; i++) { + lcd.printf("Svira:\nLijepa nasa..."); + buzzer.period(1/(f1[i])); // set PWM period + buzzer=0.5; // set duty cycle + wait(0.5*b1[i]); + buzzer=0.0; + lcd.cls(); + if (i==70) { + lcd.printf("To bi bilo to!"); + pc.printf("\n\rTo je to za danas!\n"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } + } + led(); + } else if (c=='b') { + pc.printf("\n\rDobar odabir! Svira: Zvoncici...\n\r"); + turn_me_on2.attach(&led2, 0.2); + for (i=0; i<=51; i++) { + lcd.printf("Svira:\nZvoncici..."); + buzzer.period(1/(f2[i])); // set PWM period + buzzer=0.5; // set duty cycle + wait(0.25*b2[i]); + buzzer=0.0; + lcd.cls(); + if (i==51) { + lcd.printf("To bi bilo to!"); + pc.printf("\n\rTo je to za danas!\n\r"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } + } + led(); + } else { + pc.printf("\n\rNisi odabrao nista od ponudjenog.\n\rAj bok\n\r!"); + lcd.printf("Krivi odabir!\nZbogom momce!"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } + } +//Ovdje kreće loop s tri pjesme + if ((s >= pjesma3)) { + pc.printf("\n\rMozes dobiti bilo koju pjesmu. Odaberi koju ces:\n\r"); + lcd.printf("Mogu sve\npjesme!"); + lcd.cls(); + lcd.printf("Odaberi pjesmu.."); + wait(1); + lcd.cls(); + c=pc.getc(); + if (c=='a') { + pc.printf("\n\rDobar odabir! Svira: Lijepa nasa...\n\r"); + turn_me_on1.attach(&led1, 0.2); + for (i=0; i<=70; i++) { + lcd.printf("Svira:\nLijepa nasa..."); + buzzer.period(1/(f1[i])); // set PWM period + buzzer=0.5; // set duty cycle + wait(0.5*b1[i]); + buzzer=0.0; + lcd.cls(); + if (i==70) { + lcd.printf("To bi bilo to!"); + pc.printf("\n\rTo je to za danas!\n\r"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } + } + led(); + } else if (c=='b') { + pc.printf("\n\rDobar odabir! Svira: Zvoncici...\n\r"); + turn_me_on2.attach(&led2, 0.2); + for (i=0; i<=51; i++) { + lcd.printf("Svira:\nZvoncici..."); + buzzer.period(1/(f2[i])); // set PWM period + buzzer=0.5; // set duty cycle + wait(0.25*b2[i]); + buzzer=0.0; + lcd.cls(); + if (i==51) { + lcd.printf("To bi bilo to!"); + pc.printf("\n\rTo je to za danas!\n\r"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } + } + led(); + } else if (c=='c') { + pc.printf("\n\rMogao si bolje izabrati! Svira: Cajka majka...\n\r"); + turn_me_on3.attach(&svegori, 0.2); + for (i=0; i<=53; i++) { + lcd.printf("Svira:\nCajka majka..."); + buzzer.period(1/(f3[i])); // set PWM period + buzzer=0.5; // set duty cycle + wait(0.5*b3[i]); + buzzer=0.0; + lcd.cls(); + if (i==53) { + lcd.printf("To bi bilo to!"); + pc.printf("\n\rTo je to za danas!\n\r"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } + } + led(); + } else { + pc.printf("\n\rNisi odabrao nista od ponudjenog.\n\rAj bok!\n\r"); + lcd.printf("Krivi odabir!\nZbogom momce!"); + wait(2); + lcd.cls(); + t=vrijeme.read(); + lcd.printf("Potrosio si\n%ds na ovo!", t); + wait(2); + lcd.cls(); + } + } +} +void ometac() +{ + lcd.cls(); + pc.printf("\n\rBrateee, pusti nesto od ToNsonaaa!\n\r"); + lcd.printf("Brate,pusti\nToNsonaaa!"); + wait(2); + lcd.cls(); + led4(); + for (i=0; i<=51; i++) { + lcd.printf("Evo ti ga!"); + buzzer.period(1/(f4[i])); // set PWM period + buzzer=0.5; // set duty cycle + wait(0.5*b4[i]); + buzzer=0.0; + lcd.cls(); + if (i==51) { + lcd.printf("Ajmo sad dalje!"); + pc.printf("\n\rNastavljamo dalje!\n\r"); + wait(2); + lcd.cls(); + } + } + led(); +} +void led1 () +{ + for(int i=0; i<3; i++) { + redled.boom(); + yellowled.off(); + greenled.boom(); + wait(0.25); + redled.off(); + yellowled.boom(); + greenled.off(); + wait(0.25); + redled.boom(); + yellowled.off(); + greenled.boom(); + wait(0.25); + } + turn_me_on1.detach(); +} +void led2 () +{ + for(int i=0; i<3; i++) { + redled.off(); + yellowled.boom(); + greenled.off(); + wait(0.25); + redled.boom(); + yellowled.off(); + greenled.boom(); + wait(0.25); + redled.off(); + yellowled.boom(); + greenled.off(); + wait(0.25); + } + turn_me_on2.detach(); +} +void led3 () +{ + knightrider(); +} +void led4 () +{ + for(int i=0; i<3; i++) { + svegori(); + wait(0.25); + led(); + wait(0.25); + svegori(); + wait(0.25); + led(); + wait(0.25); + } +} +void led () +{ + redled.off(); + yellowled.off(); + greenled.off(); +} +void svegori () +{ + redled.boom(); + yellowled.boom(); + greenled.boom(); + turn_me_on3.detach(); +} +void knightrider () +{ + while (1) { + redled.boom(); + yellowled.off(); + greenled.off(); + wait(0.25); + redled.off(); + yellowled.boom(); + greenled.off(); + wait(0.25); + redled.off(); + yellowled.off(); + greenled.boom(); + wait(0.25); + redled.off(); + yellowled.boom(); + greenled.off(); + wait(0.25); + redled.boom(); + yellowled.off(); + greenled.off(); + wait(0.25); + } +} \ No newline at end of file