Hallo Leute,
dieses Mal geht es um das Laser-Gewehr. Ich habe folgendes Problem. Während der Neustart-Phase (Countdown von 5 bis 0) soll das Gewehr nicht empfangsbereit sein. Tatsächlich wertet das Gewehr Beschüsse während des Countdowns nicht aus, obwohl es Zeit dazu hätte. Aber sobald das Spiel beginnt wertet er den Beschuss aus, als hätte er sich diesen gemerkt und zwischengespeichert.
Während des Countdowns wird die Variable menuStatus=1 gesetzt, dass das if-Statement für die Trefferauswertung false ist. Das klappt ja auch - der Schuss bleib unbeachtet. Aber nach dem Countdown wird menuStatus=0 gesetzt, das Spiel beginnt. Und nun ist das Gewehr auch empfangsbereit. Dummerweise wertet es nun den Beschuss, der vor mehreren Sekunden kam, aus.
Gibt es dafür eine (hoffentlich einfache) Erklärung, die mir hilft, den Bug in meinem Sketch zu tilgen?
Es geht vornehmlich um die Abschnitte TREFFER und RESTART.
#include <IRremote.h>
#include <Arduino.h>
#include <Wire.h>
#include <LCD_I2C.h>
//AMOUNTS
int magazin = 16;
int health = 100;
//PINS
int receiver = 9;
int sender = 4;
int trigger = 6;
char triggerState = LOW;
int recoil = 2;
int empty = 3;
int feedback = 5;
int reload = 7;
int menu = 8;
int menuStatus = 0;
// Für Trefferanzeige auf LCD
long unsigned int startHitLCD;
long unsigned int intervall = 2000;
int nametag = 0;
unsigned long time;
bool reset = false;
LCD_I2C lcd(0x27, 16, 2);
IRsend irsend(sender);
IRrecv irrecv(receiver);
decode_results results;
byte bullet[] = {
B01100,
B11110,
B11110,
B11010,
B11010,
B11010,
B11010,
B11110
};
void updateDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
Serial.print("aktueller Nametag: ");
Serial.println(nametag);
if(nametag == 0) {openMenu();}
else
{
clearLCDLine(0);
databaseOfNametags(nametag);
lcd.setCursor(13, 0);
if (health == 0){
lcd.print("KIA");
Serial.println("KIA");
}
else {
if(health != 100){lcd.print(" ");}
lcd.print(health);
}
lcd.setCursor(0, 1);
if (magazin == 0) {
lcd.print("[RELOAD]");
}
else {
for (int i = 0; i < magazin; i++) {
lcd.write(byte(0));
}
}
Serial.println("Display refreshed");
}
}
void clearLCDLine(int line)
{
lcd.setCursor(0,line);
for(int n = 0; n < 16; n++)
{
lcd.print(" ");
}
lcd.setCursor(0,line);
}
void openMenu() {
menuStatus = 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Select your name!");
lcd.setCursor(0, 1);
lcd.print("[FIRE] or [MENU]");
Serial.println("Menu opened");
}
void databaseOfNametags(int nametagID){
switch (nametagID) {
case 1: lcd.print("Recognite"); break;
case 2: lcd.print("Tyrannforce"); break;
case 3: lcd.print("Haselnuss"); break;
case 4: lcd.print("John"); break;
case 5: lcd.print("Schmith"); break;
case 6: lcd.print("Ronald"); break;
case 7: lcd.print("Miller"); break;
case 8: lcd.print("Tudor"); break;
case 9: lcd.print("Clarkson"); break;
case 10: lcd.print("Goldtooth"); break;
case 11: lcd.print("GRENADE"); break;
case 12: lcd.print("PROX BOMB"); break;
case 13: lcd.print("AIM BOT"); break;
case 14: lcd.print("TEST SHOT"); break;
case 15: lcd.print("MEDIC"); break;
case 30: lcd.print("RESET"); break;
default: break;
}
}
void toggleNametags() {
lcd.setCursor(1, 1);
if(nametag >= 10) {nametag = 1;} else {nametag++;}
delay(200);
clearLCDLine(1);
lcd.print(nametag);
lcd.print(" ");
databaseOfNametags(nametag);
Serial.print("NAMETAG CHOSEN: ");
Serial.println(nametag);
}
void closeMenu() {
menuStatus = 0;
updateDisplay();
magazin = 16;
health = 100;
updateDisplay();
restart();
Serial.println("Menu closed");
}
void restart()
{
menuStatus = 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("New Round in");
lcd.setCursor(6, 1);
for(int i=5; i>-1; i--)
{
lcd.print(i);
lcd.setCursor(6, 1);
delay(500);
}
health = 100;
magazin = 16;
updateDisplay();
Serial.println("Restart");
delay(500);
menuStatus = 0;
}
// SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP SETUP
void setup() {
Serial.begin(9600);
lcd.begin();
lcd.createChar(0, bullet);
lcd.backlight();
pinMode(receiver, INPUT);
pinMode(trigger, INPUT_PULLUP);
pinMode(feedback, OUTPUT);
pinMode(empty, OUTPUT);
pinMode(reload, INPUT_PULLUP);
pinMode(recoil, OUTPUT);
pinMode(menu, INPUT_PULLUP);
pinMode(sender, OUTPUT);
irsend.enableIROut(38);
irrecv.enableIRIn();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Customs Lasertag");
lcd.setCursor(4, 1);
delay(1000);
lcd.print("by RECO");
delay(1500);
Serial.println("Customs Lasertag by RECO");
updateDisplay();
}
// LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP
void loop() {
if(health < 0) {health = 0; updateDisplay();}
else if(health > 100) {health = 100; updateDisplay();}
triggerState = digitalRead(trigger);
if (digitalRead(menu) == LOW && !reset){
time = millis();
reset = true;
}
if(digitalRead(menu) == HIGH && reset){
reset = false;
}
// MENÜ ÖFFNEN
if (digitalRead(menu) == LOW && health != 0 && menuStatus == 0 && (millis() - time > 1000)){
openMenu(); delay(500);
}
//NAMEN DURCHGEHEN
if (menuStatus == 1 && digitalRead(trigger) == LOW) {
toggleNametags();
}
// MENÜ SCHLIESSEN
if (digitalRead(menu) == LOW && menuStatus == 1 && (millis() - time > 1000)){
closeMenu();
delay(500);
}
// RESET
if (irrecv.decode(&results) && results.value == 30 )
{
health = 100;
magazin = 16;
menuStatus = 0;
Serial.println("Reset");
updateDisplay();
}
// KIA
if (digitalRead(menu) == LOW && health == 0)
{
digitalWrite(feedback,HIGH);
delay(300);
digitalWrite(feedback, LOW);
delay(300);
}
//RESTART
if (digitalRead(menu) == LOW && health == 0)
{
restart();
}
//NACHLADEN
if (digitalRead(reload) == LOW && health != 0 && menuStatus == 0)
{
magazin = 16;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("reloading ...");
lcd.setCursor(0,1);
for (int i = 0; i < magazin; i++)
{
delay(170);
lcd.write(byte(0));
digitalWrite(empty, HIGH);
delay (15);
digitalWrite(empty, LOW);
delay (65);
}
Serial.println("Reload");
updateDisplay();
}
//SCHUSSABGABE
if (triggerState == LOW && magazin != 0 && health != 0 && menuStatus == 0)
{
Serial.println("Shoot");
magazin --;
updateDisplay();
digitalWrite(recoil, HIGH);
delay(100);
digitalWrite(recoil, LOW);
for(int i= 0; i<2; i++)
{
irsend.sendSony(nametag, 32);
delay(40);
}
}
//SCHUSSVERSUCH LEER
if (triggerState == LOW && magazin == 0 && health != 0 && menuStatus == 0)
{
Serial.println("Leer");
digitalWrite(empty, HIGH);
delay(15);
digitalWrite(empty, LOW);
delay(500);
}
//TREFFER
if (irrecv.decode(&results) && health != 0 && menuStatus == 0) {
Serial.print("compare: ");
Serial.print(results.value);
Serial.print(" and ");
Serial.println(nametag);
if(results.value != nametag && results.value > 0 && results.value < 30)
{
Serial.print("Hit by ");
Serial.println(results.value);
digitalWrite(feedback, HIGH);
if(results.value <= 10) {health -= 10;} //Schuss Schaden
else if (results.value == 11) {health -= 25;} //Granaten Schaden
else if (results.value == 12) {health -= 50;} //Bomben Schaden
else if (results.value == 13) {health -= 20;} //Aim Bot Schaden
else if (results.value == 14) {health -= 15;} //Test Shot
else if (results.value == 15) {health += 33;} //Health
lcd.clear();
lcd.print("Hit by ");
lcd.setCursor(0,1);
databaseOfNametags(results.value);
delay(1000);
updateDisplay();
digitalWrite(feedback, LOW);
}
}
irrecv.resume();
delay(10);
}