Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.96 KB | None | 0 0
  1. #include <Keypad.h>
  2. #include <SoftwareSerial.h>
  3. #include <DFRobotDFPlayerMini.h>
  4. #include <LiquidCrystal_I2C.h>
  5.  
  6. // NUMERY KWESTII MP3
  7. #define unsuccess 10 // zla odpowiedz na zagadke
  8. #define badNumber 11 // zly numer telefonu
  9. #define firstQuestP 1 // co mowi sluchawka na pierwszej zagadce
  10. #define secondQuestP 2 // ..
  11. #define thirdQuestP 3 // ..
  12. #define fourthQuestP 4 // ..
  13. #define fithQuestP 5 // ..
  14. #define beep 6 // pikniecie na wcisniecie przycisku
  15. #define firstCall 7 // pierwszy wybor dobrego numeru telefonu, kwestia fabularna
  16. #define secondCall 8// kazdy kolejny wybor telefonu
  17. #define win 9
  18.  
  19. #define inLang A0
  20.  
  21.  
  22. const byte ROWS = 4; // Four rows
  23. const byte COLS = 3; // Three columns
  24. // Define the Keymap
  25. char keys[ROWS][COLS] = {
  26. {'1', '2', '3'},
  27. {'4', '5', '6'},
  28. {'7', '8', '9'},
  29. {'*', '0', '#'}
  30. };
  31. byte rowPins[ROWS] = { 9, 10, 11, 12 };
  32. byte colPins[COLS] = { 5, 6, 7};
  33. Keypad klaw1 = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
  34. LiquidCrystal_I2C lcd(0x27, 20, 4); //Ustaw adres wyświetlacza na 0x27
  35.  
  36.  
  37.  
  38.  
  39. void playSound(int which);
  40.  
  41. void(* resetFunc) (void) = 0;
  42. SoftwareSerial mySoftwareSerial(3, 2); // RX, TX
  43. DFRobotDFPlayerMini myDFPlayer;
  44.  
  45. #define numLen 12
  46. char number1 [numLen] = {'8', '0', '0', '3', '7', '3', '3', '7', '4', '9', '9', '2'};
  47. int ii = 0;
  48. char actual [numLen];
  49.  
  50. int wasThereAnyCall = 0;
  51.  
  52. void setup()
  53. {
  54. mySoftwareSerial.begin(9600);
  55. Serial.begin(115200);
  56. pinMode(inLang, INPUT_PULLUP);
  57. delay(1000);
  58. lcd.init(); // initialize the lcd
  59. lcd.backlight();
  60. //lcd.noBlink();
  61. lcd.setCursor(0, 0);
  62.  
  63. lcd.clear();
  64.  
  65. if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
  66. Serial.println(F("Unable to begin:"));
  67. Serial.println(F("1.Please recheck the connection!"));
  68. Serial.println(F("2.Please insert the SD card!"));
  69. while (true) {
  70. delay(0); // Code to compatible with ESP8266 watch dog.
  71. }
  72. }
  73. Serial.println(F("DFPlayer Mini online."));
  74.  
  75. myDFPlayer.volume(30); //Set volume value. From 0 to 30
  76. myDFPlayer.disableLoop(); //disable loop.
  77. myDFPlayer.disableLoopAll(); //disable loop.
  78.  
  79.  
  80. for (int i = 0; i < numLen; i++)
  81. {
  82. actual[i] = 127;
  83. }
  84. lcd.clear();
  85. lcd.setCursor(2, 0);
  86. int lang = digitalRead(inLang); // 1-polski, 0-angielski
  87. if (lang)
  88. lcd.print("WPISZ NUMER:");
  89. else
  90. lcd.print("ENTER NUMBER:");
  91. wyswietlNumer(actual, numLen);
  92. }
  93.  
  94.  
  95. void wyswietlNumer(char * numer, int ileCyfr)
  96. {
  97. int beggining = 8 - ileCyfr / 2;
  98. for (int i = 0; i < ileCyfr; i++)
  99. {
  100. lcd.setCursor(i + beggining, 1); //przed begining było - 1 żeby ustawić pozycję numeru na wyświetlaczu
  101. if (numer[i] != 127)
  102. lcd.print(numer[i]);
  103. else
  104. lcd.print('_');
  105. }
  106. }
  107.  
  108. void wyswietlNumerZagadki(int numerZagadki)
  109. {
  110. int lang = digitalRead(inLang); // 1-polski, 0-angielski
  111. if (numerZagadki == 1)
  112. {
  113. lcd.clear();
  114. lcd.setCursor(0, 0);
  115. if (lang)
  116. lcd.print(" ZAGADKA NR 1 ");
  117. else
  118. lcd.print(" FIRST PUZZLE ");
  119. }
  120. if (numerZagadki == 2)
  121. {
  122. lcd.clear();
  123. lcd.setCursor(0, 0);
  124. if (lang)
  125. lcd.print(" ZAGADKA NR 2 ");
  126. else
  127. lcd.print(" SECOND PUZZLE ");
  128. }
  129. if (numerZagadki == 3)
  130. {
  131. lcd.clear();
  132. lcd.setCursor(0, 0);
  133. if (lang)
  134. lcd.print(" ZAGADKA NR 3 ");
  135. else
  136. lcd.print(" THIRD PUZZLE ");
  137. }
  138. }
  139.  
  140. void loop()
  141. {
  142.  
  143. char przycisk = klaw1.getKey();
  144.  
  145. if (!(przycisk >= '0' && przycisk <= '9'))
  146. {
  147. if (przycisk == '#')
  148. {
  149. ii = 0;
  150. for (int i = 0; i < numLen; i++)
  151. actual[i] = 127;
  152. lcd.clear();
  153. lcd.setCursor(2, 0);
  154. int lang = digitalRead(inLang); // 1-polski, 0-angielski
  155. if (lang)
  156. lcd.print("WPISZ NUMER:");
  157. else
  158. lcd.print("ENTER NUMBER:");
  159. wyswietlNumer(actual, numLen);
  160. }
  161. return;
  162. }
  163.  
  164.  
  165. Serial.println(przycisk);
  166. playSound(beep);
  167.  
  168. actual[ii] = przycisk;
  169. ii++;
  170.  
  171. wyswietlNumer(actual, numLen);
  172.  
  173. if (ii == numLen)
  174. {
  175. ii = 0;
  176. int allCorrect = 1;
  177. for (int i = 0; i < numLen; i++)
  178. {
  179. if (actual[i] != number1[i])
  180. {
  181. delay(1000);
  182. allCorrect = 0;
  183. for (int i = 0; i < numLen; i++)
  184. actual[i] = 127;
  185. lcd.clear();
  186. lcd.setCursor(2, 0);
  187. int lang = digitalRead(inLang); // 1-polski, 0-angielski
  188. if (lang)
  189. lcd.print("WPISZ NUMER:");
  190. else
  191. lcd.print("ENTER NUMBER:");
  192. wyswietlNumer(actual, numLen);
  193. break;
  194. }
  195. }
  196.  
  197. if (allCorrect)
  198. {
  199. //wpisano numer telefonu !!!!!!!!!! przejsc do procedury odtwarzania zagadek
  200. if (!wasThereAnyCall)
  201. {
  202. wasThereAnyCall = 1;
  203. playSound(firstCall);
  204.  
  205. }
  206. else
  207. {
  208. playSound(secondCall);
  209.  
  210. }
  211.  
  212. Serial.println("dobry numer -> zagadki");
  213. if (quests())
  214. {
  215. Serial.println("dobrze wszystkie :)");
  216.  
  217. //jesli zwora albo costam -> TUTAJ
  218. myDFPlayer.play(win);
  219. lcd.clear();
  220. lcd.setCursor(2, 0);
  221. int lang = digitalRead(inLang); // 1-polski, 0-angielski
  222. if (lang)
  223. lcd.print("R A D I O");
  224. else
  225. lcd.print("R A D I O");
  226.  
  227.  
  228. char przycisk = klaw1.getKey();
  229.  
  230. while (1)
  231. {
  232. przycisk = klaw1.getKey();
  233. if (przycisk != '0')
  234. {
  235. delay(5000);
  236. przycisk = klaw1.getKey();
  237. if (przycisk != '0')
  238. {
  239. resetFunc();
  240. }
  241. }
  242. }
  243.  
  244.  
  245.  
  246. }
  247. else
  248. {
  249. Serial.println("zle zagadka");
  250. lcd.clear();
  251. delay(2000);
  252. for (int i = 0; i < numLen; i++)
  253. actual[i] = 127;
  254.  
  255. lcd.setCursor(2, 0);
  256. int lang = digitalRead(inLang); // 1-polski, 0-angielski
  257. if (lang)
  258. lcd.print("WPISZ NUMER:");
  259. else
  260. lcd.print("ENTER NUMBER:");
  261. wyswietlNumer(actual, numLen);
  262. }
  263. }
  264. else
  265. {
  266. Serial.println("zly numer -> sound");
  267. playSound(badNumber);
  268. }
  269. }
  270. }
  271.  
  272.  
  273.  
  274. int ver = 0;
  275. int quests()
  276. {
  277. Serial.println("zagadki -> " + String(ver));
  278. if (ver == 0)
  279. {
  280. 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
  281. wyswietlNumerZagadki(1);
  282. int res = firstQuest();
  283. if (!res)
  284. {
  285. playSound(unsuccess);
  286. return 0;
  287. }
  288. wyswietlNumerZagadki(2);
  289. res = secondQuest();
  290. if (!res)
  291. {
  292. playSound(unsuccess);
  293. return 0;
  294. }
  295. wyswietlNumerZagadki(3);
  296. res = thirdQuest();
  297. if (!res)
  298. {
  299. playSound(unsuccess);
  300. return 0;
  301. }
  302. //udalo sie przejsc 3 zagadki bez bledu - sukces
  303. return 1;
  304. }
  305.  
  306. if (ver == 1)
  307. {
  308. ver++; //tak samo jak wyzej
  309. wyswietlNumerZagadki(1);
  310. int res = secondQuest();
  311. if (!res)
  312. {
  313. playSound(unsuccess);
  314. return 0;
  315. }
  316. wyswietlNumerZagadki(2);
  317. res = fourthQuest();
  318. if (!res)
  319. {
  320. playSound(unsuccess);
  321. return 0;
  322. }
  323. wyswietlNumerZagadki(3);
  324. res = fithQuest();
  325. if (!res)
  326. {
  327. playSound(unsuccess);
  328. return 0;
  329. }
  330. //udalo sie przejsc 3 zagadki bez bledu - sukces
  331. return 1;
  332. }
  333.  
  334. if (ver == 2)
  335. {
  336. //-tutaj chcemy zostawic ostatnia wersje zeby juz sie nie meczyli tyle - niech zostanie na ver=2 to ostatnia kombinacja zagadek bedzie sie powtarzac
  337. //-wcale nie, jednak np chcemy zrobic ze bedzie z powrotem 1 wersja
  338.  
  339. ver = 0;
  340. wyswietlNumerZagadki(1);
  341. int res = firstQuest();
  342. if (!res)
  343. {
  344. playSound(unsuccess);
  345. return 0;
  346. }
  347. wyswietlNumerZagadki(2);
  348. res = thirdQuest();
  349. if (!res)
  350. {
  351. playSound(unsuccess);
  352. return 0;
  353. }
  354. wyswietlNumerZagadki(3);
  355. res = secondQuest();
  356. if (!res)
  357. {
  358. playSound(unsuccess);
  359. return 0;
  360. }
  361. //udalo sie przejsc 3 zagadki bez bledu - sukces
  362. return 1;
  363. }
  364. }
  365.  
  366.  
  367.  
  368. int firstQuest() //procedura obslugujaca pierwsza z zagadek, wynikiem 1 gdy ok, 0 gdy zle
  369. {
  370. Serial.println("pierwsza zagadka");
  371. playSound(firstQuestP);
  372. const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
  373. char good[dlug] = {'4'}; //to jest prawidlowa odpowiedz na zagadke pierwsza
  374. int allCorrect = 1;
  375. int32_t st = millis();
  376. int32_t ileCzasuNaOdpowiedz = 31 * 1000;
  377. char act [dlug] = {127};
  378. wyswietlNumer(act, dlug);
  379. for (int i = 0; i < dlug; i++)
  380. {
  381. char przycisk = klaw1.getKey();
  382.  
  383. if (millis() - st > ileCzasuNaOdpowiedz)
  384. {
  385. allCorrect = 0;
  386. Serial.println("timeout");
  387. break;
  388. }
  389.  
  390.  
  391. if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
  392. {
  393. i--;
  394. int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
  395. if (nowSec >= 10)
  396. {
  397. lcd.setCursor(13, 1);
  398. lcd.print(nowSec);
  399. lcd.print('s');
  400. }
  401. else
  402. {
  403. lcd.setCursor(13, 1);
  404. lcd.print(' ');
  405. lcd.setCursor(14, 1);
  406. lcd.print(nowSec);
  407. lcd.print('s');
  408. }
  409. continue;
  410. }
  411. act[i] = przycisk;
  412.  
  413. wyswietlNumer(act, dlug);
  414.  
  415. if (przycisk != good[i])
  416. allCorrect = 0;
  417. }
  418.  
  419. if (allCorrect)
  420. {
  421. //ok, kolejna zagadka?
  422. return 1;
  423. }
  424. else
  425. {
  426. //zle, powrot do poczatku
  427. return 0;
  428. }
  429. }
  430.  
  431. int secondQuest() //procedura obslugujaca druga z zagadek, wynikiem 1 gdy ok, 0 gdy zle
  432. {
  433. Serial.println("druga zagadka");
  434. playSound(secondQuestP);
  435. const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
  436. char good[dlug] = {'2'}; //to jest prawidlowa odpowiedz na zagadke 2
  437. int allCorrect = 1;
  438. int32_t ileCzasuNaOdpowiedz = 41 * 1000;
  439. int32_t st = millis();
  440. char act [dlug] = {127};
  441. wyswietlNumer(act, dlug);
  442. for (int i = 0; i < dlug; i++)
  443. {
  444. char przycisk = klaw1.getKey();
  445.  
  446. if (millis() - st > ileCzasuNaOdpowiedz)
  447. {
  448. allCorrect = 0;
  449. Serial.println("timeout");
  450. break;
  451. }
  452. if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
  453. {
  454. i--;
  455. int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
  456. if (nowSec >= 10)
  457. {
  458. lcd.setCursor(13, 1);
  459. lcd.print(nowSec);
  460. lcd.print('s');
  461. }
  462. else
  463. {
  464. lcd.setCursor(13, 1);
  465. lcd.print(' ');
  466. lcd.setCursor(14, 1);
  467. lcd.print(nowSec);
  468. lcd.print('s');
  469. }
  470. continue;
  471. }
  472. act[i] = przycisk;
  473.  
  474. wyswietlNumer(act, dlug);
  475.  
  476. if (przycisk != good[i])
  477. allCorrect = 0;
  478. }
  479.  
  480. if (allCorrect)
  481. {
  482. //ok, kolejna zagadka?
  483. return 1;
  484. }
  485. else
  486. {
  487. //zle, powrot do poczatku
  488. return 0;
  489. }
  490. }
  491.  
  492.  
  493. int thirdQuest() //procedura obslugujaca trzecia z zagadek, wynikiem 1 gdy ok, 0 gdy zle
  494. {
  495. Serial.println("trzecia zagadka");
  496. playSound(thirdQuestP);
  497. const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
  498. char good[dlug] = {'4'}; //to jest prawidlowa odpowiedz na zagadke 3
  499. int allCorrect = 1;
  500. int32_t ileCzasuNaOdpowiedz = 37 * 1000;
  501. int32_t st = millis();
  502. char act [dlug] = {127};
  503. wyswietlNumer(act, dlug);
  504. for (int i = 0; i < dlug; i++)
  505. {
  506. char przycisk = klaw1.getKey();
  507.  
  508. if (millis() - st > ileCzasuNaOdpowiedz)
  509. {
  510. allCorrect = 0;
  511. Serial.println("timeout");
  512. break;
  513. }
  514. if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
  515. {
  516. i--;
  517. int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
  518. if (nowSec >= 10)
  519. {
  520. lcd.setCursor(13, 1);
  521. lcd.print(nowSec);
  522. lcd.print('s');
  523. }
  524. else
  525. {
  526. lcd.setCursor(13, 1);
  527. lcd.print(' ');
  528. lcd.setCursor(14, 1);
  529. lcd.print(nowSec);
  530. lcd.print('s');
  531. }
  532. continue;
  533. }
  534. act[i] = przycisk;
  535.  
  536. wyswietlNumer(act, dlug);
  537.  
  538. if (przycisk != good[i])
  539. allCorrect = 0;
  540. }
  541.  
  542. if (allCorrect)
  543. {
  544. //ok, kolejna zagadka?
  545. return 1;
  546. }
  547. else
  548. {
  549. //zle, powrot do poczatku
  550. return 0;
  551. }
  552. }
  553.  
  554.  
  555. int fourthQuest() //procedura obslugujaca czwarta z zagadek, wynikiem 1 gdy ok, 0 gdy zle
  556. {
  557. Serial.println("czwarta zagadka");
  558. playSound(fourthQuestP);
  559. const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
  560. char good[dlug] = {'2'}; //to jest prawidlowa odpowiedz na zagadke 4
  561. int allCorrect = 1;
  562. int32_t ileCzasuNaOdpowiedz = 36 * 1000;
  563. int32_t st = millis();
  564. char act [dlug] = {127};
  565. wyswietlNumer(act, dlug);
  566. for (int i = 0; i < dlug; i++)
  567. {
  568. char przycisk = klaw1.getKey();
  569.  
  570. if (millis() - st > ileCzasuNaOdpowiedz)
  571. {
  572. allCorrect = 0;
  573. Serial.println("timeout");
  574. break;
  575. }
  576. if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
  577. {
  578. i--;
  579. int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
  580. if (nowSec >= 10)
  581. {
  582. lcd.setCursor(13, 1);
  583. lcd.print(nowSec);
  584. lcd.print('s');
  585. }
  586. else
  587. {
  588. lcd.setCursor(13, 1);
  589. lcd.print(' ');
  590. lcd.setCursor(14, 1);
  591. lcd.print(nowSec);
  592. lcd.print('s');
  593. }
  594. continue;
  595. }
  596.  
  597. act[i] = przycisk;
  598.  
  599. wyswietlNumer(act, dlug);
  600.  
  601. if (przycisk != good[i])
  602. allCorrect = 0;
  603. }
  604.  
  605. if (allCorrect)
  606. {
  607. //ok, kolejna zagadka?
  608. return 1;
  609. }
  610. else
  611. {
  612. //zle, powrot do poczatku
  613. return 0;
  614. }
  615. }
  616.  
  617. int fithQuest() //procedura obslugujaca piata z zagadek, wynikiem 1 gdy ok, 0 gdy zle
  618. {
  619. playSound(fithQuestP);
  620. const int dlug = 1; // tutaj zmieniasz ilosc wciskanych przyciskow po uslyszeniu zagadki
  621. char good[dlug] = {'3'}; //to jest prawidlowa odpowiedz na zagadke 4
  622. int allCorrect = 1;
  623. int32_t ileCzasuNaOdpowiedz = 44 * 1000;
  624. int32_t st = millis();
  625. char act [dlug] = { 127 };
  626. wyswietlNumer(act, dlug);
  627. for (int i = 0; i < dlug; i++)
  628. {
  629. char przycisk = klaw1.getKey();
  630.  
  631. if (millis() - st > ileCzasuNaOdpowiedz)
  632. {
  633. allCorrect = 0;
  634. break;
  635. }
  636. if (!(przycisk >= '0' && przycisk <= '9' && przycisk != NO_KEY))
  637. {
  638. i--;
  639. int nowSec = (ileCzasuNaOdpowiedz - (millis() - st)) / 1000 + 1;
  640. if (nowSec >= 10)
  641. {
  642. lcd.setCursor(13, 1);
  643. lcd.print(nowSec);
  644. lcd.print('s');
  645. }
  646. else
  647. {
  648. lcd.setCursor(13, 1);
  649. lcd.print(' ');
  650. lcd.setCursor(14, 1);
  651. lcd.print(nowSec);
  652. lcd.print('s');
  653. }
  654. continue;
  655. }
  656. act[i] = przycisk;
  657.  
  658. wyswietlNumer(act, dlug);
  659.  
  660. if (przycisk != good[i])
  661. allCorrect = 0;
  662. }
  663.  
  664. if (allCorrect)
  665. {
  666. //ok, kolejna zagadka?
  667. return 1;
  668. }
  669. else
  670. {
  671. //zle, powrot do poczatku
  672. return 0;
  673. }
  674. }
  675.  
  676. void playSound(int which) // should be blocking - add delay long enough to finish sound
  677. {
  678. int lang = !digitalRead(inLang); // 0-polski, 1-angielski
  679. which += lang * 11;
  680.  
  681. //which od 1 do 11 -> dzwieki po polsku zgodnie z define'ami na gorze
  682. //which od 12 do 22-> dzwieki po angielsku
  683.  
  684.  
  685. myDFPlayer.play(which);
  686.  
  687. if (which == firstCall) // odczekiwanie podczas odtwarzania dźwięku
  688. {
  689. if (lang == 0)
  690. delay(66000); //jeśli polski
  691. else
  692. delay(64000); //jeśli angielski
  693. }
  694.  
  695. if (which == secondCall) // odczekiwanie podczas odtwarzania dźwięku
  696. {
  697. if (lang == 0)
  698. delay(22000); //jeśli polski
  699. else
  700. delay(23000); //jeśli angielski
  701. }
  702. if (which == firstQuestP) // odczekiwanie podczas odtwarzania dźwięku
  703. {
  704. if (lang == 0)
  705. delay(5000); //jeśli polski - 15 sekund mniej niż ma nagranie bo udzielić odpowiedz można dopiero jak odlicza czas
  706. else
  707. delay(21000); //jeśli angielski
  708. }
  709.  
  710. if (which == secondQuestP) // odczekiwanie podczas odtwarzania dźwięku
  711. {
  712. if (lang == 0)
  713. delay(5000); //jeśli polski
  714. else
  715. delay(23000); //jeśli angielski
  716. }
  717.  
  718.  
  719. if (which == thirdQuestP) // odczekiwanie podczas odtwarzania dźwięku
  720. {
  721. if (lang == 0)
  722. delay(5000); //jeśli polski
  723. else
  724. delay(23000); //jeśli angielski
  725. }
  726.  
  727. if (which == fourthQuestP) // odczekiwanie podczas odtwarzania dźwięku
  728. {
  729. if (lang == 0)
  730. delay(5000); //jeśli polski
  731. else
  732. delay(23000); //jeśli angielski
  733. }
  734. if (which == fithQuestP) // odczekiwanie podczas odtwarzania dźwięku
  735. {
  736. if (lang == 0)
  737. delay(5000); //jeśli polski
  738. else
  739. delay(23000); //jeśli angielski
  740. }
  741. if (which == win) // odczekiwanie podczas odtwarzania dźwięku
  742. {
  743. if (lang == 0)
  744. delay(22000); //jeśli polski
  745. else
  746. delay(23000); //jeśli angielski
  747. }
  748. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement