Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Keypad.h>
- #include <SoftwareSerial.h>
- #include <DFRobotDFPlayerMini.h>
- #include <LiquidCrystal_I2C.h>
- // NUMERY KWESTII MP3
- #define unsuccess 10 // zla odpowiedz na zagadke
- #define badNumber 11 // zly numer telefonu
- #define firstQuestP 1 // co mowi sluchawka na pierwszej zagadce
- #define secondQuestP 2 // ..
- #define thirdQuestP 3 // ..
- #define fourthQuestP 4 // ..
- #define fithQuestP 5 // ..
- #define beep 6 // pikniecie na wcisniecie przycisku
- #define firstCall 7 // pierwszy wybor dobrego numeru telefonu, kwestia fabularna
- #define secondCall 8// kazdy kolejny wybor telefonu
- #define win 9
- #define inLang A0
- const byte ROWS = 4; // Four rows
- const byte COLS = 3; // Three columns
- // Define the Keymap
- char keys[ROWS][COLS] = {
- {'1', '2', '3'},
- {'4', '5', '6'},
- {'7', '8', '9'},
- {'*', '0', '#'}
- };
- byte rowPins[ROWS] = { 9, 10, 11, 12 };
- byte colPins[COLS] = { 5, 6, 7};
- Keypad klaw1 = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
- LiquidCrystal_I2C lcd(0x27, 20, 4); //Ustaw adres wyświetlacza na 0x27
- void playSound(int which);
- void(* resetFunc) (void) = 0;
- SoftwareSerial mySoftwareSerial(3, 2); // RX, TX
- DFRobotDFPlayerMini myDFPlayer;
- #define numLen 12
- char number1 [numLen] = {'8', '0', '0', '3', '7', '3', '3', '7', '4', '9', '9', '2'};
- int ii = 0;
- char actual [numLen];
- int wasThereAnyCall = 0;
- void setup()
- {
- mySoftwareSerial.begin(9600);
- Serial.begin(115200);
- pinMode(inLang, INPUT_PULLUP);
- delay(1000);
- lcd.init(); // initialize the lcd
- lcd.backlight();
- //lcd.noBlink();
- lcd.setCursor(0, 0);
- lcd.clear();
- if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
- Serial.println(F("Unable to begin:"));
- Serial.println(F("1.Please recheck the connection!"));
- Serial.println(F("2.Please insert the SD card!"));
- while (true) {
- delay(0); // Code to compatible with ESP8266 watch dog.
- }
- }
- Serial.println(F("DFPlayer Mini online."));
- myDFPlayer.volume(30); //Set volume value. From 0 to 30
- myDFPlayer.disableLoop(); //disable loop.
- myDFPlayer.disableLoopAll(); //disable loop.
- for (int i = 0; i < numLen; i++)
- {
- actual[i] = 127;
- }
- lcd.clear();
- lcd.setCursor(2, 0);
- int lang = digitalRead(inLang); // 1-polski, 0-angielski
- if (lang)
- lcd.print("WPISZ NUMER:");
- else
- lcd.print("ENTER NUMBER:");
- wyswietlNumer(actual, numLen);
- }
- void wyswietlNumer(char * numer, int ileCyfr)
- {
- int beggining = 8 - ileCyfr / 2;
- for (int i = 0; i < ileCyfr; i++)
- {
- lcd.setCursor(i + beggining, 1); //przed begining było - 1 żeby ustawić pozycję numeru na wyświetlaczu
- if (numer[i] != 127)
- lcd.print(numer[i]);
- else
- lcd.print('_');
- }
- }
- void wyswietlNumerZagadki(int numerZagadki)
- {
- int lang = digitalRead(inLang); // 1-polski, 0-angielski
- if (numerZagadki == 1)
- {
- lcd.clear();
- lcd.setCursor(0, 0);
- if (lang)
- lcd.print(" ZAGADKA NR 1 ");
- else
- lcd.print(" FIRST PUZZLE ");
- }
- if (numerZagadki == 2)
- {
- lcd.clear();
- lcd.setCursor(0, 0);
- if (lang)
- lcd.print(" ZAGADKA NR 2 ");
- else
- lcd.print(" SECOND PUZZLE ");
- }
- if (numerZagadki == 3)
- {
- lcd.clear();
- lcd.setCursor(0, 0);
- if (lang)
- lcd.print(" ZAGADKA NR 3 ");
- else
- lcd.print(" THIRD PUZZLE ");
- }
- }
- void loop()
- {
- char przycisk = klaw1.getKey();
- if (!(przycisk >= '0' && przycisk <= '9'))
- {
- if (przycisk == '#')
- {
- ii = 0;
- for (int i = 0; i < numLen; i++)
- actual[i] = 127;
- lcd.clear();
- lcd.setCursor(2, 0);
- int lang = digitalRead(inLang); // 1-polski, 0-angielski
- if (lang)
- lcd.print("WPISZ NUMER:");
- else
- lcd.print("ENTER NUMBER:");
- wyswietlNumer(actual, numLen);
- }
- return;
- }
- Serial.println(przycisk);
- playSound(beep);
- actual[ii] = przycisk;
- ii++;
- wyswietlNumer(actual, numLen);
- if (ii == numLen)
- {
- ii = 0;
- int allCorrect = 1;
- for (int i = 0; i < numLen; i++)
- {
- if (actual[i] != number1[i])
- {
- delay(1000);
- allCorrect = 0;
- for (int i = 0; i < numLen; i++)
- actual[i] = 127;
- lcd.clear();
- lcd.setCursor(2, 0);
- int lang = digitalRead(inLang); // 1-polski, 0-angielski
- if (lang)
- lcd.print("WPISZ NUMER:");
- else
- lcd.print("ENTER NUMBER:");
- wyswietlNumer(actual, numLen);
- break;
- }
- }
- if (allCorrect)
- {
- //wpisano numer telefonu !!!!!!!!!! przejsc do procedury odtwarzania zagadek
- if (!wasThereAnyCall)
- {
- wasThereAnyCall = 1;
- playSound(firstCall);
- }
- else
- {
- playSound(secondCall);
- }
- Serial.println("dobry numer -> zagadki");
- if (quests())
- {
- Serial.println("dobrze wszystkie :)");
- //jesli zwora albo costam -> TUTAJ
- myDFPlayer.play(win);
- lcd.clear();
- lcd.setCursor(2, 0);
- int lang = digitalRead(inLang); // 1-polski, 0-angielski
- if (lang)
- lcd.print("R A D I O");
- else
- lcd.print("R A D I O");
- char przycisk = klaw1.getKey();
- while (1)
- {
- przycisk = klaw1.getKey();
- if (przycisk != '0')
- {
- delay(5000);
- przycisk = klaw1.getKey();
- if (przycisk != '0')
- {
- resetFunc();
- }
- }
- }
- }
- else
- {
- Serial.println("zle zagadka");
- lcd.clear();
- delay(2000);
- for (int i = 0; i < numLen; i++)
- actual[i] = 127;
- lcd.setCursor(2, 0);
- int lang = digitalRead(inLang); // 1-polski, 0-angielski
- if (lang)
- lcd.print("WPISZ NUMER:");
- else
- lcd.print("ENTER NUMBER:");
- wyswietlNumer(actual, numLen);
- }
- }
- else
- {
- Serial.println("zly numer -> sound");
- playSound(badNumber);
- }
- }
- }
- int ver = 0;
- int quests()
- {
- Serial.println("zagadki -> " + String(ver));
- if (ver == 0)
- {
- ver++; // czy mu sie uda czy nie - nie ma znaczenia - jesli sie nie uda numer kombinacji zagadek zwiekszony, jesli sie uda - nie ma to znaczenia
- wyswietlNumerZagadki(1);
- int res = firstQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- wyswietlNumerZagadki(2);
- res = secondQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- wyswietlNumerZagadki(3);
- res = thirdQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- //udalo sie przejsc 3 zagadki bez bledu - sukces
- return 1;
- }
- if (ver == 1)
- {
- ver++; //tak samo jak wyzej
- wyswietlNumerZagadki(1);
- int res = secondQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- wyswietlNumerZagadki(2);
- res = fourthQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- wyswietlNumerZagadki(3);
- res = fithQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- //udalo sie przejsc 3 zagadki bez bledu - sukces
- return 1;
- }
- if (ver == 2)
- {
- //-tutaj chcemy zostawic ostatnia wersje zeby juz sie nie meczyli tyle - niech zostanie na ver=2 to ostatnia kombinacja zagadek bedzie sie powtarzac
- //-wcale nie, jednak np chcemy zrobic ze bedzie z powrotem 1 wersja
- ver = 0;
- wyswietlNumerZagadki(1);
- int res = firstQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- wyswietlNumerZagadki(2);
- res = thirdQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- wyswietlNumerZagadki(3);
- res = secondQuest();
- if (!res)
- {
- playSound(unsuccess);
- return 0;
- }
- //udalo sie przejsc 3 zagadki bez bledu - sukces
- return 1;
- }
- }
- int firstQuest() //procedura obslugujaca pierwsza z zagadek, wynikiem 1 gdy ok, 0 gdy zle
- {
- Serial.println("pierwsza zagadka");
- playSound(firstQuestP);
- const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
- char good[dlug] = {'4'}; //to jest prawidlowa odpowiedz na zagadke pierwsza
- int allCorrect = 1;
- int32_t st = millis();
- int32_t ileCzasuNaOdpowiedz = 31 * 1000;
- char act [dlug] = {127};
- wyswietlNumer(act, dlug);
- for (int i = 0; i < dlug; i++)
- {
- char przycisk = klaw1.getKey();
- if (millis() - st > ileCzasuNaOdpowiedz)
- {
- allCorrect = 0;
- Serial.println("timeout");
- break;
- }
- if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
- {
- i--;
- int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
- if (nowSec >= 10)
- {
- lcd.setCursor(13, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- else
- {
- lcd.setCursor(13, 1);
- lcd.print(' ');
- lcd.setCursor(14, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- continue;
- }
- act[i] = przycisk;
- wyswietlNumer(act, dlug);
- if (przycisk != good[i])
- allCorrect = 0;
- }
- if (allCorrect)
- {
- //ok, kolejna zagadka?
- return 1;
- }
- else
- {
- //zle, powrot do poczatku
- return 0;
- }
- }
- int secondQuest() //procedura obslugujaca druga z zagadek, wynikiem 1 gdy ok, 0 gdy zle
- {
- Serial.println("druga zagadka");
- playSound(secondQuestP);
- const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
- char good[dlug] = {'2'}; //to jest prawidlowa odpowiedz na zagadke 2
- int allCorrect = 1;
- int32_t ileCzasuNaOdpowiedz = 41 * 1000;
- int32_t st = millis();
- char act [dlug] = {127};
- wyswietlNumer(act, dlug);
- for (int i = 0; i < dlug; i++)
- {
- char przycisk = klaw1.getKey();
- if (millis() - st > ileCzasuNaOdpowiedz)
- {
- allCorrect = 0;
- Serial.println("timeout");
- break;
- }
- if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
- {
- i--;
- int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
- if (nowSec >= 10)
- {
- lcd.setCursor(13, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- else
- {
- lcd.setCursor(13, 1);
- lcd.print(' ');
- lcd.setCursor(14, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- continue;
- }
- act[i] = przycisk;
- wyswietlNumer(act, dlug);
- if (przycisk != good[i])
- allCorrect = 0;
- }
- if (allCorrect)
- {
- //ok, kolejna zagadka?
- return 1;
- }
- else
- {
- //zle, powrot do poczatku
- return 0;
- }
- }
- int thirdQuest() //procedura obslugujaca trzecia z zagadek, wynikiem 1 gdy ok, 0 gdy zle
- {
- Serial.println("trzecia zagadka");
- playSound(thirdQuestP);
- const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
- char good[dlug] = {'4'}; //to jest prawidlowa odpowiedz na zagadke 3
- int allCorrect = 1;
- int32_t ileCzasuNaOdpowiedz = 37 * 1000;
- int32_t st = millis();
- char act [dlug] = {127};
- wyswietlNumer(act, dlug);
- for (int i = 0; i < dlug; i++)
- {
- char przycisk = klaw1.getKey();
- if (millis() - st > ileCzasuNaOdpowiedz)
- {
- allCorrect = 0;
- Serial.println("timeout");
- break;
- }
- if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
- {
- i--;
- int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
- if (nowSec >= 10)
- {
- lcd.setCursor(13, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- else
- {
- lcd.setCursor(13, 1);
- lcd.print(' ');
- lcd.setCursor(14, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- continue;
- }
- act[i] = przycisk;
- wyswietlNumer(act, dlug);
- if (przycisk != good[i])
- allCorrect = 0;
- }
- if (allCorrect)
- {
- //ok, kolejna zagadka?
- return 1;
- }
- else
- {
- //zle, powrot do poczatku
- return 0;
- }
- }
- int fourthQuest() //procedura obslugujaca czwarta z zagadek, wynikiem 1 gdy ok, 0 gdy zle
- {
- Serial.println("czwarta zagadka");
- playSound(fourthQuestP);
- const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
- char good[dlug] = {'2'}; //to jest prawidlowa odpowiedz na zagadke 4
- int allCorrect = 1;
- int32_t ileCzasuNaOdpowiedz = 36 * 1000;
- int32_t st = millis();
- char act [dlug] = {127};
- wyswietlNumer(act, dlug);
- for (int i = 0; i < dlug; i++)
- {
- char przycisk = klaw1.getKey();
- if (millis() - st > ileCzasuNaOdpowiedz)
- {
- allCorrect = 0;
- Serial.println("timeout");
- break;
- }
- if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
- {
- i--;
- int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
- if (nowSec >= 10)
- {
- lcd.setCursor(13, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- else
- {
- lcd.setCursor(13, 1);
- lcd.print(' ');
- lcd.setCursor(14, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- continue;
- }
- act[i] = przycisk;
- wyswietlNumer(act, dlug);
- if (przycisk != good[i])
- allCorrect = 0;
- }
- if (allCorrect)
- {
- //ok, kolejna zagadka?
- return 1;
- }
- else
- {
- //zle, powrot do poczatku
- return 0;
- }
- }
- int fithQuest() //procedura obslugujaca piata z zagadek, wynikiem 1 gdy ok, 0 gdy zle
- {
- playSound(fithQuestP);
- const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
- char good[dlug] = {'3'}; //to jest prawidlowa odpowiedz na zagadke 4
- int allCorrect = 1;
- int32_t ileCzasuNaOdpowiedz = 44 * 1000;
- int32_t st = millis();
- char act [dlug] = { 127 };
- wyswietlNumer(act, dlug);
- for (int i = 0; i < dlug; i++)
- {
- char przycisk = klaw1.getKey();
- if (millis() - st > ileCzasuNaOdpowiedz)
- {
- allCorrect = 0;
- break;
- }
- if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
- {
- i--;
- int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
- if (nowSec >= 10)
- {
- lcd.setCursor(13, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- else
- {
- lcd.setCursor(13, 1);
- lcd.print(' ');
- lcd.setCursor(14, 1);
- lcd.print(nowSec);
- lcd.print('s');
- }
- continue;
- }
- act[i] = przycisk;
- wyswietlNumer(act, dlug);
- if (przycisk != good[i])
- allCorrect = 0;
- }
- if (allCorrect)
- {
- //ok, kolejna zagadka?
- return 1;
- }
- else
- {
- //zle, powrot do poczatku
- return 0;
- }
- }
- void playSound(int which) // should be blocking - add delay long enough to finish sound
- {
- int lang = !digitalRead(inLang); // 0-polski, 1-angielski
- which += lang * 11;
- //which od 1 do 11 -> dzwieki po polsku zgodnie z define'ami na gorze
- //which od 12 do 22-> dzwieki po angielsku
- myDFPlayer.play(which);
- if (which == firstCall) // odczekiwanie podczas odtwarzania dźwięku
- {
- if (lang == 0)
- delay(66000); //jeśli polski
- else
- delay(64000); //jeśli angielski
- }
- if (which == secondCall) // odczekiwanie podczas odtwarzania dźwięku
- {
- if (lang == 0)
- delay(22000); //jeśli polski
- else
- delay(23000); //jeśli angielski
- }
- if (which == firstQuestP) // odczekiwanie podczas odtwarzania dźwięku
- {
- if (lang == 0)
- delay(5000); //jeśli polski - 15 sekund mniej niż ma nagranie bo udzielić odpowiedz można dopiero jak odlicza czas
- else
- delay(21000); //jeśli angielski
- }
- if (which == secondQuestP) // odczekiwanie podczas odtwarzania dźwięku
- {
- if (lang == 0)
- delay(5000); //jeśli polski
- else
- delay(23000); //jeśli angielski
- }
- if (which == thirdQuestP) // odczekiwanie podczas odtwarzania dźwięku
- {
- if (lang == 0)
- delay(5000); //jeśli polski
- else
- delay(23000); //jeśli angielski
- }
- if (which == fourthQuestP) // odczekiwanie podczas odtwarzania dźwięku
- {
- if (lang == 0)
- delay(5000); //jeśli polski
- else
- delay(23000); //jeśli angielski
- }
- if (which == fithQuestP) // odczekiwanie podczas odtwarzania dźwięku
- {
- if (lang == 0)
- delay(5000); //jeśli polski
- else
- delay(23000); //jeśli angielski
- }
- if (which == win) // odczekiwanie podczas odtwarzania dźwięku
- {
- if (lang == 0)
- delay(22000); //jeśli polski
- else
- delay(23000); //jeśli angielski
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement