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
RGB LED Lauflicht per Taster unterbrechen
29.07.2018, 20:59
Beitrag #1
RGB LED Lauflicht per Taster unterbrechen
Hallo zusammen,

ich will LEDs mit verschiedenen Muster leuchten lassen.

Dazu benutze ich Adafruit_NeoPixel.h.

Über 5 Taster, die zusammen (verschiedene Widerstände) an einem
Analogen - Eingang hängen, will ich verschiedene Muster anzeigen lassen.
Die Auswertung, welcher Taster gedrückt wurde, funktioniert auch soweit.

Ich habe zuerst ein Lauflicht mit delay() programmiert.
Das Lauflicht funktioniert auch, aber wegen dem delay() ist keine Unterbrechung möglich.

Code:
for (int t = 0; t < strip.numPixels(); t++) {
        strip.setPixelColor(t, strip.Color( 0, 0, 0));
        strip.show();
      delay(1000);
    }

Und mit

while(millis()- previousMillis < 1000)

leuchtet erst die erste LED und dann flackern alle ganz kurz dauernd.

Lieg es vielleicht an meiner Logik?
Was muss ich anders machen, damit ich, während das Lauflicht läuft,
das Muster ändern kann.(Also, wie wird der Tastendruck erkannt)

Hier noch mein Code:
Code:
//LED Steuerung
//*******************************************************************************
#include <Adafruit_NeoPixel.h>                      // Library einbinden
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define LedSignal 6                                 // Digitaler Ausgangspinnummer
#define NUM_LEDS 25                                 // Anzahl der LED        
#define BRIGHTNESS 50                               // Helligkeit

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LedSignal, NEO_GRB + NEO_KHZ800);

// Display Steuerung
//*******************************************************************************
#include <LiquidCrystal.h>
#define RS 8                                      //Register Select
#define E  7                                      //Enable
#define D4 5                                      //Datenleitung
#define D5 4                                      //Datenleitung
#define D6 3                                      //Datenleitung
#define D7 2                                      //Datenleitung
#define COLS 16                                   //Anzahl der Spalten
#define ROWS 2                                    //Anzahl der Zeilen
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);

//Analoger Eingang für Tasten definieren
//*******************************************************************************
#define Menutaste 2                              //Analoger Porteingang - Menusteuerung

//Helligkeit einstellen
//*******************************************************************************
#define Helligkeitsdimmer 0                       //Analoger Porteingang 0 - Helligkeit einstellen

//Variablen für unterschiedliche Farbanzeigen definieren - public (also von jeder Funktion lesbar)
//*******************************************************************************
int Modus = 0;                                    //
int ModusArt = 0;
int Farbe = 0;
int GeschwindigkeitsTeiler = 0;
//int Geschwindigkeit = 2000;

int Helligkeit = 0;

//Farben definieren
//*******************************************************************************
uint32_t rot = strip.Color(255, 0, 0);            //RGB Farbe Rot
uint32_t gruen = strip.Color(0, 0, 139);          //RGB Farbe Grün


//Farben definieren
//*******************************************************************************
unsigned long previousMillis = millis(); // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 2000;    // Interval zwischen zwei Änderungen

int Taste;

//Void - Setup
//*******************************************************************************
void setup() {  
  lcd.begin(COLS, ROWS);
  lcd.print("Mich steuert ein");
  lcd.setCursor(0,1);
  lcd.print("Arduino an!");
  
  strip.begin();
  strip.show();
}


//Void - Loop
//*******************************************************************************
void loop() {
  int Helligkeit = 50;                          //Variable für die Helligkeit
  int Taste;                                    //Variable für die Auswahl der Taste
   //Helligkeit regeln
  Helligkeit = analogRead(Helligkeitsdimmer);   //Wert des Potis zum Dimmen an die Variable übergeben
  Helligkeit = Helligkeit / 20;
  strip.setBrightness(Helligkeit);              //Helligkeit einstellen
  strip.show();
  Taste = analogRead(Menutaste);
  LED_leuchten_lassen();

  switch (Taste){
    case 530 ... 590:            //Taste oben  - Modus - Wert erhöhen      
        Modus++;
        if (Modus > 3) {
          Modus = 0;
         }
        LED_leuchten_lassen();
    break;

    case 735 ... 785:            //Taste rechts
        ModusArt++;
        if (ModusArt > 2) {
          ModusArt = 0;
         }
        //LED_leuchten_lassen();
    break;
    
    case 810 ... 860:            //Taste unten

        Farbe++;
        if (Farbe > 4) {
          Farbe = 0;
         }
        //LED_leuchten_lassen();  
    break;
    
    case 880 ... 940:            //Taste links
        GeschwindigkeitsTeiler++;        
        if (GeschwindigkeitsTeiler > 10)
          {
            GeschwindigkeitsTeiler = 0;
          }        
        interval = 200 * GeschwindigkeitsTeiler;
        LED_leuchten_lassen();        
    break;
  }

}

void LED_leuchten_lassen()
  {
    switch (Modus)                              //Hier werden die Muster zugeordnet
      {
        case 0:                                     //Lauflicht
          switch (ModusArt)
                {
                  case 0:                           //von 0 bis 24
                  Lauflicht_0_bis_24();                
                }
      }
   }

void Lauflicht_0_bis_24()
  {
   previousMillis = millis();
    for (int a = 0; a < NUM_LEDS; a++)
      {
            strip.setPixelColor(a, rot);
            strip.show();

              while(millis()- previousMillis < interval)
                {
                  // } );
                  for (int b = 0; b< NUM_LEDS; b++)
                    {
                      strip.setPixelColor(b, 0, 0, 0);
                    }
                }
          
      }
  
  }

Gruss AC_DC_new
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2018, 21:08
Beitrag #2
RE: RGB LED Lauflicht per Taster unterbrechen
(29.07.2018 20:59)AC_DC_new schrieb:  Und mit

while(millis()- previousMillis < 1000)

leuchtet erst die erste LED und dann flackern alle ganz kurz dauernd.

Lieg es vielleicht an meiner Logik?
Ja.
Dein while blockiert den Ablauf von loop.
Du musst da immer mit if arbeiten. Du hast ja schon eine immer laufende Funktion: loop(). Mehr brauchst Du nicht.
Höchstens kurze Schleifen, um, Farben für den ganzen Stripe zu setzen.
Ich kenne die Neopixel-Lib nicht aber Du kannst Dich grob am Ablauf meines Weihnachtssterns orientieren, auch wenn der eine andere Lib benutzt, weil es ältere RGB-LED sind.
Die Programmierlogik ist die Gleiche.

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
29.07.2018, 21:31
Beitrag #3
RE: RGB LED Lauflicht per Taster unterbrechen
Hallo Tommy,

Es liegt ja folgender Ablauf vor:

1. Gebe LED an Position X eine Farbe.
2. Dann 2 Sekunden Pause
3. Schalte alle LEDs aus.

Das bedeutet, dass fast immer Pause gemacht wird.
(Außer beim LEDs Ausschalten und kurz beim LED Einschalten)

Ehrlich gesagt, weiß ich nicht wie ich mit If eine 2 Sekunden Pause
programmieren soll.

Ich habe auch schon überlegt, ob ich den Programmablauf ändern muss?!?

Erläutere bitte für mich Deinen Vorschlag mit if.


Gruss AC_DC_new
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2018, 21:36
Beitrag #4
RE: RGB LED Lauflicht per Taster unterbrechen
Schau Dir BlinkWithoutDelay in den Beispielen der IDE an und verstehe es. Dabei kann Dir die Nachtwächtererklärung helfen und/oder eine andere Erklärung hier im Tutorials/Literatur-Teil zu millis().

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
30.07.2018, 18:11
Beitrag #5
RE: RGB LED Lauflicht per Taster unterbrechen
Hallo Tommy,

gerade hat sich mein Arduino, vermutlich durch einem Hitzeschlag, verabschiedet.

Jetzt muss ich erstmal für Ersatz sorgen.

Könnte etwas dauern, bis es weiter geht.

Gruss

AC_DC_new
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.07.2018, 18:13
Beitrag #6
RE: RGB LED Lauflicht per Taster unterbrechen
So empfindlich sind die Dinger eigentlich nicht. Hast Du da etwas nachgeholfen? Wink

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
31.07.2018, 20:32
Beitrag #7
RE: RGB LED Lauflicht per Taster unterbrechen
Manchmal habe ich auch schon mit dem Gedanken gespielt.(wenn man nicht weiter kommt)AngryBig Grin

Ich habe mir Deine Anregungen mal angesehen. Aber die Umsetzung auf mein Vorhaben ist mir noch nicht gelungen. Je länger ich drüber nach denke, um so weniger fällt mir dazu ein.

das klassische Beispiel:

if (millis() - startzeit_1 >= laufzeit_1) {
startzeit_1 = millis();
digitalWrite(led_1, digitalRead(led_1) ^ 1);
}

Dieses Beispiel funktioniert nur, wenn ständig die If Abfrage auf Wahrheit überprtüft wird. Also, wenn das Beispiel in der Loop Funktion steht.

Wie funktioniert der Code in einer Schleife? Ich muss ja, um ein LED - Lauflicht zu erzeugen, von 0 bis 24 zählen (LED Position) und jede LED 2 Sekunden an und dann wieder 2 Sekunden aus schalten usw. In der Schleife wird die Wenn Abfrage ja nur einmal geprüft, das kann ja nicht funktionieren.

Hast Du noch einen neuen Denkanstoß für mich?

Gruß


AC_DC_new
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.07.2018, 21:34
Beitrag #8
RE: RGB LED Lauflicht per Taster unterbrechen
Wenn die Zeitbedingung erfüllt ist, dann setze das Lauflicht eine Position weiter.
Da ich ich nicht weiß, wie Du das Lauflicht programmierst, kann ich nicht mehr dazu sagen.

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
  Zeitmessung - Taster gedrückt DEL 14 749 08.08.2019 21:25
Letzter Beitrag: Bitklopfer
  Taster nur 1xmal zählen Flötzinger 3 570 05.05.2019 11:49
Letzter Beitrag: Flötzinger
  Motor mit Taster Vollgaser 3 694 14.03.2019 18:02
Letzter Beitrag: Bitklopfer
  Codehilfe 1 Taster 2 Relais freaktech 8 853 20.02.2019 22:00
Letzter Beitrag: freaktech
  Taster Abfrage Manuel 1 610 13.01.2019 10:50
Letzter Beitrag: Tommy56
  2 taster gleichzeitig drücken Rasa 6 1.004 02.01.2019 16:55
Letzter Beitrag: Rasa
  Schleife per Tastendruck unterbrechen und andere Schleife starten Thor Wallhall 13 2.036 19.07.2018 21:50
Letzter Beitrag: Thor Wallhall
Big Grin Brauche dringend Hilfe mit dem Programmieren von Servo und Taster holzchistli 4 1.693 19.06.2018 16:45
Letzter Beitrag: hotsystems
  Lauflicht mit Kontrolle Golffahrer 13 2.222 13.05.2018 19:59
Letzter Beitrag: Tommy56
  Taster schalten LEDs mit Schieberegister Sonne 3 1.602 26.03.2018 20:08
Letzter Beitrag: hotsystems

Gehe zu:


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