Hallo, ich hätte folgendes Programm, eines Reaktionsspiels und ich versuche gerade die Werte die der Serial Monitor ausgibt (Punkte der jeweiligen Spieler) auf einem 16, 2 LCD anzeigen zu lassen. Aber wenn ich es versuche zeigt das Display mir nur 2 weiße Kästchen untereinander an. Weiß jemand wie ich diesen Fehler beheben kann?
Vielen Dank schon mal im Voraus
# include "LCDIC2.h"
#define PIN_LED_GOOD 8 // LED Grün
#define PIN_LED_BAD 9 // LED Rot
#define DEBOUNCE_TIME 300 // in ms
#define GAME_STATE_RUNNING 1
#define GAME_STATE_END 2
#define PLAYER_1 0
#define PLAYER_2 1
#define PLAYER_AMOUNT 2 // Anzahl der Spieler
#define WINNING_SCORE 10 // Benötigte Punkte bis zum Sieg
#define MIN_CHANGE_TIME 80 // Minimale Zeit beim LED Wechsel in ms
#define MAX_CHANGE_TIME 2000 // Maximale Zeit beim LED Wechsel in ms
const byte pinButtons[PLAYER_AMOUNT] = {2, 3};// Anschlüsse der Taster
const byte pinLeds[PLAYER_AMOUNT] = {10, 11}; // Anschlüsse der Ergebniss-LEDs
byte gameState;
byte ledState;
byte score[PLAYER_AMOUNT];
unsigned long lastButtonClick[PLAYER_AMOUNT];
unsigned long lastLedChange;
unsigned long nextLedStateChange;
// Name des LCDs
LCDIC2 lcd(0x27,16, 2);
void setup()
{
randomSeed(analogRead(0)); // Erzeugen einer zufälligen Reihenfolge
pinMode(PIN_LED_GOOD, OUTPUT);
pinMode(PIN_LED_BAD, OUTPUT);
for (byte i=0; i<PLAYER_AMOUNT; i++) {
pinMode(pinLeds[i], OUTPUT);
pinMode(pinButtons[i], INPUT);
lastButtonClick[i] = millis();
}
gameState = GAME_STATE_END;
lcd.begin();
lcd.clear();
}
void loop()
{
switch(gameState)
{
case GAME_STATE_END: // Wenn das Spiel zu ende ist, soll es neustarten wenn einer der Taster gedrückt wird
if (isButtonPressed(PLAYER_1) || isButtonPressed(PLAYER_2)) {
initGame(); // Springe in das Unterprogramm "initGame"
}
break;
case GAME_STATE_RUNNING: // Wenn das Spiel läuft und einer der Taster gedrückt wird, soll der Status, somit die Punkte des Spielers überprüft werden
toggleLedState();
if (isButtonPressed(PLAYER_1)) {
checkGameState(PLAYER_1);
}
if (isButtonPressed(PLAYER_2)) {
checkGameState(PLAYER_2);
}
break;
}
delay(100);
lcd.setCursor(false);
Serial.read();
lcd.setCursor(0, 0);
lcd.print(Serial.read());
lcd.setCursor(0, 1);
lcd.print(Serial.read());
}
void initGame()
{
gameState = GAME_STATE_RUNNING;
setNextLedChange(); // Springe in das Unterprogramm "setNextLedChange"
ledState = 0;
digitalWrite(PIN_LED_GOOD, LOW); // Resetet alles auf 0
digitalWrite(PIN_LED_BAD, LOW);
for (byte i=0; i<PLAYER_AMOUNT; i++) {
digitalWrite(pinLeds[i], LOW);
lastButtonClick[i] = millis();
score[i] = 0;
}
}
void setNextLedChange()
{
lastLedChange = millis();
nextLedStateChange = random(MIN_CHANGE_TIME, MAX_CHANGE_TIME); // festlegen der Zeit bis zur nächsten LED
}
bool isButtonPressed(byte playerId)
{
if (millis() - lastButtonClick[playerId] < DEBOUNCE_TIME) {
return false;
}
if (digitalRead(pinButtons[playerId]) == HIGH) {
lastButtonClick[playerId] = millis();
return true;
}
return false;
}
void toggleLedState()
{
if (ledState == PIN_LED_GOOD) {
return;
}
if ((millis() - lastLedChange) < nextLedStateChange) {
return;
}
if (ledState == PIN_LED_BAD) {
digitalWrite(PIN_LED_BAD, LOW);
setNextLedChange(); // Springe in das Unterprogramm "setNextLedChange"
}
if (random(0, 100) > 50) { // Erzeugen einer Zufallszahl zwischen 0 und 100, wenn sie größer ist als 50 leuchtet die Grüne LED
ledState = PIN_LED_GOOD;
digitalWrite(PIN_LED_GOOD, HIGH);
digitalWrite(PIN_LED_BAD, LOW);
} else { // Wenn die zahl kleiner gleich 50 ist leuchtet die Rote LED
ledState = PIN_LED_BAD;
digitalWrite(PIN_LED_GOOD, LOW);
digitalWrite(PIN_LED_BAD, HIGH);
setNextLedChange(); // Springe in das Unterprogramm "setNextLedChange"
}
}
void checkGameState(byte playerId)
{ Serial.begin(9600);
Serial.begin(9600);
switch(ledState) {
case PIN_LED_GOOD:
digitalWrite(PIN_LED_GOOD, LOW); // nach dem Tasterdruck auf der Grünen LED, geht sie wieder aus
score[playerId]++; // der Spieler der gedrückt hat bekommt einen Punkt
Serial.println(score[PLAYER_1]);
Serial.println(score[PLAYER_2]);
if (score[playerId] >= WINNING_SCORE) { // Wenn der Score größer gleich der Winning Score (10) ist, wird das Spiel beendet und er hat gewonnen
gameState = GAME_STATE_END;
lcd.clear();
for(byte i=0; i<10; i++) {
digitalWrite(pinLeds[playerId], HIGH); // Die LED auf der Seite des Spielers der gewonnen hat blinkt 5 mal
delay(250);
digitalWrite(pinLeds[playerId], LOW);
delay(250);
}
return;
}
break;
Serial.begin(9600);
Serial.begin(9600);
case PIN_LED_BAD:
digitalWrite(PIN_LED_BAD, LOW); // Wenn ein Spieler auf den Taster drückt wärend die Rote Lampe leuchtet, verliert er einen Punkt, 0 ist das minimum an Punkten
if (score[playerId] > 0) {
score[playerId]--;
Serial.println(score[PLAYER_1]);
Serial.println(score[PLAYER_2]);
}
break;
}
ledState = 0; // Rücksetzen des ledState auf 0
setNextLedChange(); // Springe in das Unterprogramm "setNextLedChange"
}