//69 70 71 68 64 67 7 21 9 22 25 13 24 8 28 90 82
#include <Wire.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h>
#define IR_USE_AVR_TIMER3
#include <IRremote.h> //ir modul
#include <Keypad.h>
#define PIN_RECEIVER 53 // Pin pilota
//pilot
/*
#define Pilot_1 69
#define Pilot_2 70
#define Pilot_3 71
#define Pilot_4 68
#define Pilot_5 64
#define Pilot_6 67
#define Pilot_7 7
#define Pilot_8 21
#define Pilot_9 9
#define Pilot_0 25
#define Pilot_Play 28
#define Pilot_#
*/
// PILOT Emulator
#define Pilot_1 48
#define Pilot_2 24
#define Pilot_3 122
#define Pilot_4 16
#define Pilot_5 56
#define Pilot_6 90
#define Pilot_7 66
#define Pilot_8 74
#define Pilot_9 92
#define Pilot_0 104
#define Pilot_Play 168
#define Pilot_Hash 34 //test
#define Pilot_C 176 //C
#define glosnik 13 //pin glosnika
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ Pilot_1 , Pilot_2 , Pilot_3 , 'k' },
{ Pilot_4, Pilot_5, Pilot_6, 'B' },
{ Pilot_7 , Pilot_8 , Pilot_9 , 'c' },
{ '*', Pilot_0, Pilot_Hash , 'D' }
}; //pojebane :D
uint8_t colPins[COLS] = { 41, 43, 45, 47 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 40, 42, 44, 46 }; // Pins connected to R1, R2, R3, R4
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
IRrecv receiver(PIN_RECEIVER); //receiver <- pilot
hd44780_I2Cexp lcd; // declare lcd object: auto locate & auto config expander chip
const int LCD_COLS = 16;
const int LCD_ROWS = 2;
size_t n = 10; //tablica czujników
int sumatrafien=0; // sumatrafien wyświetlana na koniec
int test=0; // zmienna testowa
void(* resetFunc) (void) = 0; //funkcja resetujaca arduino na zawolanie
byte tryb=2 ; //1 zbicie 2 na czas 30 sek
int tarcza[10]={0,1,2,3,4,5,6,7,8,9}; //wszystkie tarcze
int CzujnikUderzenia[10] = {A0,A1,A2,A3,A4,A5,A6,A7,A8,A9}; //wszystkie czujniki
byte TablicaTrafien[12]={0}; //tymczasowa tablica trafien
byte dalej=0;
int trafienie=0; //zmienna trafien
int cele = 0; // zmienna celi
int klawisz;
void setup()
{
Serial.begin(9600); //serial
lcd.begin(16, 2); //uruchomienie ekranu
receiver.enableIRIn(); //uruchomienie pilota
//podpinanie czujników + test LED
for(int n = 0; n < 10; n++)
{
pinMode((tarcza[n])+2,OUTPUT);
digitalWrite((tarcza[n])+2,HIGH);
Serial.print("Podpinam LED: ");Serial.println(n);
if(analogRead((CzujnikUderzenia[tarcza[n]]))>1000)
{
lcd.clear();
lcd.print("Error Czujka");
lcd.setCursor(0, 1);
lcd.print(n);
Serial.println("Error CZUJNIKA!");
Serial.println(n);
tone(glosnik,4500,20);
digitalWrite((tarcza[n])+2,LOW);
delay(1000);
};
delay(150);
}
//test ledów
for(int n = 0; n < 10; n++)
{
digitalWrite((tarcza[n])+2,LOW);
delay(100);
}
lcd.clear();
lcd.print("Czujniki:");
//ustawienia czujnikow
BrakCzujnikow:
do
{
receiver.resume();
delay(20);
klawisz = keypad.getKey();
if(receiver.decode() || klawisz)
{
if(klawisz)
{
//Serial.print(klawisz);
}
else
{
klawisz=receiver.decodedIRData.command;
}
switch (klawisz)
{
case Pilot_1:
lcdPrint("Ilosc: 1");
n=0;
break;
case Pilot_2:
lcdPrint("Ilosc: 2");
n=1;
break;
case Pilot_3:
lcdPrint("Ilosc: 3");
n=2;
break;
case Pilot_4:
lcdPrint("Ilosc: 4");
n=3;
break;
case Pilot_5:
lcdPrint("Ilosc: 5");
n=4;
break;
case Pilot_6:
lcdPrint("Ilosc: 6");
n=5;
break;
case Pilot_7:
lcdPrint("Ilosc: 7");
n=6;
break;
case Pilot_8:
lcdPrint("Ilosc: 8");
n=7;
break;
case Pilot_9:
lcdPrint("Ilosc: 9");
n=8;
break;
case Pilot_Play:
goto Dalej1;
break;
}
}
// Serial.print(klawisz);
}
while (klawisz != 'k'); //klikniecie play startuje (receiver.decodedIRData.command!=Pilot_Play) ||
Dalej1:
Serial.print(n);
if(n==10)
{
lcd.clear();
lcd.print("Nie wybrales ");
lcd.setCursor(0,1);
lcd.print("czujek");
delay(1000);
lcd.clear();
lcd.print("Ile czujek?");
goto BrakCzujnikow;
}
lcd.clear();
lcd.print("Wybrano czujniki");
delay(1000);
lcd.clear();
lcd.print("Tryb 1-2");
do
{
receiver.resume();
delay(20);
klawisz = keypad.getKey();
if(receiver.decode() || klawisz)
{
if(klawisz)
{
// Serial.print(klawisz);
}
else
{
klawisz=receiver.decodedIRData.command;
}
switch (klawisz)
{
case Pilot_1:
lcd.setCursor(0, 1);
lcd.print("1.Zbicie ");
tryb=1;
break;
case Pilot_2:
lcd.setCursor(0, 1);
lcd.print("2. Na czas 30sek");
tryb=2;
break;
case Pilot_Play:
goto Dalej2;
break;
}
}
receiver.resume();
}
while (klawisz != 'k'); //klikniecie play startuje
Dalej2:
lcd.clear();
lcd.print("Wybrano tryb");
delay(1000);
lcd.clear();
lcd.print("Ile celi?");
}
void loop()
{
klawisz = keypad.getKey();
receiver.resume();
if (receiver.decode()>0||klawisz>0)
{
translateIR(); //metoda dekodujaca wybor trybu
}
receiver.resume();
}
//metoda pomocniczna
void lcdPrint(char* text)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Czujniki:");
lcd.setCursor(0, 1);
lcd.print(text);
}
void mieszanie()
{
// const size_t n = sizeof(tarcza) / sizeof(tarcza[0]);
//const size_t n = 3;
for (size_t i = 0; i < n - 1; i++)
{
randomSeed(random(1,256));
size_t j = random(0, n - i);
int t = tarcza[i];
tarcza[i] = tarcza[j];
tarcza[j] = t;
delay(10);
}
}
void mieszanie2()
{
for (size_t i = n ; i > 0; i--) {
size_t j = random(i + 1);
int temp = tarcza[i];
tarcza[i] = tarcza[j];
tarcza[j] = temp;
delay(10);
}
}
void WylaczLed()
{
for(int n = 0; n < 10; n++)
{
digitalWrite((tarcza[n])+2,LOW);
delay(20);
}
}
//tryb nr 1
void Ustawienie(int a)
{
cele=a; //pobranie ile mamy celi
trafienie=a; // pobranie ile mamy do trafienia celi (cele=trafienia)
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Gotowy?");
lcd.setCursor(0,1);
lcd.print("Cele: "); lcd.print(a);
do
{
receiver.resume();
delay(20);
klawisz = keypad.getKey();
if(receiver.decode() || klawisz)
{
if(klawisz)
{
// Serial.print(klawisz);
}
else
{
klawisz=receiver.decodedIRData.command;
}
switch (klawisz)
{
case Pilot_C:
goto Poczatek;
break;
case 'c':
goto Poczatek;
break;
case Pilot_Play:
goto Gramy1;
break;
}
}
receiver.resume();
}
while (klawisz != 'k'); //klikniecie play startuje
Gramy1:
if(cele-1>n)
{
lcd.clear();
lcd.print("Za malo czujek");
delay(3000);
resetFunc();
}
lcd.clear();
lcd.print("Start: 2");
tone(glosnik,4000,200);
delay(1000);
lcd.clear();
lcd.print("Start: 1");
tone(glosnik,4000,200);
delay(1000);
tone(glosnik,4500,100);
lcd.clear();
mieszanie2(); //inny tryb mieszania
unsigned long StartTime = millis();
for (int i = 0; i<cele;i++)
{
digitalWrite((tarcza[i])+2, HIGH);
}
do
{
lcd.setCursor(0,0);
lcd.print("Twoj czas w ms");
lcd.setCursor(0,1);
lcd.print(millis()-StartTime);
for (int i = 0; i<cele;i++) //sprawdza cele
{
int czujnikTEMP=analogRead((CzujnikUderzenia[tarcza[i]]));
if(czujnikTEMP>50 && (TablicaTrafien[tarcza[i]]==0))
{
digitalWrite((tarcza[i])+2, LOW);
trafienie--;
TablicaTrafien[tarcza[i]]=1;
}
}
}
while(trafienie!=0);
unsigned long EndTime = millis();
lcd.clear();
lcd.print("Twoj czas w ms");
lcd.setCursor(0,1);
lcd.print(EndTime-StartTime);
tone(glosnik,3900,500);
delay(5000);
WylaczLed();
Poczatek:
lcd.clear();
lcd.print("Wybierz cele:");
memset(TablicaTrafien, 0, sizeof(TablicaTrafien));
}
void Ustawienie2(int a)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Gotowy?");
lcd.setCursor(0,1);
lcd.print("Cele: "); lcd.print(a);
do
{
receiver.resume();
delay(10);
klawisz = keypad.getKey();
if(receiver.decode() || klawisz)
{
if(klawisz)
{
// Serial.print(klawisz);
}
else
{
klawisz=receiver.decodedIRData.command;
}
switch (klawisz)
{
case Pilot_C:
receiver.resume();
goto Poczatek;
break;
case Pilot_Play:
goto Gramy2;
break;
}
}
receiver.resume();
}
while (klawisz != 'k'); //klikniecie play startuje
Gramy2:
//gramy!
cele=a; //pobranie ile mamy celi
trafienie=a; // pobranie ile mamy do trafienia celi (cele=trafienia)
if(cele-1>n)
{
lcd.clear();
lcd.print("Za malo czujek");
delay(3000);
resetFunc();
}
lcd.clear();
lcd.print("Start: 2");
tone(glosnik,4500,200);
delay(1000);
lcd.clear();
lcd.print("Start: 1");
tone(glosnik,4500,200);
delay(1000);
tone(glosnik,5000,100);
lcd.clear();
unsigned long StartTime = millis(); //zaczne odliczac czas tutaj
LiczDalej:
mieszanie2();
for (int i = 0; i<cele;i++)
{
digitalWrite((tarcza[i])+2, HIGH); //zapalanie tarcz
}
do
{
lcd.setCursor(0,0);
lcd.print(millis()-StartTime);
lcd.setCursor(0,1);
//
lcd.print(sumatrafien);
for (int i = 0; i<cele;i++) //sprawdza cele
{
if (trafienie == 0 )
{
memset(TablicaTrafien, 0, sizeof(TablicaTrafien));
trafienie=a;
delay(200);
goto LiczDalej;
}
if(analogRead((CzujnikUderzenia[tarcza[i]]))>200 && (TablicaTrafien[tarcza[i]]==0))
{
digitalWrite((tarcza[i])+2, LOW);
trafienie--;
TablicaTrafien[tarcza[i]]=1;
sumatrafien=sumatrafien+1;
}
}
}
while(millis()-StartTime<30000);
lcd.clear();
tone(glosnik,5000,1000);
lcd.clear();
lcd.print("Trafiles:");
lcd.setCursor(0,1);
lcd.print(sumatrafien);
delay(8000);
sumatrafien=0;
// delay(1000);
WylaczLed();
Poczatek:
lcd.clear();
lcd.print("Wybierz cele:");
memset(TablicaTrafien, 0, sizeof(TablicaTrafien));
}
void translateIR()
{
if(klawisz)
{
}
else
{
klawisz=receiver.decodedIRData.command;
}
switch (klawisz) {
case Pilot_1:
lcdPrint("Wybrales: 1");
if (tryb==1)
{
Ustawienie(1);
}
else if(tryb==2)
{
Ustawienie2(1);
}
break;
case Pilot_2:
lcdPrint("Ilosc: 2");
if (tryb==1)
{
Ustawienie(2);
}
else
{
Ustawienie2(2);
}
break;
case Pilot_3:
lcdPrint("Ilosc: 3");
if (tryb==1)
{
Ustawienie(3);
}
else
{
Ustawienie2(3);
}
break;
case Pilot_4:
lcdPrint("Ilosc: 4");
if (tryb==1)
{
Ustawienie(4);
}
else
{
Ustawienie2(4);
}
break;
case Pilot_5:
lcdPrint("Ilosc: 5");
if (tryb==1)
{
Ustawienie(5);
}
else
{
Ustawienie2(5);
}
break;
case Pilot_6:
lcdPrint("Ilosc: 6");
if (tryb==1)
{
Ustawienie(6);
}
else
{
Ustawienie2(6);
}
break;
case Pilot_7:
lcdPrint("Ilosc: 7");
if (tryb==1)
{
Ustawienie(7);
}
else
{
Ustawienie2(7);
}
break;
case Pilot_8:
lcdPrint("Ilosc: 8");
if (tryb==1)
{
Ustawienie(8);
}
else
{
Ustawienie2(8);
}
break;
case Pilot_9:
lcdPrint("Ilosc: 9");
if (tryb==1)
{
Ustawienie(9);
}
else
{
Ustawienie2(9);
}
break;
case Pilot_0:
lcdPrint("Restart");
delay(1000);
resetFunc();
break;
default:
lcd.clear();
lcd.print("Wybierz!");
//klawisz==0;
break;
}
}