Ich probiere einen für das Display zu lange Text in Laufschift auszugeben, wenn eine Taste gedrückt wurde. Dies funktioniert einwandfrei, wenn ich es mit delay realisiere, jedoch nicht, wenn ich es mit millis() probiere.
Wenn die Taste lang gedrückt wird, erscheinen permanent o's, welche in Laufschift in der ersten Zeile ausgegeben werden. Wenn die Taste nur kurz gedrückt wird, erscheint für 1s der Text, wenn die Taste wieder kurz gedrückt wird, erscheint für 1s ein anderer Teil des Textes.
Das bedeutet, dass es prinzipiell passt, nur wird der eigentliche Text nur bei kurzem Tastendrücken richtig ausgegeben, jedoch nicht bei langem.
Hier der Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int anzahlZeilen = 2;
const int anzahlSpalten = 16;
const char* Nachricht = "Beispiel Nachricht, die absichtlich zu lang ist.";
const int nachrichtenLaenge = 48;
long OnTime = 200; // Millisekunden bis Display ON
long OffTime = 1000; // Millisekunden bis Display OFF
unsigned long previousMillis = 0;
int button = LOW;
void setup()
{
lcd.clear();
pinMode(6, INPUT);
Serial.begin(9600);
lcd.begin(anzahlSpalten, anzahlZeilen);
}
void loop()
{
static int nPosition = 0;
int i;
unsigned long currentMillis = millis();
button = digitalRead(6);
if((button == HIGH) && (currentMillis - previousMillis >= OnTime))
{
if(nPosition < (nachrichtenLaenge - anzahlSpalten))
{
for(i = 0; i < anzahlSpalten; i++)
{
lcd.setCursor(i, 0);
lcd.print(Nachricht[nPosition + i]);
}
}
else
{
int nChars = nachrichtenLaenge - nPosition;
for(i = 0; i < nChars; i++)
{
lcd.setCursor(i, 0);
lcd.print(Nachricht[nPosition + i]);
}
for(i = 0; i < (anzahlSpalten - nChars); i++)
{
lcd.setCursor(nChars + i, 0);
lcd.print(Nachricht[i]);
}
}
nPosition++;
if(nPosition >= nachrichtenLaenge)
{
nPosition = 0;
}
}
else if((button == LOW) && (currentMillis - previousMillis >= OffTime))
{
previousMillis = currentMillis;
lcd.clear();
}
}