Go Down

Topic: Programme per Taster wechseln mit W2812B LEDs (Read 678 times) previous topic - next topic

fusinoco

Hallo zusammen,

der Thread ist zwar schon älter, aber ich habe was ähnliches vor... Mein Sketch ist ein wenig umfangreicher, jedoch funktioniert der Tastendruck nicht.. Kann das jemand testen? Oder sogar einen Fehler finden?

Code: [Select]



#include "FastLED.h"                      // Bibliothek der LEDs laden.
#include <EEPROM.h>                       // EEPROM-Lib für die Speicherung des aktuellen Zustandes
 
#define NUM_LEDS 63                       // Wie viele LEDs sind in dem Strang verkettet?
#define DATA_PIN 7                        // Welcher Pin gibt den Signalausgang?
#define debounce_delay 15                 //Entprellzeit für den Taster
 
CRGB leds[NUM_LEDS];   

bool taster_state, taster_state_alt;      // Variablendeklaration (global)
const int tasterPin = 2;                  //Taster an Pin 2 angeschlossen
const int ledPin = 7;                     //Signalausgang
int lichtmodus = 0;                       //Variable für den Ablauf
int tasterStatus = LOW;                     //Variable zum Speichern des Tasterstatus
int einsLed = 63;
int LED = 0;
byte brightness = 255;                    // Helligkeit zwischen 0 und 255
long lWaitMillis = 0;                     // Hilfsvariable zur Zeitmessung bei effekten
uint8_t gHue = 0;                         // rotatierende "base color" von sämtlichen effekten
byte maxModi = 5;                         // Anzahl der Modi (ist modi der plural von modus?!)

int buttonState = LOW;         // variable for reading the pushbutton status
int buttonread = 0;
 
void setup()                  // Folgende Funktion schaltet die LEDs und übermittelt die Informationen an den Arduino
{
  // sanity check delay - allows reprogramming if accidently blowing power w/leds
  delay(2000);
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  pinMode(ledPin, OUTPUT);      //Setzt den LEDpin als Ausgang
  pinMode(tasterPin, INPUT);    //Setzt den Taster als Eingang
  loadFromEEPROM();             // Lade werte aus dem EEPROM
  AllOff();                     // Egal welche LED zufällig leuchten sollte: ALLES AUS!

 
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(tasterPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // read the state of the pushbutton value:
  buttonread = digitalRead(tasterPin);
 
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonread == HIGH) { //Check if Button was pressed before and being pressed now
 
    if (buttonState == LOW)
    {
      // turn LED on:
      digitalWrite(ledPin, HIGH);
      buttonState = HIGH;
      Serial.println(tasterStatus);
    }
  }
  else {
    if (buttonState == HIGH) {
      digitalWrite(ledPin, LOW);
      buttonState = LOW;
    }
  }

      getButtons();
    FastLED.setBrightness(brightness);
    switch (lichtmodus) // Hier werden die einzelnen voids für die Lichtprogramme aufgerufen. Jede Void hat ihren eigenen Takt in der eine aktualisierung stattfindet der nicht das komplette Programm blockt.
    {
      case 1:
        modusOrange();
        break;
      case 2:
        modus2();
        break;
      case 3:
        modus3();
        break;
      case 4:
        modus4();
        break;
      case 5:
        modus5();
        break;
    }
}
 
void saveToEEPROM()
{
  EEPROM.write(0, lichtmodus);                      // Speichere an Position 0 im EEPROM den lichtmodus
  //EEPROM.write(1, brightness);                      // Speichere an Position 1 im EEPROM die helligkeit
}
 
void loadFromEEPROM()
{
  lichtmodus = EEPROM.read(0);
  //brightness = EEPROM.read(255);
}
 
void getButtons()
{
static uint32_t debounce_time;
 
if (millis()-debounce_time>debounce_delay)taster_state = digitalRead(tasterPin); //einlesen des Tasters
 
if (taster_state != taster_state_alt) // bei Pegelwechsel
  {
    debounce_time=millis();
    taster_state_alt = taster_state;
    if(!taster_state)//wenn Taster gedrückt
    {
      lichtmodus++;                             //Lichtmodus +1
      if (lichtmodus > maxModi) lichtmodus = 0; //beim vierten Tastendruck fängt das ganze von vorne an
    }
  }
}
 
void AllOff()
{
  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();
}
 
void modusOrange()

 

 
 fill_solid(leds, NUM_LEDS, CRGB::Orange);
 FastLED.show();
}
 
void modus2()
{
   if ((long)(millis() - lWaitMillis) >= 0)
  {
    static byte heat[NUM_LEDS];
    for (int i = 0; i < NUM_LEDS; i++) heat[i] = qsub8(heat[i], random8(0, ((55 * 10) / NUM_LEDS) + 2));
    for (int k = NUM_LEDS - 1; k >= 2; k--) heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
 
    if (random8() < 120) {
      int y = random8(7);
      heat[y] = qadd8(heat[y], random8(160, 255));        // FARBE
    }
 
    for (int j = 0; j < NUM_LEDS; j++)
    {
      CRGB color = HeatColor(heat[j]);
      int pixelnummer;
      pixelnummer = j;
      leds[pixelnummer] = color;
    }
    lWaitMillis += 50;                                  // GESCHWINDIGKEIT
  }
  FastLED.show();
}
 
void modus3()
{
    fill_rainbow( leds, NUM_LEDS, gHue, 255 / NUM_LEDS);
}
 
void modus4()
{
  // built-in FastLED rainbow, plus glitzer
  modus3();
  addGlitter(80);
}
 
void addGlitter( uint8_t chanceOfGlitter)
{
  if ( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}
 
void modus5()
{
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16(40, 0, NUM_LEDS);         // ERSTER WERT = GESCHWINDIGKEIT
  static int prevpos = 0;
  if ( pos < prevpos ) {
    fill_solid( leds + pos, (prevpos - pos) + 1, CHSV(gHue, 220, 255));
  } else {
    fill_solid( leds + prevpos, (pos - prevpos) + 1, CHSV( gHue, 220, 255));
  }
  prevpos = pos;
}





Habe das ganze mit dem Arduino ausprobiert und W2812B LEDs, welche ich selbst verlötet habe. Einen Fehler zeigt es mir keinen an. Beim ausprobieren, wird auch nicht auf den Taster reagiert und die Programme bzw. die LEDs spielen "verrückt".

Angschlossen wurde der Taster mit 10kOhm gegen Masse..

postmaster-ino

Hi

Etwas mehr Mühe hättest Du Dir schon geben können, beim 'neuen Thread erstellen'.

Weder hast Du den 'alten Thread' verlinkt (wie Dir geraten wurde), noch hast Du an Deinem Post auch nur ein Fitzelchen der neuen Situation angepasst.

So, der alte Thread hat Dich nicht zur Lösung gebracht ... woran hat's gehapert?

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

fusinoco

Hallo,

vielen Dank fürs Feedback.. Ehrlich gesagt, wusste ich nicht so recht, wie ich es verlinken soll... Deswegen habe ich ja beim bereits vorhandenen Thread geschrieben, da es ja zum Thema gepasst hat.

Die Sache ist eigentlich nur, ob es jemand bei sich testen könnte, ob es überhaupt funktioniert, da ich mir nicht sicher bin, was falsch angeschlossen zu haben.

Ich habe deswegen noch keine Lösung, da auch der Sketch aus dem alten Thread bei mir nicht funktioniert und ich nicht dahinter komme, warum das so ist, da der ja einfach aufgebaut ist.

postmaster-ino

Hi

Was bedeutet '10kΩ gegen Masse'?
Laut Deinem Sketch fragst Du den Taster auf HIGH ab, der 10kΩ wäre dann der PullDN.
Also sollte Dein Taster zwischen Eingang und Vdd liegen.
(da der Arduino eingebaute PullUP-Widerstände hat, nutzen 98% der µC-Menschen negative Logik, also 'Taster gedrückt bei LOW', da der Eingang ungedrückt per PullUP auf Vdd gezogen wird - aber Geschmackssache).

Der einzige Bereich, wo 'lichtmodus' gesetzt wird, ist in 'getButtons()'
Kommt der Arduino Da überhaupt irgend wann Mal an?

Du hast ja bereits serielle Ausgaben im Sketch - hiermit müsstest Du zumindest grob sagen können, was passt und wo's hakt.

Bzw.: Baue weitere serielle Ausgaben ein und schaue im Terminal, ob der Sketch dahin kommt, wo Er hingehen müsste bei den Eingaben, Die Du Ihm gibst.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

HotSystems

Hallo,

vielen Dank fürs Feedback.. Ehrlich gesagt, wusste ich nicht so recht, wie ich es verlinken soll.
.....
Wenn du nicht weißt, wie etwas funktioniert, dann lies doch die Bedienungsanleitung, oder hier: How to use this forum.
Da wird alles gut beschrieben.

Und wenn ein kopierter Sketch bei dir nicht funktioniert, kann es auch an deiner Hardware liegen. Die kennen wir aber nicht.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

agmue

Oder sogar einen Fehler finden?
1. Das Programm compiliert nicht, in Zeile 130 fehlt eine Klammer. Strg+t in der IDE formatiert und hilft, solche Fehler zu erkennen.

2. Ein Pin mit zwei Funktionen geht nicht:
Code: [Select]
#define DATA_PIN 7                        // Welcher Pin gibt den Signalausgang?
...
const int ledPin = 7;                     //Signalausgang

3. Doppelte Funktionalität:
Code: [Select]
bool taster_state, taster_state_alt;      // Variablendeklaration (global)
...
int tasterStatus = LOW;                     //Variable zum Speichern des Tasterstatus
...
int buttonState = LOW;         // variable for reading the pushbutton status

und später
Code: [Select]
  // read the state of the pushbutton value:
  buttonread = digitalRead(tasterPin);
...
  getButtons();

Weiter habe ich nicht geschaut, ich hoffe, das genügt erstmal.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

fusinoco

Hallo zusammen,

lange hat es gedauert, doch ich bin fast am Ziel.. (auch mit Hilfe)

Habe jetzt folgenden Code zusammen:

Code: [Select]

#include "FastLED.h"                      // Bibliothek der LEDs laden.
#include <EEPROM.h>                       // EEPROM-Lib für die Speicherung des aktuellen Zustandes
 
#define NUM_LEDS 63                       // Wie viele LEDs sind in dem Strang verkettet?
#define dataPin 7                          // Welcher Pin gibt den Signalausgang?
 
CRGB leds[NUM_LEDS];                      // Dies ist eine Reihe von LEDs. Ein Stück für jede LED in diesem Streifen.
 
int modus = 0;                            // Variable für den Ablauf
int LED = 0;
/*byte dim = 255; */                   // Helligkeit zwischen 0 und 255
long lWaitMillis = 0;                     // Hilfsvariable zur Zeitmessung bei effekten
uint8_t gHue = 0;                         // rotatierende "base color" von sämtlichen effekten
byte maxModi = 5;                         // Anzahl der Modi (ist modi der plural von modus?!)
byte dimModi = 10;
int dimmodus = 0;
int buttonPin = 2;                        // Eingang des Tasters für die Programmauswahl


int buttonPinDIM = 3;                      // Button um alle LEDs auszuschalten und wieder einzuschalten.
                     
int buttonState = LOW;                    // variable um den Tasterstatus zu halten
int buttonread = 0;

 
void setup() {                            // Folgende Funktion schaltet die LEDs und übermittelt die Informationen an den Arduino
 
  // sanity check delay - allows reprogramming if accidently blowing power w/leds
  delay(2000);
  FastLED.addLeds<NEOPIXEL, dataPin>(leds, NUM_LEDS);
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
  pinMode(buttonPinDIM, INPUT);

}

 
void loop (){
 
  getButtonStatus();                       // handle button
 
  if (modus==0) modus1();
  if (modus==1) modus2();
  if (modus==2) modus3();
  if (modus==3) modus4();
  if (modus==4) modus5();

}

void loop(){

getButtonStatus();


if (dimmodus==0) dimmodus1 ();
if (dimmodus==1) dimmodus2 ();
if (dimmodus==2) dimmodus3 ();
if (dimmodus==3) dimmodus4 ();
if (dimmodus==4) dimmodus5 ();
if (dimmodus==5) dimmodus6 ();
if (dimmodus==6) dimmodus7 ();
if (dimmodus==7) dimmodus8 ();
if (dimmodus==8) dimmodus9 ();
if (dimmodus==9) dimmodus10 ();

}
 
void getButtonStatus() { 
  buttonread = digitalRead(buttonPin);      // Lese PinStatus vom Taster
 
  if (buttonread == LOW) {
    if (buttonState == HIGH) {
      buttonState = LOW;
      modus++;
      if (modus > maxModi) { modus = 0; }
      delay(20);
      Serial.println(modus);
      }
   }
   else { if (buttonState == LOW) { buttonState = HIGH; }}
}

 buttonread = digitalRead(buttonPinDIM);      // Lese PinStatus vom Taster
 
  if (buttonread == LOW) {
    if (buttonState == HIGH) {
      buttonState = LOW;
      modus++;
      if (dimmodus > dimModi) { dimmodus = 0; }
      delay(20);
      Serial.println(dimmodus);
      }
   }
   else { if (buttonState == LOW) { buttonState = HIGH; }}
}

 
  //+++++++++++++++ LEUCHTPROGRAMME +++++++++++++++++
 
void modus1()
{
 if ((long)(millis() - lWaitMillis) >= 0)
  {
    static byte heat[NUM_LEDS];
    for (int i = 0; i < NUM_LEDS; i++) heat[i] = qsub8(heat[i], random8(0, ((55 * 10) / NUM_LEDS) + 2));
    for (int k = NUM_LEDS - 1; k >= 2; k--) heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
 
    if (random8() < 120) {
      int y = random8(7);
      heat[y] = qadd8(heat[y], random8(160, 255));        // FARBE
    }
 
    for (int j = 0; j < NUM_LEDS; j++)
    {
      CRGB color = HeatColor(heat[j]);
      int pixelnummer;
      pixelnummer = j;
      leds[pixelnummer] = color;
    }
    lWaitMillis += 50;                                  // GESCHWINDIGKEIT
  }
  FastLED.show();
}
 
void modus2()
{
    fill_solid( leds, NUM_LEDS, CRGB::Green);

     FastLED.show();
}
 
void modus3()
{
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16(40, 0, NUM_LEDS);         // ERSTER WERT = GESCHWINDIGKEIT
  static int prevpos = 0;
  if ( pos < prevpos ) {
    fill_solid( leds + pos, (prevpos - pos) + 1, CHSV(gHue, 220, 255));
  } else {
    fill_solid( leds + prevpos, (pos - prevpos) + 1, CHSV( gHue, 220, 255));
  }
  prevpos = pos;

   FastLED.show();
}
 
void modus4()
{
  static uint8_t    numdots =   4; // Number of dots in use.
  static uint8_t   faderate =   2; // How long should the trails be. Very low value = longer trails.
  static uint8_t     hueinc =  255 / numdots - 1; // Incremental change in hue between each dot.
  static uint8_t    thishue =   0; // Starting hue.
  static uint8_t     curhue =   0; // The current hue
  static uint8_t    thissat = 255; // Saturation of the colour.
  static uint8_t thisbright = 255; // How bright should the LED/display be.
  static uint8_t   basebeat =   5; // Higher = faster movement.
 
  static uint8_t lastSecond =  99;  // Static variable, means it's only defined once. This is our 'debounce' variable.
  uint8_t secondHand = (millis() / 1000) % 30; // IMPORTANT!!! Change '30' to a different value to change duration of the loop.
 
  if (lastSecond != secondHand) { // Debounce to make sure we're not repeating an assignment.
    lastSecond = secondHand;
    switch (secondHand) {
      case  0: numdots = 1; basebeat = 20; hueinc = 16; faderate = 2; thishue = 0; break; // You can change values here, one at a time , or altogether.
      case 10: numdots = 4; basebeat = 10; hueinc = 16; faderate = 8; thishue = 128; break;
      case 20: numdots = 8; basebeat =  3; hueinc =  0; faderate = 8; thishue = random8(); break; // Only gets called once, and not continuously for the next several seconds. Therefore, no rainbows.
      case 30: break;
    }
  }
 
  // Several colored dots, weaving in and out of sync with each other
  curhue = thishue; // Reset the hue values.
  fadeToBlackBy(leds, NUM_LEDS, faderate);
  for ( int i = 0; i < numdots; i++) {
    leds[beatsin16(basebeat + i + numdots, 0, NUM_LEDS)] += CHSV(gHue + curhue, thissat, thisbright);
    curhue += hueinc;
  }
     FastLED.show();
  }

 
void modus5()

{

fill_solid( leds, NUM_LEDS, CRGB::Black);
 
  FastLED.show ();
}


void modus6()
{
}

  //+++++++++++++++ DIMMPROGRAMME +++++++++++++++++

  void dimmodus1 ()

  {

  FastLED set.brightness (10);
 

  }

 

 
 



Die Programme lassen sich wunderbar mit dem Tastendruck schalten. Jetzt dachte ich, machst das gleiche mit einem 2 Schalter und definierst die Befehle dementsprechend nur anders. Allerdings scheitert es schon an Zeile 34, die eigentlich davor ohne diese Dimmfunktion funktioniert hat?

Kann man das so machen, oder ist hier der Ansatz falsch?

Danke schon mal  ;)

HotSystems

#7
Jul 29, 2018, 04:44 pm Last Edit: Jul 29, 2018, 04:47 pm by HotSystems
Du kannst keine 2 loops in einem Sketch einsetzen, das funktioniert nicht und müsste schon beim kompilieren knallen.
Mehr habe ich mir nicht angesehen.

Aber du kannst den Inhalt der loops zusammenführen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

fusinoco

Hat jemand für mich vielleicht einen "Gedankenstoß" an welche Lösung ich hinarbeiten muss? Bzw. was fehlt?

Das mit der doppelten Loop hab ich mir schon gedacht, funktioniert aber nicht, diese zusammenzufassen.

uwefed

Das mit der doppelten Loop hab ich mir schon gedacht, funktioniert aber nicht, diese zusammenzufassen.
Dann korrigiere den Fehler.

Deine Problembeschreibung ist so blöd wie meine Antwort. Ohne infos (Sketch und Fehlermeldungen) können wir Dir nicht antworten.

Grüße Uwe

combie

#10
Aug 11, 2018, 08:37 am Last Edit: Aug 11, 2018, 08:39 am by combie
Quote
Code: [Select]
FastLED set.brightness (10);
Ist das zufällig Zeile 43?
Die hat noch nie funktioniert!

Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

uwefed

Ist das zufällig Zeile 43?
Die hat noch nie funktioniert!
War das nicht 42?  ;)  ;)

combie

#12
Aug 11, 2018, 09:57 am Last Edit: Aug 11, 2018, 09:58 am by combie
War das nicht 42?  ;)  ;)
Falsch: 43
Richtig: 34
 8)
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

postmaster-ino

Per Anhalter in der Galaxis verflogen ... jetzt passt noch nicht Mal mehr 'die Antwort auf alle Fragen' ... schnöde Welt, Diese!
42_(Antwort), Wikipedia
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up