INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
delay-millis()-while-Sensorenabfrage
23.02.2020, 13:41
Beitrag #1
delay-millis()-while-Sensorenabfrage
Hallo zusammen,
möchte noch einmal das Thema millis() und while ansprechen.

Zur Steuerung der Modellbahn läuft bei mir ein längeres Programm.
Zur Abfrage meiner Sensoren habe ich den relevanten Teil einmal kopiert.

Code:
#include <Bounce2.h>
int ReedState = 0;
int lastButtonState = 0;
int verzögerung = 380;
unsigned long previousMillis = 0;
int counter = 0;
const int Reed = 12;
Bounce debouncer = Bounce();

void setup() {
pinMode(Reed, INPUT_PULLUP)
debouncer.attach(Reed);
debouncer.interval(2);
Serial.begin(9600);

void loop() {
  debouncer.update();

  ReedState = debouncer.read();
  if (ReedState != lastButtonState) {
    if (ReedState == HIGH) {
      counter ++;
      Serial.println(counter);
    }
    lastButtonState = ReedState;                           //  Oder
    unsigned long previousMillis = millis();             //   unsigned long previousMillis =millis();
    while (millis() - previousMillis < verzögerung);  //   if(millis() - previousMillis >verzögerung){
                                                                        //   previousMillis = millis()
                                                                        //   }  
   }
  if(counter== xx){
  // dann passiert das und das
}
}    // loop ende

Mit Hilfe von debounce werden die Sensoren abgefragt. Der counter wird jeweils weiter gezählt. Nach einer verzögerungszeit von 380 ms erfolgt eine Abfrage mit if.
Mit while funktioniert alles bestens. Habe nun anstatt while die millis() Funktion eingesetzt. Allerdings ohne Erfolg. Das Programm läuft nicht mehr wir gewohnt ab.
Hat jemand einen Tipp?

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2020, 13:55
Beitrag #2
RE: delay-millis()-while-Sensorenabfrage
(23.02.2020 13:41)RCudino schrieb:  
Code:
while (millis() - previousMillis < verzögerung);  //   if(millis() - previousMillis >verzögerung){
Da kannst Du auch millis weg lassen und gleich delay schreiben. Das macht auch nichts anderes. Nimmt er überhaupt den Variablennamen mit ö an?

Mit millis musst Du natürlich die Struktur Deines Programms ändern.
Code:
bool startet = false;
void loop() {
  uint32_t aktMillis = millis();
    debouncer.update();
    ReedState = debouncer.read();
    if (ReedState != lastButtonState) {
      if (ReedState == HIGH) {
        counter ++;
        Serial.println(counter);
        startet = true;
        previousMillis = aktMillis;  // <--- retriggern
      }
      lastButtonState = ReedState;                           //  Oder
    }
    if(startet && aktMillis  - previousMillis >= verzoegerung) {
      previousMillis = aktMillis ;
     // hier kammt das hin, was Du aller verzoegerung machen willst.
     startet = false;
  }
}

Da Deinem Code nicht anzusehen ist, wie er reagieren soll, ist das natürlich nur geschätzt.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2020, 14:06 (Dieser Beitrag wurde zuletzt bearbeitet: 23.02.2020 14:07 von MicroBahner.)
Beitrag #3
RE: delay-millis()-while-Sensorenabfrage
Hallo Norbert,
als Mobahner ist vielleicht dieses Tutorial was für dich. Da habe ich mal für 'Modellbahner' erklärt, wie man Zeitsteuerungen ohne delay() realisiert.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2020, 14:40
Beitrag #4
RE: delay-millis()-while-Sensorenabfrage
Hallo Tommy,
vielen Dank für den Input. Habe deinen Input in mein Programm eingepflegt .
Es reagiert leider auch , wie meine Änderung mit millis.
Ich glaube, es liegt vielleicht daran, dass nach der verzoegrungszeit nichts direktes passieren soll.

// hier kammt das hin, was Du aller verzoegerung machen willst.

Es erfolgen nur jeweils die if -Abfragen nach dem Status des counters.
Die Verzoegerungszeit ist wie beim delay eine Wartezeit von z.B. 380ms und dann erfolgen die diversen if - Abfragen

Hallo MicroBahner,
Vielen Dank. Schaue ich mir natürlich auch an. Habe auch schon viele codes mit millis() erfolgreich programmiert, aber diesmal ???

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2020, 15:17
Beitrag #5
RE: delay-millis()-while-Sensorenabfrage
Schreib/mal dir doch mal genau auf, was in welcher Reihenfolge passieren soll.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2020, 15:30
Beitrag #6
RE: delay-millis()-while-Sensorenabfrage
- Im Loop wird der Sensor - Eingang permanent abgefragt mit debounce
- Wurde ein High - Signal detektiert zählt der counter weiter
- Jetzt erfolgt die Wartezeit von 380ms
- Jetzt die if Abfrage, ob der counter z.B. "1" ist
- Wenn ja, dann stellt sich z.B. die Weiche von geradeaus auf abbiegen
oder ein Gleisabschnitt wird freigegeben( Lok fährt los) oder gesperrt ( Lok hält an)

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2020, 15:33
Beitrag #7
RE: delay-millis()-while-Sensorenabfrage
(23.02.2020 15:30)RCudino schrieb:  - Im Loop wird der Sensor - Eingang permanent abgefragt mit debounce
- Wurde ein High - Signal detektiert zählt der counter weiter
- Jetzt erfolgt die Wartezeit von 380ms
- Jetzt die if Abfrage, ob der counter z.B. "1" ist
- Wenn ja, dann stellt sich z.B. die Weiche von geradeaus auf abbiegen
oder ein Gleisabschnitt wird freigegeben( Lok fährt los) oder gesperrt ( Lok hält an)

Wenn der Arduino nichts anderes machen soll, wäre hier ein delay(380) durchaus sinnvoll. Wofür ist das Warten von 380 ms gut?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2020, 15:45
Beitrag #8
RE: delay-millis()-while-Sensorenabfrage
Ja, delay oder while ist auch unkritisch , da die gesamten Ablaufzeiten auch lang sind.
Ich wollte es nur mal mit millis() auch hinbekommen.
Die 380ms sind dazu gedacht, dass wenn der Sensor detektiert wurde die Lok noch ein wenig über den Sensor hinaus fährt. Erst dann wird das Gleis abgeschaltet .Erst dann wird beim Freischalten diese Gleisabschnittes der Sensor wieder eindeutig erkannt, der counter zählt weiter und eine andere If Abfrage wird wahr ( z.B. Weichenstellung).
Ich habe meine komplette Ablaufsteuerung mit dem Weiterzählen des counters aufgebaut. Daher eindeutige Erkennung des Sensors ist notwendig. Dies funktioniert auch gut.

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Servos ohne delay juergen001 5 99 Gestern 21:03
Letzter Beitrag: Tommy56
  Probleme mit millis(); timer basteldin 3 352 01.09.2020 19:04
Letzter Beitrag: basteldin
  millis Schleife bleibt hängen Cubicany 10 1.048 28.06.2020 18:39
Letzter Beitrag: Tommy56
  Fehler bei delay über 32767 Kleingärtner 5 653 07.05.2020 18:51
Letzter Beitrag: Kleingärtner
  Hilfe Millis treibt mich in den Wahnsinn Nefrett 17 1.714 04.05.2020 20:53
Letzter Beitrag: Tommy56
  Wie bekomme ich DIESES Delay weg. DO3GE 9 1.029 18.04.2020 12:44
Letzter Beitrag: Fips
  Denkanstoß gesucht - in Schrittkette delay() ersetzen SpaghettiCode 19 1.670 31.03.2020 21:31
Letzter Beitrag: MicroBahner
  for-schleife, delay, millis, interrupt Harry 8 1.101 31.03.2020 21:02
Letzter Beitrag: Harry
  Scrollpausen im Oled Display ohne Delay Alter Fritz 7 986 25.01.2020 13:22
Letzter Beitrag: Alter Fritz
  Sich wiederholende Intervalle ohne Delay Verzweiflung RobertLeRopp 52 4.787 17.12.2019 21:30
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste