Wert im Serial Monitor einlesen und mit dem LCD ausgeben

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"
}

fang mit einem Beispiel aus der LCD Library an die du installiert hast.
Erst wenn das funktioniert, intergriere es in deinen Sketch.

Evtl. musst du mit einem I2C Scanner zunächst testen, ob dein Display wirklich auf 0x27 ist.
Könnte auch au 0x3F sein (oder ganz was anderes).

was soll das tun?

diesen Byte brauchst du nicht?

Tippfehler?

Kopierfehler?

Nein.
Du versuchst im setup wiederholt ein byte zu lesen und gibst genau dieses Byte aus.

Mehr nicht.

Das hier:

ist Unsinn.
Das hier auch:

usw....
Was ist das? Von chatGpt?

gut, danke, aber da blinkender Kursor nirgendwo eingeschaltet ist, macht das Ausschalten keine Veränderung.

Der Cursor ist IMHO mit begin() eingeschaltet.
Und dreist wenn nicht - ausschalten einmal mehr ist kein Fehler.

Hallo flo_06

Herzlich Willkommen im Arduino Forum der Welt.

Mein Vorschlag:

Beginne mit einem einfachen LCD-Tutorial, um sich das Wissen darüber anzueignen.

das müsstest Du auf dem LCD ausgeben...also ohne "++"

Serial.read();

was soll das ausgeben?

Probier mal:

Serial.println("Player 1 Score: ");Serial.println(score[0]);
Serial.println("Player 2 Score: ");Serial.println(score[1]);

was wird ausgegeben wenn du das im sketch einfügst

Serial.print("Read Serial: ");Serial.println(Serial.read());

Serial.read

Ein Schema könnte auch noch Aufschulss geben

wäre auch meine Empfehlung

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.