/*
Marvel quiz N.04 documentation
******************************
Pins layout:
Pin
green LED...........25
red LED.............24
buzzer..............22
button A............19
button B............18
button C............2
reset button........3
lcd display - SDA...20
lcd display - DCL...21
******************************
Resistors:
ohm
LEDs................220
buttons.............10k
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int greenLED = 25;
const int redLED = 24;
const int button_a = 19;
const int button_b = 18;
const int button_c = 2;
const int button_reset = 3;
const int buzzer = 22;
LiquidCrystal_I2C lcd(0x27, 16, 2);
//pocitadla tlacitek a, b, c a reset
bool answer_a = false;
bool answer_b = false;
bool answer_c = false;
bool reset = false;
int reset_count = 0;
int question_count = 1;
int right_answers_count = 0;
int wrong_answers_count = 0;
//frekvence not a delka pro buzzer
int qNote = 300;
#define G1 390
#define A1 440
#define H1 470
#define C2 520
#define G2 780
void musicPlay(int frequency, int duration) {
tone(buzzer, frequency);
delay(duration+10);
}
void setup() {
//inicializace LED
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
//inicializace tlacitek
attachInterrupt(digitalPinToInterrupt(button_a), buttonAPressed, RISING);
attachInterrupt(digitalPinToInterrupt(button_b), buttonBPressed, RISING);
attachInterrupt(digitalPinToInterrupt(button_c), buttonCPressed, RISING);
attachInterrupt(digitalPinToInterrupt(button_reset), resetButtonPressed, RISING);
//inicializace displeje
lcd.init();
lcd.backlight();
lcd.clear();
Serial.begin(9600);
//co se odehraje na zacatek
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
lcd.setCursor(0,0);
lcd.print("Marvel quiz N.04");
lcd.setCursor(0,1);
lcd.print("Kata <3");
delay(100);
musicPlay(G1, qNote);
musicPlay(A1, qNote/2*3);
musicPlay(H1, qNote*2);
noTone(buzzer);
delay(100);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
}
void questionWrite(int lettersNumberQuestion, char question[]) {
Serial.println("Question");
//kdyby se tlacitka zmackla dvakrat omylem
answer_a = false;
answer_b = false;
answer_c = false;
reset = false;
if (lettersNumberQuestion <= 15) {
lcd.setCursor(0, 0);
lcd.print(question);
delay(2000);
}
else {
lcd.setCursor(0, 0);
lcd.print(question);
delay(1000);
for (int i = 0; i < lettersNumberQuestion - 16; i++) {
lcd.scrollDisplayLeft();
delay(500);
}
delay(500);
}
lcd.clear();
}
void answerWrite(int lettersNumberAnswer, char answer[]) {
Serial.println("Answer");
//kdyby se tlacitka zmackla dvakrat omylem
answer_a = false;
answer_b = false;
answer_c = false;
reset = false;
if (lettersNumberAnswer+3 <= 15) {
lcd.setCursor(0, 0);
lcd.print(answer);
delay(2000);
}
else {
lcd.setCursor(0, 0);
lcd.print(answer);
delay(1000);
for (int i = 0; i < lettersNumberAnswer + 3 - 16; i++) {
lcd.scrollDisplayLeft();
delay(500);
}
delay(500);
}
lcd.clear();
}
void rightAnswer() {
Serial.println("Right answer");
Serial.print("question_count: ");
Serial.println(question_count);
right_answers_count++;
question_count++;
answer_a = false;
answer_b = false;
answer_c = false;
reset = true;
Serial.print("question_count++: ");
Serial.println(question_count);
digitalWrite(greenLED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SPRAVNE!");
delay(100);
musicPlay(G1, qNote/4);
musicPlay(C2, qNote/4);
musicPlay(G2, qNote*3);
noTone(buzzer);
delay(1000);
digitalWrite(greenLED, LOW);
}
void wrongAnswer() {
Serial.println("Wrong answer");
Serial.print("question_count: ");
Serial.println(question_count);
wrong_answers_count++;
question_count++;
answer_a = false;
answer_b = false;
answer_c = false;
reset = true;
digitalWrite(redLED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Spatne");
lcd.setCursor(0, 1);
lcd.print(":-(");
delay(100);
musicPlay(G2, qNote/4);
musicPlay(C2, qNote/4);
musicPlay(G1, qNote*3);
noTone(buzzer);
delay(1000);
digitalWrite(redLED, LOW);
}
void choices() {
Serial.println("Choices");
while (!answer_a && !answer_b && !answer_c && !reset) {
lcd.setCursor(0, 0);
lcd.print("Zmackni tlacitko");
lcd.setCursor(0, 1);
lcd.print("A, B, nebo C");
//pokud se zmackne tlacitko A
if (answer_a) {
//pokud je A spravna odpoved k dane otazce
if (question_count == 1 || question_count == 5 || question_count == 8 || question_count == 9 || question_count == 12 || question_count == 16 || question_count == 20) {
rightAnswer();
} else {
wrongAnswer();
}
}
//pokud se zmackne tlacitko B
else if (answer_b) {
//pokud je B spravna odpoved k dane otazce
if (question_count == 3 || question_count == 4 || question_count == 7 || question_count == 11 || question_count == 14 || question_count == 15 || question_count == 17) {
rightAnswer();
} else {
wrongAnswer();
}
}
//pokud se zmackne tlacitko C
else if (answer_c) {
//pokuj je C spravna odpoved k dane otazce
if (question_count == 2 || question_count == 6 || question_count == 10 || question_count == 13 || question_count == 18 || question_count == 19) {
rightAnswer();
} else {
wrongAnswer();
}
}
}
}
void loop() {
while (reset_count == 0) {
Serial.println("Start");
lcd.setCursor(0, 0);
lcd.print("Zmackni tlacitko");
lcd.setCursor(0, 1);
lcd.print("a zacni hrat!");
}
lcd.clear();
//1. otazka
if (question_count == 1) {
Serial.println("1. question");
questionWrite(23, "Valkyry jsou Asgardske:");
answerWrite(9, "a) Bojovnice");
answerWrite(8, "b) Kucharky");
answerWrite(20, "c) Osetrovatelky pegasu");
choices();
reset = false;
}
//2. otazka
else if (question_count == 2) {
Serial.println("2. question");
questionWrite(29, "Mezi strazce galaxie nepatri:");
answerWrite(11, "a) Peter Quill");
answerWrite(5, "b) Groot");
answerWrite(4, "c) Thor");
choices();
reset = false;
}
//3. otazka
else if (question_count == 3) {
Serial.println("3. question");
questionWrite(21, "Prvnim MCU filmem je:");
answerWrite(15, "a) Kapitan Amerika");
answerWrite(8, "b) Iron man");
answerWrite(4, "c) Hulk");
choices();
reset = false;
}
//4. otazka
else if (question_count == 4) {
Serial.println("4. question");
questionWrite(31, "Historicky prvnim avengerem je:");
answerWrite(8, "a) Iron man");
answerWrite(15, "b) Kapitan Amerika");
answerWrite(4, "c) Thor");
choices();
reset = false;
}
//5. otazka
else if (question_count == 5) {
Serial.println("5. question");
questionWrite(36, "Ktery kamen nekonecna ma Dr Strange?");
answerWrite(4, "a) Casu");
answerWrite(4, "b) Moci");
answerWrite(7, "c) Reality");
choices();
reset = false;
}
//6. otazka
else if (question_count == 6) {
Serial.println("6. question");
questionWrite(36, "Ktery kamen nekonecna je kamen moci?");
answerWrite(7, "a) Cerveny");
answerWrite(6, "b) Zluty");
answerWrite(7, "c) Fialovy");
choices();
reset = false;
}
//7. otazka
else if (question_count == 7) {
Serial.println("7. question");
questionWrite(39, "Jak ziskali Clint a Natasha kamen duse?");
answerWrite(17, "a) Clint se obetoval");
answerWrite(20, "b) Natasha se obetovala");
answerWrite(32, "c) Spolecne porazili strazce kamene");
choices();
reset = false;
}
//8. otazka
else if (question_count == 8) {
Serial.println("8. question");
questionWrite(12, "Thor je buh:");
answerWrite(5, "a) Hromu");
answerWrite(6, "b) Blesku");
answerWrite(6, "c) Bourky");
choices();
reset = false;
}
//9. otazka
else if (question_count == 9) {
Serial.println("9. question");
questionWrite(12, "Loki je buh:");
answerWrite(12, "a) Lsti a false");
answerWrite(4, "b) Casu");
answerWrite(5, "c) Hromu");
choices();
reset = false;
}
//10. otazka
else if (question_count == 10) {
Serial.println("10. question");
questionWrite(10, "Rocket je:");
answerWrite(17, "a) Vermirnej chlapik");
answerWrite(15, "b) Strazce Wakandy");
answerWrite(5, "c) Myval");
choices();
reset = false;
}
else if (question_count == 11) {
lcd.setCursor(0,0);
lcd.print("Spravne:");
lcd.setCursor(9,0);
lcd.print(right_answers_count);
lcd.setCursor(0,1);
lcd.print("Spatne:");
lcd.setCursor(8,1);
lcd.print(wrong_answers_count);
delay(10000);
lcd.clear();
right_answers_count = 0;
right_answers_count = 0;
question_count = 1;
answer_a = false;
answer_b = false;
answer_c = false;
reset = false;
reset_count = 0;
}
}
void buttonAPressed() {
answer_a = true;
Serial.println("A");
}
void buttonBPressed() {
answer_b = true;
Serial.println("B");
}
void buttonCPressed() {
answer_c = true;
Serial.println("C");
}
void resetButtonPressed() {
reset_count++;
}