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
"Bobbycar LED" - 2 Fragen (Mehrere Taster: Unterprog. Abbrechen / Einfacher "Code" ?)
07.03.2020, 13:58
Beitrag #9
RE: "Bobbycar LED" - 2 Fragen
(07.03.2020 09:44)KlausGuenther schrieb:  Nur jetzt wäre ja Denkbar, z.B. die Funktion für das Warnblinken sehr sehr lange zu machen und aber die Möglichkeit zu haben, dann durch einen Tastendruck in eine andere Funktion zu wechseln.

Hi KlausGuenter,

mal so von Anfänger zu Anfänger - du verstehst anscheinend noch nicht, wie ein ESP(&co) arbeitet.
Das sind sehr schnelle und dumme yC. Die Intelligenz sitzt vor dem Monitor.

Wenn du einen Sketch schreibst wird der von Anfang bis Ende abgearbeitet.
Oben deklarierst du was alles benutzt wird.
Der Block "void setup() " wird einmal beim Start abgearbeitet.
Der Block "void loop" wird danach immer wieder im Kreislauf abgearbeitet.
Böse Falle: delay(1000) = im Klartext "stell dich(ESP) für 1 sec tot!


Du als Programmierer must jetzt dem ESP "Intelligenz" bei bringen.
Wenn du einen Taster deklariert & initialisiert hast - dann kannst du
in loop die Abfrage "Taster gedrückt" benutzen um einen neuen Block z.B. "void taster1gedrueckt()" anzuspringen. Dieser Block wird dann abgearbeitet, zum Punkt des Absprungs zurückgekehrt und mit der nächsten Codezeile weiter gemacht.

Zu "Böse Falle": wenn du Signale verarbeitest, dann stell dir vor am Ende von void loop() steht delay(10000) = spiel 10 sec tot.
Wenn in dieser Zeit ein Signal (Taster?) herein bekommst dann merkt der ESP das überhaupt nicht!
- Anfang delay(10000)
- nach 0,5 sec Signal "Taster gedrückt"
- nach 2,8 sec Signal "Taster los gelassen"
- nach 10 sec macht er mit der nächsten Anweisung weiter

Um programmieren zu können musst du schon dein menschliches "was will ich" in computerisch übersetzen können. Denk dran "dumm aber schnell".

Diesen Text könnte man evtl. als "anmaßend" verstehen.
Ist aber garantiert nicht so gemeint!
Ich hoffe das bringt dir ein bisschen Verständnis WIE ein ESP(&co) arbeitet.

ESP32 Anfänger mit Migrations-Hintergrund (komme von RasPi & Python) Cool
Gruß aus Franken
Dietmar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.03.2020, 21:30
Beitrag #10
RE: "Bobbycar LED" - 2 Fragen
(07.03.2020 13:58)db91595 schrieb:  Diesen Text könnte man evtl. als "anmaßend" verstehen.
Ist aber garantiert nicht so gemeint!
Ich hoffe das bringt dir ein bisschen Verständnis WIE ein ESP(&co) arbeitet.

Doch, habe ich alles genau so verstanden, Du nur offensichtlicht nicht wo mein Problem liegt.
Mir stellen sich gerade als Anfänger nur sehr sehr viele Fragen, aber das Netzt ist mal wie so oft keine schnell einfache Hilfe sondern das gegenteil.

Nachdem ich das Nachtwächter bespiel mal einfach so just for fun durchgearbeitet habe und die LED´s hier munter vor sich hin beblinkt haben, stehe ich nach wie vor vor dem Problem, dass ich zum Beispiel einen Sketch A schreiben kann, bei dem die LED´s langsam blinken (in Rot) und einen Sketch bei bei dem dann alles schnell in Blau blinkt. Der Loop läuft auch anstandslos durch, wenn also eine Blinksequenz durchgelaufen ist, kann ich anstandslos eine andere starten. Nur halt nicht von der einen in die andere springen. Und das mit OHNE delay(). Es scheint also noch andere Dinge zu geben, die verhindern, dass man mal eben so auf einen Tasterdruck reagieren kann obwohl es noch "blinkt".

Und by the way, der Text ist anmaßend.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.03.2020, 22:03 (Dieser Beitrag wurde zuletzt bearbeitet: 10.03.2020 22:04 von Tommy56.)
Beitrag #11
RE: "Bobbycar LED" - 2 Fragen
Wenn Du die Hinweise von db91595 schon als anmaßend empfindest, mag ich Dir ja fast keine Hinweise mehr geben.
Ich versuche es mal trotzdem, wenn es Dir nicht gefällt, kann ich es auch nicht ändern.

Dein Ansatz "Eine Funktion auf Tastendruck zu beenden" ist grundlegend falsch.

Jede Deiner Funktion muss gleich am Anfang prüfen, ob sie etwas zu tun hat. Wenn nicht zurückkehren.
Wenn ja dann schnell ohne irgendwelche Blockierungen die Aktion durchführen (z.B. LED umschalten) und raus.
Damit kann immer im loop auf Eingaben reagiert werden, weil der loop im Millisekundenabstand immer wieder abläuft.
Das ist die Basis, in die Du umdenken musst.

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
10.03.2020, 22:16 (Dieser Beitrag wurde zuletzt bearbeitet: 10.03.2020 22:20 von db91595.)
Beitrag #12
RE: "Bobbycar LED" - 2 Fragen
Danke Tommy, du warst (wieder mal) schneller.

(10.03.2020 21:30)KlausGuenther schrieb:  Mir stellen sich gerade als Anfänger nur sehr sehr viele Fragen, aber das Netzt ist mal wie so oft keine schnell einfache Hilfe sondern das gegenteil.

Dazu verweise ich auf die Signatur von Tommy.
Das ist NUR ein Spruch - aber absolut treffend.

Edit: JEDER, der hier Antworten auf Fragen gibt - macht das unentgeltlich und freiwillig.

ESP32 Anfänger mit Migrations-Hintergrund (komme von RasPi & Python) Cool
Gruß aus Franken
Dietmar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.03.2020, 13:57
Beitrag #13
RE: "Bobbycar LED" - 2 Fragen
(10.03.2020 22:16)db91595 schrieb:  Dazu verweise ich auf die Signatur von Tommy.
Das ist NUR ein Spruch - aber absolut treffend.

Edit: JEDER, der hier Antworten auf Fragen gibt - macht das unentgeltlich und freiwillig.

Ich habe mich gefragt ob ich darauf Antworten möchte. Das Zitat ist meiner Meinung nach so falsch das nicht mal das gegenteil stimmt.


hotsystems hat mich letzten Ende auf die richtige Spur gebracht, dazu herzlichen Dank! Es läuft!
Sollte darüber hinaus jemand noch Gedanken teilen möchte wie man Dinge vereinfachen kann...ich baue das gerne ein und stelle den Sketch dann noch mal ein.

Ich habe jetzt noch nicht alles durchprogrammiert, aber Lichthupe, Wanrblinklicht und Blaulicht funktionieren, damit sollte jeder eine Basis haben, die erst mal für jeden LED/Streifen/Platine funktioniert. Evtl. muss man hier und da noch Anzahl der LED´s anpassen, aber das sollte ja kein Thema sein. Der sketch schaltet also erst mal Licht ein (Vorne Weiss, hinten rot), ermöglicht eine Lichthupe, Warnblinklicht (alle Orange) und Blaulicht (alle Blau). Das ganze auf Basis der ClickButton.h und Adafruit_Neopixel.h Bibliothek. Verwendet habe ich zur Steuerung einen nodeMCU ESP32, 2 Stück Adafruit NeoPixel Jewel RGBW und 2 Stück RGB.
Man kommt also vom "Licht" in den Warnblinkmodus oder Blaulicht oder quer durcheinander, wie man mag.

Code:
#include "ClickButton.h"
#include <Adafruit_NeoPixel.h>

#define PIN_Strip_a 16              //Strip Vorne Links
#define PIN_Strip_b 17              //Strip Vorne Rechts
#define PIN_Strip_c 19              //Strip Hinten Links
#define PIN_Strip_d 18              //Strip Hinten Rechts
#define NUMPIXEL_a 7
#define NUMPIXEL_b 7
#define NUMPIXEL_c 7
#define NUMPIXEL_d 7


const int buttonPin1 = 26;  //Lichthorn
const int buttonPin2 = 25;  //Blinker Links
const int buttonPin3 = 33;  //Blinker Rechts
const int buttonPin4 = 32;  //Warnblinklicht
unsigned long previousMillis = 0;
const long interval = 500;
const long intervalbl = 250;
int ledState = LOW;
int wblState = LOW; //Warnblinklicht
int blState = LOW;  //Blaulicht

ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP);  //Licht/Lichthupe
ClickButton button2(buttonPin2, LOW, CLICKBTN_PULLUP);  //Blinker Links
ClickButton button3(buttonPin3, LOW, CLICKBTN_PULLUP);  //Blinker Rechts
ClickButton button4(buttonPin4, LOW, CLICKBTN_PULLUP);  //Warnblinklicht

Adafruit_NeoPixel strip_a = Adafruit_NeoPixel(NUMPIXEL_a, PIN_Strip_a, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip_b = Adafruit_NeoPixel(NUMPIXEL_b, PIN_Strip_b, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip_c = Adafruit_NeoPixel(NUMPIXEL_c, PIN_Strip_c, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip_d = Adafruit_NeoPixel(NUMPIXEL_d, PIN_Strip_d, NEO_GRB + NEO_KHZ800);


//Farben Strips Vorne
uint32_t blue_a = strip_a.Color(0, 0, 255, 0 );  
uint32_t orange_a = strip_a.Color(255, 120, 0, 0);
uint32_t white_a = strip_a.Color(0, 0, 0, 255);
uint32_t off_a = strip_a.Color(0, 0, 0, 0);

uint32_t blue_b = strip_b.Color(0, 0, 255, 0 );  
uint32_t orange_b = strip_b.Color(255, 120, 0, 0);
uint32_t white_b = strip_b.Color(0, 0, 0, 255);
uint32_t off_b = strip_b.Color(0, 0, 0, 0);

//Farben Strip Hinten
uint32_t blue_c = strip_c.Color(0, 0, 255);
uint32_t red_c = strip_c.Color(255, 0, 0);  
uint32_t orange_c = strip_c.Color(255, 120, 0);
uint32_t off_c = strip_c.Color(0, 0, 0);

uint32_t blue_d = strip_d.Color(0, 0, 255);
uint32_t red_d = strip_d.Color(255, 0, 0);  
uint32_t orange_d = strip_d.Color(255, 120, 0);
uint32_t off_d = strip_d.Color(0, 0, 0);
    
void setup()
{

Serial.begin(9600);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(buttonPin4, INPUT_PULLUP);
  strip_a.begin();
  strip_b.begin();
  strip_c.begin();
  strip_d.begin();
  strip_a.show();      
  strip_b.show();
  strip_c.show();      
  strip_d.show();
  button1.debounceTime   = 100;  // Debounce timer in ms
  button1.multiclickTime = 250;  // Time limit for multi clicks
  button1.longClickTime  = 2000; // time until "held-down clicks" register
  button2.debounceTime   = 100;  // Debounce timer in ms
  button2.multiclickTime = 250;  // Time limit for multi clicks
  button2.longClickTime  = 2000; // time until "held-down clicks" register
  button3.debounceTime   = 100;  // Debounce timer in ms
  button3.multiclickTime = 250;  // Time limit for multi clicks
  button3.longClickTime  = 2000; // time until "held-down clicks" register
  button4.debounceTime   = 100;  // Debounce timer in ms
  button4.multiclickTime = 250;  // Time limit for multi clicks
  button4.longClickTime  = 2000; // time until "held-down clicks" register
  Licht();
}


void loop() {
unsigned long currentMillis = millis();

  button1.Update();
    if(button1.clicks == 1){
      Serial.println("Taster 1 - 1 mal gedrückt");
      Lichthupe();
      }
   else if(button1.clicks == 2 ) {  
      Serial.println("Taster 1 - 2 mal gedrückt");
      Licht();  
      }
  else if(button1.clicks == 3 ) {  
      Serial.println("Taster 1 - 3 mal gedrückt");
      Licht();
      }
    
  button2.Update();
    if(button2.clicks == 1){
      Serial.println("Taster 2 - 1 mal gedrückt");
      Licht();      
      }
   else if(button2.clicks == 2 ) {  
      Serial.println("Taster 2 - 2 mal gedrückt");
      Licht();  
      }

  button3.Update();
    if(button3.clicks == 1){
      Serial.println("Taster 3 - 1 mal gedrückt");
      }
   else if(button3.clicks == 2 ) {  
      Serial.println("Taster 3 - 2 mal gedrückt");
      Licht();  
      }

  button4.Update();
    if(button4.clicks == 1){
      Serial.println("Taster 4 - 1 mal gedrückt");
      if (wblState == LOW){
      wblState = HIGH;
      blState = LOW;
      }
      else {
      wblState = LOW;
      Licht();
      }
      }
      

   else if(button4.clicks == 2 ) {  
      Serial.println("Taster 4 - 2 mal gedrückt");
      if (blState == LOW){
      blState = HIGH;
      wblState = LOW;
      }
      else {
      blState = LOW;
      Licht();
      }
      
      }

//WARNBLINKLICHT

    if ((currentMillis - previousMillis >= interval)&&(wblState == HIGH)) {
      // save the last time you blinked the LED
      previousMillis = currentMillis;
      // if the LED is off turn it on and vice-versa:
      if (ledState == LOW) {
      ledState = HIGH;
      strip_a.fill(orange_a, 0, 7);
      strip_b.fill(orange_b, 0, 7);
      strip_c.fill(orange_c, 0, 7);
      strip_d.fill(orange_d, 0, 7);
      strip_a.setBrightness(180);
      strip_b.setBrightness(180);
      strip_c.setBrightness(180);
      strip_d.setBrightness(180);
      strip_a.show();    
      strip_b.show();
      strip_c.show();    
      strip_d.show();
      }
      else {
      ledState = LOW;
      strip_a.fill(off_a, 0, 7);
      strip_b.fill(off_b, 0, 7);
      strip_c.fill(off_c, 0, 7);
      strip_d.fill(off_d, 0, 7);
      strip_a.show();    
      strip_b.show();
      strip_c.show();    
      strip_d.show();
      
      }
      }

//Blaulicht

    if ((currentMillis - previousMillis >= intervalbl)&&(blState == HIGH)) {
      // save the last time you blinked the LED
      previousMillis = currentMillis;
      // if the LED is off turn it on and vice-versa:
      if (ledState == LOW) {
      ledState = HIGH;
      strip_a.fill(blue_a, 0, 7);
      strip_b.fill(blue_b, 0, 7);
      strip_c.fill(blue_c, 0, 7);
      strip_d.fill(blue_d, 0, 7);
      strip_a.setBrightness(255);
      strip_b.setBrightness(255);
      strip_c.setBrightness(255);
      strip_d.setBrightness(255);
      strip_a.show();    
      strip_b.show();
      strip_c.show();    
      strip_d.show();
      }
      else {
      ledState = LOW;
      strip_a.fill(off_a, 0, 7);
      strip_b.fill(off_b, 0, 7);
      strip_c.fill(off_c, 0, 7);
      strip_d.fill(off_d, 0, 7);
      strip_a.show();    
      strip_b.show();
      strip_c.show();    
      strip_d.show();
      
      }
      }

  
}



void Licht(){
strip_a.fill(white_a, 0, 7);    
strip_a.setBrightness(20);  
strip_b.fill(white_b, 0, 7);    
strip_b.setBrightness(20);
strip_c.fill(red_c, 0, 7);    
strip_c.setBrightness(20);  
strip_d.fill(red_d, 0, 7);    
strip_d.setBrightness(20);
strip_a.show();    
strip_b.show();
strip_c.show();    
strip_d.show();
    
}


void Lichthupe(){
strip_a.fill(white_a, 0, 7);    
strip_a.setBrightness(255);  
strip_b.fill(white_b, 0, 7);    
strip_b.setBrightness(255);
strip_c.fill(red_c, 0, 7);    
strip_c.setBrightness(20);  
strip_d.fill(red_d, 0, 7);    
strip_d.setBrightness(20);
strip_a.show();    
strip_b.show();
strip_c.show();    
strip_d.show();    
delay(150);
strip_a.setBrightness(20);
strip_b.setBrightness(20);
strip_a.show();
strip_b.show();  
delay(150);
strip_a.setBrightness(255);
strip_b.setBrightness(255);
strip_a.show();
strip_b.show();
delay(450);
Licht();
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.03.2020, 14:09
Beitrag #14
RE: "Bobbycar LED" - 2 Fragen
(19.03.2020 13:57)KlausGuenther schrieb:  Ich habe mich gefragt ob ich darauf Antworten möchte. Das Zitat ist meiner Meinung nach so falsch das nicht mal das gegenteil stimmt.
Seltsame Art der Beweisführung, aber wenn es Dich glücklich macht ...

Du verwendest für alle Lichtarten ein gemeinsames previousMillis. Ist das bewußt so realisiert?

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Mehrere If-Schleifen werden grundlos immer wieder durchlaufen LK2567 3 171 18.02.2021 15:41
Letzter Beitrag: LK2567
  Zähler mit Taster und Serial Monitor LK2567 16 604 16.02.2021 22:37
Letzter Beitrag: Bitklopfer
  Werte im Display per Taster wechseln bmxruler 8 429 27.01.2021 11:22
Letzter Beitrag: bmxruler
Question Serial.print - Einfluss auf Code Natsnok 4 339 17.01.2021 16:48
Letzter Beitrag: Natsnok
  Mehrere Delays nacheinander Jojo58 5 344 13.01.2021 23:14
Letzter Beitrag: Jojo58
Sad nrf24L01: ein Sender mehrere Empfänger louard 6 450 11.01.2021 22:25
Letzter Beitrag: louard
  mehrere Routinen parallel laufen lassen PurpleLightning 14 879 30.12.2020 08:44
Letzter Beitrag: PurpleLightning
  PIN Code Infrarot Fernbedienung Weserbergland 6 385 28.12.2020 15:05
Letzter Beitrag: Chopp
  Fernsteierungsimpuls Taster/Schalter unterschiedliche Reaktion do1xxy 20 854 21.12.2020 08:24
Letzter Beitrag: do1xxy
  Modbus RTU Code Probleme dahans 4 354 10.12.2020 21:43
Letzter Beitrag: dahans

Gehe zu:


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