#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const boolean inputMode = HIGH;// high for buttons LOW for piezo
const int numPorts=4;
int led[numPorts]={6,7,8,9};
int ins[numPorts]={A0,A1,A2,A3};
int botton1;
int buttontest = 2;
int key=-1;
int tonepin = 12;
int theDelay=1;
unsigned long time1;
unsigned long time2;
unsigned long time3;
float interval1;
float interval2;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
pinMode(buttontest, INPUT);
digitalWrite(buttontest, LOW);
for (int i=0; i<numPorts; i++)
{
pinMode(led[i], OUTPUT);
pinMode(ins[i],INPUT);
//if (inputMode==HIGH) digitalWrite(ins[i],HIGH); // activate internal pullup;
}
intro();
//test();
}
void test (){
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(" PRACTICE ");delay(200);
while(1){
buttonState1 = digitalRead(A0);
buttonState2 = digitalRead(A1);
buttonState3 = digitalRead(A2);
buttonState4 = digitalRead(A3);
if (buttonState1 == HIGH) {
digitalWrite(led[0], HIGH);
delay(500);
digitalWrite(led[0], LOW);
delay(100);
test();
return;
}
if (buttonState2 == HIGH) {
digitalWrite(led[1], HIGH);
delay(500);
digitalWrite(led[1], LOW);
delay(100);
test();
return;
}
if (buttonState3 == HIGH) {
digitalWrite(led[2], HIGH);
delay(500);
digitalWrite(led[2], LOW);
delay(100);
test();
return;
}
if (buttonState4 == HIGH) {
digitalWrite(led[3], HIGH);
delay(500);
digitalWrite(led[3], LOW);
delay(100);
test();
return;
}
}
//doQuickDraw();
//doTimedMode();
//doRapidFire();
}
void startGameCount(){
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Starting Game");
for(int i = 5; i > 0 ; i--){ // START COUNT GAME INIT
lcd.setCursor(6,1);
tone(tonepin,2000,100);
lcd.print("IN ");
lcd.print(i);
delay(1000);
}
lcd.clear();
}
void doPost()
{
tone(tonepin, 440, 200);
for (int lop=0; lop<20; lop++)
{
theDelay+=10;
if (theDelay>500) theDelay=1;
for (int i=0; i<numPorts; i++)
{
//if (digitalRead(ins[i])==HIGH)
{
digitalWrite(led[i], HIGH); // turn the LED on (HIGH is the voltage level)
}
}
delay(theDelay); // wait for a second
for (int i=0; i<numPorts; i++)
{
digitalWrite(led[i], LOW); // turn the LED off by making the voltage LOW
}
delay(theDelay); // wait for a second
}
}
void intro() {
delay(200);
if (digitalRead(buttontest) != LOW){
test();
}
if (digitalRead(buttontest) == LOW) {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("HORNET TARGET");delay(500);
lcd.setCursor(1, 1);
lcd.print("by *K*R*T*E*K*");delay(100);
doPost();
lcd.clear(); delay(500);
lcd.setCursor(2, 0);
tone(tonepin, 500, 100);
lcd.setCursor(0, 0);
lcd.print("A-Quick B-Time");delay(200);
lcd.setCursor(0, 1);
lcd.print("C-Rapid");delay(200);
}
}
void loop()
{
while(1){
buttonState1 = digitalRead(A0);
buttonState2 = digitalRead(A1);
buttonState3 = digitalRead(A2);
buttonState4 = digitalRead(A3);
if (buttonState1 == HIGH) {
doPost();
startGameCount();
doQuickDraw();
return;
}
if (buttonState2 == HIGH) {
doPost();
startGameCount();
doTimedMode();
return;
}
if (buttonState3 == HIGH) {
doPost();
startGameCount();
doRapidFire();
return;
}
if (buttonState4 == HIGH) {
return;
}
}
//doQuickDraw();
//doTimedMode();
//doRapidFire();
}
void doTimedMode()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time mode: ");
randomSeed(millis());
tone(tonepin, 440, 200);
int currentPort=random(4);
int newPort=random(4);
int maxRounds=32;
int hitCounter=0;
time1=millis();
interval1=0;
while (interval1 < 10000) // 10 seconds
{
//time1=millis();
digitalWrite(led[currentPort],HIGH);
switch (currentPort)
{
case 0:
while (!(PINC & B00000001));
break;
case 1:
while (!(PINC & B00000010));
break;
case 2:
while (!(PINC & B00000100));
break;
case 3:
while (!(PINC & B00001000));
break;
}
hitCounter++;
//delay(1000);
time2=millis();
interval1=(time2-time1);
digitalWrite(led[currentPort],LOW);
lcd.setCursor(0, 1);
lcd.print("Hits: ");
lcd.println(hitCounter,DEC);
newPort=random(4);
while (newPort==currentPort) newPort=random(4);
currentPort=newPort;
}
tone(tonepin,2000,1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TIME MODE: ");delay(100);
lcd.print(hitCounter,DEC);
lcd.setCursor(0, 1);
lcd.println("Hits in 10 Secs");
delay(15000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Play again:");
lcd.setCursor(0,1);
lcd.print("JA-T2 NE-T4");
while(1){
buttonState1 = digitalRead(A1);
buttonState4 = digitalRead(A3);
if (buttonState1 == HIGH) {
startGameCount();
doTimedMode();
return;
}
if (buttonState4 == HIGH) {
intro();
return;
}
}
}
void doRapidFire()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Rapid fire mode:");
randomSeed(millis());
tone(tonepin, 440, 200);
int currentPort=random(4);
int newPort=random(4);
int maxRounds=5;
time1=millis();
for (int i=0; i<maxRounds; i++)
{
lcd.setCursor(0, 1);
lcd.print("Round ");
lcd.print(i+1,DEC);
lcd.print(" of ");
lcd.print(maxRounds,DEC);
lcd.println("");
digitalWrite(led[currentPort],HIGH);
switch (currentPort)
{
case 0:
while (!(PINC & B00000001));
break;
case 1:
while (!(PINC & B00000010));
break;
case 2:
while (!(PINC & B00000100));
break;
case 3:
while (!(PINC & B00001000));
break;
}
//delay(1000);
//interval1=interval1+0.00001;
digitalWrite(led[currentPort],LOW);
newPort=random(4);
while (newPort==currentPort) newPort=random(4);
//newPort=3;
currentPort=newPort;
}
time2=millis();
interval1=(time2-time1);
interval1=interval1/1000;
tone(tonepin,2000,1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.println("Rapid Time:");
lcd.setCursor(0,1);
lcd.print(interval1,4);
lcd.println(" secs");
delay(15000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Play again:");
lcd.setCursor(0,1);
lcd.print("JA-T3 NE-T4");
while(1){
buttonState1 = digitalRead(A2);
buttonState4 = digitalRead(A3);
if (buttonState1 == HIGH) {
startGameCount();
doRapidFire();
return;
}
if (buttonState4 == HIGH) {
intro();
return;
}
}
}
void doQuickDraw()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Quick draw mode:");
randomSeed(millis());
tone(tonepin, 440, 200);
int firstTime=true;
int currentPort=random(4);
int maxRounds=8;
time3=millis();
for (int i=0; i<maxRounds; i++)
{
lcd.setCursor(0, 1);
lcd.print("Round ");
lcd.print(i+1);
lcd.print(" of ");
lcd.print(maxRounds);
lcd.println(" ");
delay(random(3000)+1000);
if (firstTime==true) { firstTime=false; }// C note
time1=millis();
digitalWrite(led[currentPort],HIGH);
switch (currentPort)
{
case 0:
while (!(PINC & B00000001));
break;
case 1:
while (!(PINC & B00000010));
break;
case 2:
while (!(PINC & B00000100));
break;
case 3:
while (!(PINC & B00001000));
break;
}
//delay(1000);
time2=millis();
interval1=(time2-time1);
interval1=interval1/1000;
digitalWrite(led[currentPort],LOW);
lcd.setCursor(0, 0);
lcd.println("Quickdraw Time: ");
lcd.setCursor(0, 1);
lcd.print(interval1);
lcd.println(" seconds");
delay(2000);
currentPort=random(4);
}
interval2=(time2-time3);
interval2=interval2/1000;
lcd.clear();
tone(tonepin,2000,1000);
lcd.setCursor(0, 0);
lcd.println("Total Time: ");
lcd.setCursor(0, 1);
lcd.print(interval2,3);
lcd.println(" s");
delay(15000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Play again:");
lcd.setCursor(0,1);
lcd.print("JA-T1 NE-T4");
while(1){
buttonState1 = digitalRead(A0);
buttonState4 = digitalRead(A3);
if (buttonState1 == HIGH) {
startGameCount();
doQuickDraw();
return;
}
if (buttonState4 == HIGH) {
intro();
return;
}
}
}