#include <Wire.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h>
#include <IRremote.h> //ir modul
#include <Servo.h>
#define PIN_RECEIVER 53 // Signal Pin of IR receiver
IRrecv receiver(PIN_RECEIVER);
int pilot = receiver.decodedIRData.command;
hd44780_I2Cexp lcd; // declare lcd object: auto locate & auto config expander chip
const int LCD_COLS = 16;
const int LCD_ROWS = 2;
int pos = 0; //pozycja startowa
int test=0;
Servo servo[9]; // create an array of 6 servos
int IntRandom=0;
const byte servoPins[] = {2,3,4,5,6,7,8,9,10,11};
int tarcza[10]={0,1,2,3,4,5,6,7,8,9};
//int tarcza[3]={0,1,2};
int CzujnikUderzenia[10] = {A0,A1,A2,A3,A4,A5,A6,A7,A8,A9};
byte TablicaTrafien[12]={0};
int trafienie=0;
int cele = 0;
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
receiver.enableIRIn(); // Start the receiver
lcd.print("Wybierz cele");
//ustawienie/dodanie serwa w pozycji leżacej
for(int n = 0; n < 10; n++)
{
servo[n].attach(servoPins[n]);
Serial.print("Podpinam Servo: ");Serial.println(n);
servo[n].write(90);
}
}
void loop() {
// put your main code here, to run repeatedly:
// Checks received an IR signal
if (receiver.decode())
{
translateIR();
receiver.resume(); // Receive the next value
}
}
void lcdPrint(char* text)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wybierz cele:");
lcd.setCursor(0, 1);
lcd.print(text);
}
void translateIR()
{
// Takes command based on IR code received
switch (receiver.decodedIRData.command) {
case 162:
lcdPrint("POWER");
break;
case 226:
lcdPrint("MENU");
break;
case 34:
lcdPrint("TEST");
break;
case 2:
lcdPrint("PLUS");
break;
case 194:
lcdPrint("BACK");
break;
case 224:
lcdPrint("PREV.");
break;
case 168:
lcdPrint("PLAY");
break;
case 144:
lcdPrint("NEXT");
break;
case 104:
lcdPrint("Wybrales: GOWNO");
break;
case 152:
lcdPrint("MINUS");
break;
case 176:
lcdPrint("key: C");
break;
case 48:
lcdPrint("Wybrales: 1");
Ustawienie(1);
break;
case 24:
lcdPrint("Ilosc: 2");
receiver.resume();
Ustawienie(2);
break;
case 122:
lcdPrint("Ilosc: 3");
Ustawienie(3);
break;
case 16:
lcdPrint("Ilosc: 4");
Ustawienie(4);
break;
case 56:
lcdPrint("Ilosc: 5");
Ustawienie(5);
break;
case 90:
lcdPrint("Ilosc: 6");
Ustawienie(6);
break;
case 66:
lcdPrint("Ilosc: 7");
Ustawienie(7);
break;
case 74:
lcdPrint("Ilosc: 8");
Ustawienie(8);
break;
case 82:
lcdPrint("Ilosc: 9");
Ustawienie(9);
break;
default:
lcd.clear();
lcd.print(receiver.decodedIRData.command);
lcd.print(" other button");
}
}
void mieszanie()
{
const size_t n = sizeof(tarcza) / sizeof(tarcza[0]);
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;
}
}
void Ustawienie(int a)
{
cele=a;
trafienie=a;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Gotowy?");
do
{
receiver.decode();
pilot = receiver.decodedIRData.command;
receiver.resume();
if(receiver.decodedIRData.command==194)
{
goto Poczatek;
}
}
while (receiver.decodedIRData.command!=168); //klikniecie play startuje
lcd.clear();
lcd.print("Start: 2");
delay(1000);
lcd.clear();
lcd.print("Start: 1");
delay(1000);
lcd.clear();
mieszanie();
Serial.println("procedura mieszania liczb/tarcz");
//sprawdzenie wylosowanych czujnikow
for (int i = 0; i<cele;i++)
{
Serial.print("cel nr ");Serial.print(i);Serial.print("wartosc: ");Serial.println(tarcza[i]); ;
servo[tarcza[i]].write(-100); // podnosi wybrane cele
//delay(20);
Serial.print(TablicaTrafien[i]);
}
//sekcja badania strzalu
Serial.println("Lista danych przed sekcja badania strzalu");
Serial.print("Cele: ");Serial.println(cele);
Serial.print("Trafienie: ");Serial.println(trafienie);
delay(1000);
unsigned long StartTime = millis();
do
{
for (int i = 0; i<cele;i++) //sprawdza cele
{
Serial.print("Sprawdzam czujnik uderzenia ");Serial.print(i);Serial.print(" | ");Serial.print(analogRead(CzujnikUderzenia[tarcza[i]]));Serial.print(" Status trafienia:");Serial.println(TablicaTrafien[tarcza[i]]);
//trafienie
if(analogRead((CzujnikUderzenia[tarcza[i]])>800) && (TablicaTrafien[tarcza[i]]==0))
{
servo[tarcza[i]].write(90);
trafienie--;
TablicaTrafien[tarcza[i]]=1;
}
Serial.print("Sprawdzam czujnik uderzenia ");Serial.print(i);Serial.print(" | ");Serial.print(analogRead(CzujnikUderzenia[tarcza[i]]));Serial.print(" Status trafienia:");Serial.println(TablicaTrafien[tarcza[i]]);
delay(1000);
}
}
while(trafienie!=0);
unsigned long EndTime = millis();
lcd.clear();
lcd.print("Twoj czas w ms");
lcd.setCursor(0,1);
lcd.print(EndTime-StartTime);
delay(5000);
Poczatek:
lcd.clear();
lcd.print("Wybierz cele:");
memset(TablicaTrafien, 0, sizeof(TablicaTrafien));
}