Millis anstatt delay

Guten Tag,
ich beschäftige mich seit ca. 5000000 tagen mit millis aber es klappt einfach nicht :confused:
könnte ich mit der if abfrage so den delay erstzen.. Ich will das er nur in einem Interval von 500 überprüft was für eine Position der Joystick hat

int Vorherige;
int current;

int VorherigeX;
int currentX;
  if (Vorherige - current <= 500) {
    if (StateX > 640) {
      menu++;
      updateMenu();
      Serial.println("Y - Button");
      delay(500); //Diesen Delay ersetzen
    }
  }
  if (VorherigeX - currentX <= 500) {
    if (StateX < 50) {
      menu--;
      updateMenu();
      VorherigeX = millis();
    }
  }

Alles was mit millis zu tun hat, sollte unsigned long sein.
Der Ablauf ist immer der Gleiche:

unsigned long vorher;
unsigned long intervall = 5000;

...
unsigned long aktuell = millis();
if (aktuell - vorher >= intervall) {
   vorher = aktuell;
   // Tu was
}

Schau Dir BlinkWithoutDelay in der IDE an und suche die Nachtwächtererklärung.

Gruß Tommy

Edit: Bei der Beschäftigungsdauer von

5000000 tagen

kannst Du es ja nicht begreifen, da Du schon lange tot bist. :wink:

So würde das dann in der Loop aussehen wenn ich kein denkfehler habe?

  unsigned long aktuell = millis();
  if (aktuell - current >= intervall) {
    if (StateX > 640) {
      Vorherige = aktuell;
      menu++;
      updateMenu();
    }
  }
unsigned long aktuellX = millis();
  if (aktuellX - currentX >= intervallX) {
    if (StateX < 50) {
      VorherigeX = aktuellX;
      menu--;
      updateMenu();
    }
  }

Achtung: vorherige heißt bei Dir current!

Nicht einfach nur kopieren, sondern verstehen.

Gruß Tommy

Ja war mein Fehler.

Aber ein anderes Problem.

Ich hab den Code jetzt soweit ausgebessert aber es funktioniert kein LC-Display.

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 21);

const int PinX = A8;

int StateX;
int menu = 1;

unsigned long Vorherige;
unsigned long VorherigeX;
unsigned long VorherigeY;
unsigned long intervall = 500;
unsigned long intervallX = 500;



void setup() {
  pinMode(PinX, INPUT);
 // pinMode(Pinb, INPUT);
  lcd.begin();
  Serial.begin(9600);
}

void loop() {
    unsigned long aktuellY = millis();
  Serial.println(StateX);
  if(aktuellY-VorherigeY >= intervallX){
  StateX = analogRead(PinX);
    Serial.println(menu);
    VorherigeY = aktuellY;
  }

  unsigned long aktuell = millis();
    if (aktuell - Vorherige >= intervall) {
    if (StateX > 840) {
      Vorherige = aktuell;
      menu++;
      updateMenu();
   }
  }
unsigned long aktuellX = millis();
  if (aktuellX - VorherigeX >= intervall) {
    if (StateX < 50) {
     VorherigeX = aktuellX;
      menu--;
      updateMenu();
  }
}
}
void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      Serial.println("Update Menu 1");
      lcd.clear();
      lcd.print(">MenuItem1");
      lcd.setCursor(0, 1);
      lcd.print(" MenuItem2");
      break;
    case 2:
      Serial.println("Update Menu 2");
      lcd.clear();
      lcd.print(" MenuItem1");
      lcd.setCursor(0, 1);
      lcd.print(">MenuItem2");
      break;
    case 3:
      Serial.println("Update Menu 3");
      lcd.clear();
      lcd.print(">MenuItem3");
      lcd.setCursor(0, 1);
      lcd.print(" MenuItem4");
      break;
    case 4:
      Serial.println("Update Menu 4");
      lcd.clear();
      lcd.print(" MenuItem3");
      lcd.setCursor(0, 1);
      lcd.print(">MenuItem4");
      break;
    case 5:
      menu = 4;
      break;

  }




}

Warum startest du eigentlich immer neue Probleme ohne die alten abzuarbeiten ?
Hier ist es normal, dass man alte Threads auch beantwortet bzw. mal mit Ergebnissen abschließt.

es funktioniert kein LC-Display

Was meinst du damit?
Was schreibst du auf Serial und was zeigt das LCD an?
Und was hat das mit millis() zu tun? Wenn "nichts", mach einen neuen Thread auf.

Ich wurde oben darauf hingewiesen das ich einen Thread erst abschließen soll..
Das hat damit zu tun weil das das gleich projekt ist und ich glaube das hier der Fehler in millis liegt

Bin mir aber nicht sicher..

Was meinst du mit "Was schreibst du auf Serial"

Mein LC-D zeigt nur die background an.. Heist nur die Balken
Ich habe gerade an das Display hinten gefasst und habe mich sehr verbrannt..
Es wird an manchen stellen auf der Rückseite Extrem heiß

Dominik1313:
Ich wurde oben darauf hingewiesen das ich einen Thread erst abschließen soll..
Das hat damit zu tun weil das das gleich projekt ist und ich glaube das hier der Fehler in millis liegt

Bin mir aber nicht sicher..

Was meinst du mit "Was schreibst du auf Serial"

Mein LC-D zeigt nur die background an.. Heist nur die Balken
Ich habe gerade an das Display hinten gefasst und habe mich sehr verbrannt..
Es wird an manchen stellen auf der Rückseite Extrem heiß

Hallo,

da kannst Du dir sicher sein, das liegt zu 100% nicht an den millis() und auch nicht an enum :slight_smile:

Gruß Heinz

Dominik1313:
Ich wurde oben darauf hingewiesen das ich einen Thread erst abschließen soll..
Das hat damit zu tun weil das das gleich projekt ist und ich glaube das hier der Fehler in millis liegt

Bin mir aber nicht sicher..

Was meinst du mit "Was schreibst du auf Serial"

Mein LC-D zeigt nur die background an.. Heist nur die Balken
Ich habe gerade an das Display hinten gefasst und habe mich sehr verbrannt..
Es wird an manchen stellen auf der Rückseite Extrem heiß

Das gilt nicht nur für diesen, sondern auch für die anderen, wo noch auf Antworten gewartet wird

Und wenn dein Display heiß wird, machst du einen Fehler.
Evtl. ist das schon defekt.
Welche Spannung hast du da dran ?

5V vom arduino.
Es hat ein tag zuvor noch funktionier..
Ich glaube es liegt an dem Code aber ich finde den Fehler nicht.

Dominik1313:
5V vom arduino.
Es hat ein tag zuvor noch funktionier..
Ich glaube es liegt an dem Code aber ich finde den Fehler nicht.

Das dein Display heiß wird, liegt sicher nicht am Sketch.

Und warum geht es dann nicht?

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 21);


void setup() {
 
  lcd.begin();
  lcd.print(" T E S T "); 
}

void loop() { }

Was macht dein Display bei diesem Sketch ?

Wo möchtest du die Antwort haben ?

Hier oder im Thread "LCD-Display" ?

Bitte hier im Thread..
Ich habe den Test sketch geladen und es funktioniert..
Bloß mit meinem Code nicht.
Danke für eure Hilfe <3

Dominik1313:
Bitte hier im Thread..
Ich habe den Test sketch geladen und es funktioniert..
Bloß mit meinem Code nicht.
Danke für eure Hilfe <3

Dann poste im anderen Thread einen Link auf diesen Thread, dass es hier weiter geht und alle wissen Bescheid.

Und wird das Display noch heiß ?

Nein wird nichtmehr heiß

Problem gelöst. ich habe Vergessen im setup teil update Menu aufzurufen..

Nächstes problem:

Der Joystick mach probleme. Er sprint immer zwischen einem wert von 0 - 500 hin und her.
Wenn ich den Stecker aus A8 = Joystick X ziehe kommt trzdm ein wert von 0 - 300
Wie kann das sein?

dadurch das ständig ein anderer Wert kommt springt er auch dementsprechend zwischen den Menüs hin und her?

Neues Problem = Neuer Thread.
Und den aktuellen Sketch posten.

Der hier ist dann abgeschlossen.
Hast du im anderen Thread auf diesen verlinkt ?
Wenn nein mach es noch und schreibe gleich, dass es erledigt ist.