- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: NodeMCU 8662: CountDown erstellen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2018
    Beiträge
    14

    NodeMCU 8662: CountDown erstellen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo. Ich mal wieder
    Mein erstes Projekt ist nun erledigt und nun geht's gleich ans zweite:
    Ich möchte für unseren Bogensportverein eine Schießtimer bauen.
    Als Ausgabe hab ich eine LED Matrix.
    Steuerung soll über einen ESP8266WebServer erfolgen.
    Ziel ist das der Client einen Start Request schickt und dann der Countdown 20 Sekunden herunterzählt. Das ist die Vorbereitungszeit.
    Dann zählt er 120 Sekunden herunter. Schießzeit.
    20 Sekunden vor ende der Schießzeit wird der Hintergrund des Displays GELB um anzuzeigen das es gleich vorbei ist.
    Dann wird der Display wieder rot. Schießzeit zu ende.


    Alles soweit kein Problem aber wie gehe ich mit der korrekten zeit um?
    delay(1000) ist unschön und man kann dann ja auch die Verarbeitung nicht abbrechen.
    In Java gibt's das Object Timer() und TimerTask()

    gibt's sowas auch hier?

    Vielen Dank und Viele Grüße
    Michael

  2. #2
    HaWe
    Gast
    hallo,
    such mal nach dem Beispiel (Arduino example) "Blink without delay()"

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2018
    Beiträge
    14
    Hallo.
    hab ich versucht aber das läuft ja dann immer in einer endlosschleife und ich habe keine Möglichkeit die schleife zu unterbrechen. Das ganze müsste in einem Thread laufen. Gibt es sowas?

    Sorry.. Hier mein Code:
    Code:
    void runTime(int mytime, uint16_t myColor){
      unsigned long previousMillis = 0;  
      unsigned long actTime = mytime;  
      setBGColor(myColor); 
      doRun = true;
      while(doRun){
        unsigned long currentMillis = millis();
        if (currentMillis - previousMillis >= interval) {
          previousMillis = currentMillis;
          // do something
          if(actTime >= 0){
            displayTime(String(actTime));
            actTime--;
          } else {
            doRun = false;
          }  
        }
      }
    }

  4. #4
    HaWe
    Gast
    nein, auf dem ESP8266 gibt es von offizieller Seite keine threads für multithreading (ist wohl auch nicht vorgesehen), bis auf manche experimentelle Versuche einzelner Privatleute, ansonsten nur multithreading auf den normalen Arduinos (z.B. über Scheduler libs).

    Ich könnte mir aber vorstellen, dass man aus den timer-Schleifen ausbrechen könnte, per semaphor

    if(semaphor==x) return ()

    Du springst andernfalls von loop aus die timer Funktion wiederholt an, lässt sie checken, und dann einen Wert zurückgeben, den du weiter verarbeitest (oder machst alles in loop).
    Geändert von HaWe (04.12.2018 um 16:17 Uhr)

  5. #5
    HaWe
    Gast
    so in dieser Art:

    Code:
    uint32_t starttime;
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(115200);
      delay(3000);
      Serial.println("Serial started");
    
      starttime=millis();  // start countdown
    }
    
    
    void setBGColor(uint32_t myColor){ }  // eigene Funktion verwenden!
    
    
    void setcolor(uint32_t timesec) {
      uint32_t myColor2, myColor1, myColor0; // Color-Werte definieren!
      
      if(timesec>20) {
        setBGColor(myColor2); 
        Serial.println("myColor2");
      }
      else
      if(timesec<=5 && timesec>=0 ) {
        setBGColor(myColor0);
        Serial.println("myColor0");
      }
      else
      if(timesec<=20 && timesec>0) {
        setBGColor(myColor0);
        Serial.println("myColor1");
      }
    
    }
    
    uint32_t countdowntime=20; // sec countdown;
    
    void loop() {
      static int32_t passedsec, oldpassedsec=0, dtimesec=-1;
         
      passedsec= (millis()-starttime)/1000;
      
      if(oldpassedsec!=passedsec  && passedsec<=countdowntime) {
         dtimesec=countdowntime-passedsec;
         Serial.println(dtimesec);
         setcolor(dtimesec);
         oldpassedsec=passedsec;     
         if(dtimesec==0 && countdowntime==20) {
           countdowntime=120;     
           starttime=millis();
         }
      }
      
    
      // *SNIP*
      // do anything important
      // *SNIP*
      
      delay(1);  // yield
    
    }
    Geändert von HaWe (04.12.2018 um 16:15 Uhr)

  6. #6
    HaWe
    Gast
    hast du den Code mal getestet?

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2018
    Beiträge
    14
    Hallo,
    Vielen Dank für eure Hilfe.
    Ich habe es nun zum laufen gebracht.
    Vielen Dank an HaWe.

    Jetzt ist es doch etwas grösser geworden.. Jaja.. mit dem essen steigt der Appetit.

    Viele grüße
    Michael

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    In Java gibt's das Object Timer() und TimerTask()
    Sowas wie timer() in anderen Sprachen gibt es auch auf den ATmegas. Dazu muss aber der Timer programmiert werden, ist der dann abgelaufen, kann er einen Interrupt auslösen, so dass man also damit eine Funktion verbinden kann. Soweit meine laienhafte Beschreibung, ich habe das in anderen Zusammenhängen nebenbei mal gesehen, dass das möglich ist.

    MfG

  9. #9
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Sowas wie timer() in anderen Sprachen gibt es auch auf den ATmegas. Dazu muss aber der Timer programmiert werden, ist der dann abgelaufen, kann er einen Interrupt auslösen, so dass man also damit eine Funktion verbinden kann. Soweit meine laienhafte Beschreibung, ich habe das in anderen Zusammenhängen nebenbei mal gesehen, dass das möglich ist.

    MfG
    ok, ATMegas...
    aber nur aus Interesse:
    wie funktioniert das auf den hier im Projekt verwendeten nodeMCUs mit den 2 oder 3 benötigten Sekunden-Timern?

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Auch dort wird es Timer geben, die sich programmieren lassen, davon geh ich aus. Weil das nodeMCU komp. zu ATmega sein soll.

    Nachgeschaut: Benutzt werden kann der Timer#1, Auflösung in Microsekunden, der einen Interrupt auslösen kann.
    Allerdings weiß ich nicht, wie es beim 8662 ist.

    Für den 8266 kann man wohl die Ticker.h verwenden: https://github.com/esp8266/Arduino/t...braries/Ticker

    MfG
    Geändert von Moppi (13.12.2018 um 11:56 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. nodeMCU zu nodeMCU: keine Kommunikations-Verbindung mehr nach wenigen Minuten
    Von HaWe im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 0
    Letzter Beitrag: 02.10.2017, 15:01
  2. Platinenlayout Platine mit Countdown
    Von Matishi im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 5
    Letzter Beitrag: 10.09.2015, 20:28
  3. Countdown für Platinenbelichter =P~
    Von Inkoknito im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 10.12.2008, 09:02
  4. Countdown
    Von Theux im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 14
    Letzter Beitrag: 06.10.2008, 13:33
  5. Countdown unter Bascom
    Von Dj_Beat im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 24.11.2007, 12:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests