zwei Millis Funktionen Kombinieren Probleme

Hey Leute,
ich würde gerne Programmieren, dass sich auf dem LCD Display alle 2 Sekunden der Text ändert.

Hierzu habe ich bereits einen Code Programmiert, welcher aber nicht funktioniert.
Ich komme Nie aus der ersten IF bedingung in die zweite IF bedingung.

Die Funktion ist eine Unterfunktion, welche in LOOP aufgerufen wird.

globale Variablen:
unsigned long zweisekunden = 0;
unsigned long viersekunden = 0;
boolean status1=true,status2=false;

void loop() {
Displaywechsel();
}

void Displaywechsel(){
zweisekunden = millis();
viersekunden = millis();
     
     if((millis() - zweisekunden < 2000) && (status1==true)) {              
         lcd.setCursor(0,3);                                                   
         lcd.print("                   ");
         lcd.setCursor(0,3);
         lcd.print(String1.substring(A,B));    
         viersekunden= millis();
         status2=false;
     }
     else {
       status2=true;      
     }
     
     if((millis() - viersekunden < 2000) && (status2==true)){
       lcd.setCursor(0,3);
       lcd.print("                   ");                                                
       lcd.setCursor(0,3);
       lcd.print(String2.substring(A,B));
       zweisekunden = millis();
       status1=false;   
                                                      
     }
     else {
       status1=true;
     
     }

}

Offensichtlich hab ich einen Gedankenfehler drin.
Über Hilfe wäre ich sehr dankbar.

Grüße

Bitte packe Deinen Sketch in code-Tags, der Button </> links oben.

Mir fehlt die Struktur

void setup() {
}
void loop() {
}

Der Denkfehler steckt wahrscheinlich hier: if((millis() - zweisekunden < 2000) müßte wohl sein: if((millis() - zweisekunden >= 2000)

Danke, hab die Struktur verändert.

Auch wenn ich mit >= arbeite funktioniert es nicht.

Sonst noch Ideen?

Ideen? Na klar!
Lösche mal diese Zeilen am Anfang von Displaywechsel():

zweisekunden = millis();
viersekunden = millis();

Hallo Miko;
versuch es mal mit den beiden Änderungen

if((millis() - zweisekunden < 2000) && (status1==true)) {
if((millis() - zweisekunden > 2000) && (status1==true)) {

if((millis() - viersekunden < 2000) && (status2==true)){
if((millis() - viersekunden > 4000) && (status2==true)){

Gruß
Ardubu

Der Standard geht so:

if (millis() - zweisekunden > 2000) {
   zweisekunden = millis();

   // hier das was alle 2 sek einmal drankommen soll 
}

Die beiden Zyklen ineinander zu verschachteln und die status - Variable macht alles nur verwirrend :wink:

michael_x:
Der Standard geht so:

if (millis() - zweisekunden > 2000) {

zweisekunden = millis();

// hier das was alle 2 sek einmal drankommen soll
}




Die beiden Zyklen ineinander zu verschachteln und die status - Variable macht alles nur verwirrend ;)

Ja wie die normale Funktioniert weiß ich zum Glück schon. Aber die Verschachtelung ist zwingend notwendig.

ardubu:
Hallo Miko;
versuch es mal mit den beiden Änderungen

if((millis() - zweisekunden < 2000) && (status1==true)) {
if((millis() - zweisekunden > 2000) && (status1==true)) {

if((millis() - viersekunden < 2000) && (status2==true)){
if((millis() - viersekunden > 4000) && (status2==true)){

Gruß
Ardubu

Wenn ich nur alles in >-Zeichen ändere komme ich niemals aus der ersten IF bedingung raus. da niemals das else aufgerufen werden kann.

#5 etwas ausführlicher:

if (millis() - zweisekunden >= 2000) {
   zweisekunden = millis();
   status=!status;
   if (status) {
     lcd.print(String1.substring(A,B));
   } else {
     lcd.print(String2.substring(A,B));
   }
}

agmue:
#5 etwas ausführlicher:

if (millis() - zweisekunden >= 2000) {

zweisekunden = millis();
  status=!status;
  if (status) {
    lcd.print(String1.substring(A,B));
  } else {
    lcd.print(String2.substring(A,B));
  }
}

Danke für die ausführlich Darstellung!
Nach kleinen Modifikationen passt es nun.
Leider enstehen Kleine Verzögerungen, da die Strings über ein Wlan Shield empfangen werden.
Ich denke das kann man aber auch nicht ändern. oder doch ? ^^

Ich denke das kann man aber auch nicht ändern. oder doch

Alles kann man ändern, die Frage ist, was du willst.

Was hat das ganze mit einem WLAN Shield zu tun?
Soll die Anzeige sich nach zwei Sekunden, oder wenn ein neuer String da ist, ändern?
Oder in beiden Fällen?

michael_x:

Ich denke das kann man aber auch nicht ändern. oder doch

Alles kann man ändern, die Frage ist, was du willst.

Was hat das ganze mit einem WLAN Shield zu tun?
Soll die Anzeige sich nach zwei Sekunden, oder wenn ein neuer String da ist, ändern?
Oder in beiden Fällen?

Die Anzeige ändert sich alle 2 Sekunden und wenn dann zwei neue Stings ankommen, wodurch auch immer, dann werden die neuen Angezeigt.
Problem es soll keine dauerhafte Verbindung zum Server bestehen, wodurch ein durchlauf zum abrufen der Strings etwa 7000 ms dauert.

ein durchlauf zum abrufen der Strings etwa 7000 ms dauert.

Ob das notwendigerweise innerhalb eines einzigen loop() Durchlaufs sein muss, würde ich erstmal in Frage stellen.