Countdown funktioniert wird aber nicht ausgegeben auf LCD

Hallo Leute,

ich habe einen ganz einfachen Countdown programmiert.
Dieser funktioniert soweit gut.

Leider habe ich Tomaten auf den Augen und finde nicht den Fehler der LCD ausgabe.
Auf dem Seriellen Monitor wird der Countdown ordentlich ausgegeben und zählt fleißig von 30 auf 1 runter.

#include <LiquidCrystal.h>
#include "LCDKeypad.h"

#include <LiquidCrystal.h>
#include "LCDKeypad.h"

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte CountDownZ = 30;  
char Textausgabe[16];

void CountDown()
{
  while (CountDownZ > 0)
  {
  lcd.clear();
  lcd.setCursor( 0, 0 );
  lcd.write( "Daten \365bernehmen" ); 
  lcd.setCursor( 0, 1 );
  lcd.write( "in    Sek" ); 
  lcd.setCursor( 3, 1 );
  //sprintf( Textausgabe(CountDownZ)); 
  lcd.write( CountDownZ );
  Serial.begin(38400);
  Serial.println(CountDownZ);

  delay(1000);
  
  CountDownZ = CountDownZ - 1;
  }

}

void setup() 
{
  lcd.begin(16, 2);
}

void loop() 
{
  CountDown();
}

Auf dem LCD wird der Text auch ordentlich ausgegeben.

Nur die Zahlen werden fehlinterpretiert.
Zahl 30-16 gar keine sichtbare Textausgabe
Zahl 15 wird als 4 horizontale Striche dargestellt
Zahl 1 als Pfeil nach oben :confused:

Wirkt wie eine falsche Ascii Darstellung???
Wer hat einen tip für mich bitte?

Du gibst ja auch keinen ASCII-Text aus, sondern einen Bytewert. Der auskommentierte sprintf-Ansatz war schon ein richtiger Weg, aber falsch umgesetzt.

Gruß Tommy

Ersetze

 lcd.write( CountDownZ );

durch

 lcd.print( CountDownZ );

Whandall:

 lcd.print( CountDownZ );

Perfekt "print" war es, man ej bin ich **** :wink:

Tommy56:
Der auskommentierte sprintf-Ansatz war schon ein richtiger Weg, aber falsch umgesetzt.
Gruß Tommy

sprintf( Textausgabe, CountDownZ);

hat genau so wenig bewirkt.

Danke Trotzdem für eine schnelle Antwort von Euch

Da fehlt ja auch die Formatangabe.

Gruß Tommy

Ich habe noch mal über das Eingangsmachwerk geschaut und mich gegruselt.

Eigentlich wollte ich nur kurz das sprintf hinschreiben weil dess Dokumentation ja zugegebenerweise etwas versteckt ist,
aber ich denke für diesen Fall ist sprintf ein echter Overkill.

Ich würde das so schreiben:

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

byte countDown = 30;
unsigned long lastCount;

void setup() {
  Serial.begin(250000);
  lcd.begin(16, 2);
  lcdKonstanterTeil();
  lcdXSekunden(countDown);
  Serial.println(countDown);
}

void loop() {
  unsigned long topLoop = millis();
  if (countDown && topLoop - lastCount >= 1000)   {
    lcdXSekunden(--countDown);
    Serial.println(countDown);
    lastCount = topLoop;
  }
}

void lcdKonstanterTeil() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("Daten \365bernehmen"));
  lcd.setCursor(0, 1);
  lcd.print(F("in"));
}

void lcdXSekunden(byte anzahl) {
  lcd.setCursor(3, 1);
  lcd.print(anzahl);
  lcd.print(F(" Sekunden  "));
}