Popularny post int Napisano Styczeń 16, 2022 Popularny post Udostępnij Napisano Styczeń 16, 2022 (edytowany) Cześć! Przedstawiam praktyczną tablicę wyników do gier planszowych na pilota IR. Od dłuższego czasu codziennie grywam w Scrabble, zwykle w składzie dwuosobowym. Spisywanie wyników na papierze i ręczne liczenie było irytujące, a arkusz kalkulacyjny w smartfonie mało praktyczny, dlatego zbudowałem prostą tablicę wyników na ATMega328. Budowa: Z tyłu mamy baterię 9V, która poza zasilaniem pełni funkcję podpórki. 🙃 Od frontu mamy przejrzysty układ składający się z trzech sekcji: Pierwsza sekcja (od lewej) to zasilanie, czyli 7805 "w swoim naturalnym środowisku", z wyłącznikiem suwakowym. Dalej mamy mikrokontroler ATMega328, również "w swoim naturalnym środowisku", z podczepionym odbiornikiem podczerwieni TSOP31236, oraz podłączoną nóżką pod reset, żeby mógł sam się resetować. Na końcu mamy wyświetlacz LCD, także "w swoim naturalnym środowisku", z potencjometrami od kontrastu i podświetlenia. Działanie Urządzenie "buduje" dodatnią lub ujemną liczbę punktów i wywietla ją w drugiej linii na wyświetlaczu. Po zatwierdzeniu przyciskiem "Play" na pilocie naprzemiennie dodaje punkty graczom. Sumy punktów wyświetlane są w pierwszej linii, a strzałki pokazują czyja teraz kolejka. Zbudowałem wersję dla dwóch graczy bo więcej mi nie potrzeba, ale zawsze można rozbudować. Dodatkowo przycisk wyłączania resetuje cały układ. Program Zamieszczam kod, który jest na tyle prosty, że nie bawiłem się w obszerniejsze komentarze. Nazewnictwo zmiennych załatwia sprawę. #include <LiquidCrystal.h> #include <IRremote.h> LiquidCrystal lcd(9, 10, 5, 6, 7, 8); int wynik1=0,wynik2=0,suma=0; byte gracz=0; bool minus=0; String lin1="",lin2=""; void setup () { digitalWrite(17, HIGH); //pin resetujący mikrokontroler lcd.begin(16,2); IrReceiver.begin(2); lin1.reserve(16); lin2.reserve(16); linia1(); //funkcje budowania i wyświetlania linii na wyświetlaczu linia2(); } void loop () { if(IrReceiver.decode()) { //odbiór i interpretacja kodów if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x16 && IrReceiver.decodedIRData.flags==0) { //flags==0 mówi, że przycisk właśnie wciśnięto, a nie jest trzymany //jest to potrzebne by uniknąć zbędnych powtórzeń suma=suma*10; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x0C && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+1; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x18 && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+2; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x5E && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+3; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x08 && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+4; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x1C && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+5; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x5A && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+6; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x42 && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+7; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x52 && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+8; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x4A && IrReceiver.decodedIRData.flags==0) { suma=suma*10; suma=suma+9; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x0D && IrReceiver.decodedIRData.flags==0) { //zerowanie liczby punktów, np. po błędnym wpisaniu suma=0; minus=0; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x19 && IrReceiver.decodedIRData.flags==0) { //zmiana znaku liczby punktów minus=!minus; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x15 && IrReceiver.decodedIRData.flags==0) { //dodanie punktów aktualnemu graczowi if(gracz==0) { if(minus) { wynik1=wynik1-suma; } else { wynik1=wynik1+suma; } } else { if(minus) { wynik2=wynik2-suma; } else { wynik2=wynik2+suma; } } gracz++; if(gracz==2) { gracz=0; } suma=0; minus=0; } if(IrReceiver.decodedIRData.address==0 && IrReceiver.decodedIRData.command==0x45 && IrReceiver.decodedIRData.flags==0) { //reset mikrokontrolera digitalWrite(17, LOW); } delay(100); IrReceiver.resume(); linia1(); linia2(); } } void linia1() { lin1=" "; if(wynik1<10) { lin1=lin1+" "; } else if(wynik1<100) { lin1=lin1+" "; } if(gracz==0) { lin1=lin1+wynik1+" << "; } if(gracz==1) { lin1=lin1+wynik1+" >> "; } if(wynik2<10) { lin1=lin1+" "; } else if(wynik2<100) { lin1=lin1+" "; } lin1=lin1+wynik2+" "; lcd.setCursor(0,0); lcd.print(lin1); } void linia2() { lin2=" "; if(minus) { lin2=lin2+"-"; } else { lin2=lin2+" "; } lin2=lin2+" "; if(suma<10) { lin2=lin2+" "; } else if(suma<100) { lin2=lin2+" "; } lin2=lin2+suma+" "; lcd.setCursor(0,1); lcd.print(lin2); } Program napisany w Arduino IDE, wgrany przez programator USBasp. Podsumowanie Zrezygnowałem z lutowania układu bo na płytce stykowej jest całkiem solidny i idealnie mieści się w pudełku od Scrabble. 😄 Dodanie większej ilości graczy to na chwilę obecną też zbędna sprawa. Całość działa już kilka tygodni i na razie bateria daje radę. 🙂 Pozdrawiam! 🙂 Edytowano Styczeń 18, 2022 przez int 5 Link do komentarza Share on other sites More sharing options...
Gieneq Styczeń 17, 2022 Udostępnij Styczeń 17, 2022 @int ciekawy projekt, miło widzieć coś co rozwiązuje jakiś konkretny problem 🙂 18 godzin temu, int napisał: jest całkiem solidny i idealnie mieści się w pudełku od Scrabble. Wygląda bardzo kompaktowo 👍 2 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »