Wieviel LEDs sind für ein Lauflicht möglich ?

Habs... es schien wohl am GND der Direkt neben den 5V lag gelegen zu haben.

super. vielen dank....

erste Hürde gemeistert... Dank an euch.

nun soll bei Tastendruck ein zweiter Effekt beginnen ... vielleicht erstmal ... alle LED an

Vorher solltest Du delay durch millis ersetzen, das verträgt sich nicht mit Tastendrücken.

Ich hasse millis xD

Ich versteh es einfach nicht

Würden Drehschalter die Sache ändern ? :smiley:

Hi

Hast Du Dir die Nachtwächtererklärung durchgelesen?
Siehe diese Liste:Klick

MfG

Ja schon tausend mal .

Naja gut . Evtl nur 15 mal ....

Aceli:
Würden Drehschalter die Sache ändern ? :smiley:

Ja.

Ein codierter Drehschalter spart Pins.

Hi

Aceli:
Ja schon tausend mal .

Naja gut . Evtl nur 15 mal ....

Und was ist daran so schwer, sich die Start-Zeit von Etwas zu merken und JEDES MAL zu prüfen, ob JETZT-Startzeit>=Wartezeit ist? Dann ist nämlich die Zeit um.
Klar musst Du Dir von JEDEM 'Etwas' die Startzeit separat merken - zumindest, wenn diese 'Etwas's' gleichzeitig funktionieren sollen.

Du machst eine LED an, merkst Dir die Uhrzeit (=millis() ).
Bei jedem Durchlauf prüfst Du, ob millis()-Startzeit größer/gleich der gewünschten Laufzeit ist.
Beim ersten Durchlauf sind Beide gleich und somit nicht größer als die Laufzeit - also machen wir ... Nichts.
Das passiert die nächsten zwanzigtausend Durchläufe dann genau so weiter.
Dann irgend wann ist die Zeit aber um - millis() (die aktuelle Uhrzeit) minus die Startzeit (millis() von damals * hüstel * ) ergibt einen Wert, Der der gewünschten Laufzeit entspricht oder übersteigt - nun können wir z.B. die LED wieder ausschalten - die Leuchtzeit ist ja jetzt um - wir merken uns erneut die aktuelle Zeit und schalten einen Status weiter, jetzt warten wir auf das Ende der AUS-Zeit, wird in den ersten zwanzigtausend Runden auch wieder zu Klein sein ... die Geschichte wiederholt sich.

Das Beispiel 'Blink_without_delay' zeigt Das anhand von LED-Blinken - quasi gleichzeitig kannst Du dein Poti auslesen und prüfen, ob millis()-Startwert>=Potiwert ist - wenn JA, dann 'eine LED weiter' - sonst machst Du hier halt Nichts - die Zeit ist noch nicht vorbei, also bleiben die LEDs, wie Sie sind.

Sonst: Bei Fragen -> Fragen!
Hier bekommt Keiner so schnell den Kopf abgerissen.

MfG

Ich werde es mir erneut durchlesen evtl fällt ja mal der Groschen...

dennoch habe ich etwas versucht... und war erfolgreich..

nun läuft das Licht und bei Tastendruck wechselt es zu dauerlicht. Erneuter Tastendruck und Es läuft wieder..

nun folgen evtl noch 1-2 weitere Effekte. und dann sollte das ganze mit 3-4-5 Effekten Reichen.

#include <Adafruit_NeoPixel.h>
 
#define N_LEDS 15
#define PIN     6

const int tasterPin = 7;
int lichtmodus = 0;
int tasterStatus = LOW;
const byte potPin = A0;
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);


int n=0;
 
void setup() {
  strip.begin();
  pinMode (tasterPin, INPUT_PULLUP);
  Serial.begin(9600);
  
}
 
int pos = 0, dir = 1; // Position, direction of "eye"
 
void loop() {
  tasterStatus = digitalRead(tasterPin);

  if (tasterStatus == LOW)
{
  lichtmodus++;
  delay(30);
}
if (lichtmodus == 0)
{
uint16_t analogWert=analogRead(potPin);
Serial.print("Analog-Wert:");  //gibt Text/Variablen auf der Seriellen aus
Serial.println(analogWert);
  int j;
 
  // Draw 5 pixels centered on pos.  setPixelColor() will clip any
  // pixels off the ends of the strip, we don't need to watch for that.
  strip.setPixelColor(pos - 1, 0x696969); // Medium red
  strip.setPixelColor(pos    , 0xFFFFFF); // Center pixel is brightest
  strip.setPixelColor(pos + 1, 0x696969); // Medium red
 
 
  strip.show();
  delay(analogWert);
 
  // Rather than being sneaky and erasing just the tail pixel,
  // it's easier to erase it all and draw a new one next time.
  for(j=-2; j<= 2; j++) strip.setPixelColor(pos+j, 0);
 
  // Bounce off ends of strip
  pos += dir;
  if(pos < 0) {
    pos = 1;
    dir = -dir;
  } else if(pos >= strip.numPixels()) {
    pos = strip.numPixels() - 2;
    dir = -dir;
  }
}
else if (lichtmodus == 1)
{
  for(n=0;n<=15;n++)
{
  strip.setPixelColor(n, 255,0,0);
}
strip.show();
}
 else
  {
    lichtmodus = 0;
  }
}

was sagt ihr dazu?

kann man in diesen Sketch evtl "einfach" das flüssige laufen einbauen ?
aktuell werden bei dem Lauflicht die LEDS ja nur eingeschaltet. würde da ein Aufhellen/Aufdimmen gehen? oder wären das große Veränderungen. Es ist halt momentan abgehackt. auch ein Komplettes auslaufen der LED wäre super. aktuell sind am Ende immer 2 an.

Vielen Dank

Video folgt demnächst auch mal.

delay() hilft immer, nicht flüssige Abläufe zu unterstützen.

Gruss Stefan

Hallo,

wegen millis und blockierfrei. Denke an deine Armbanduhr. Du musst in 15min zur Bushaltestelle loslaufen. Bis dahin kannst du noch Wäsche waschen, bügeln, Zimmer aufräumen, Mutti beim Abwasch helfen. :slight_smile:

Während dessen schaust du regelmäßig auf deine Uhr ob die 15min vorbei sind.
Wenn ja, lässt du alles stehen und liegen und gehst zur Bushaltestelle.
Das heißt, du hast während den 15min nicht sinnfrei rumgestanden sondern noch andere sinnvolle Dinge erledigen können.

das original - Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

Ein Bsp. was lesbar sein sollte.

void setup(void)
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(void)
{
  
  heartbeat(500);

}


// ****** Funktionen ******
void heartbeat (unsigned int interval)                  // Kontrolle ob Sketch blockiert
{
  static unsigned long last_ms = 0;                     // Merker für letzten Zeitpunkt an/aus
  static bool state = LOW;                              // Merker für an/aus Status
    
  if (millis() - last_ms >= interval) {                 // Differenzzeit vorbei?
    last_ms = millis();                                 // aktuellen Zeitpunkt merken
    state = !state;                                     // negieren (zwischen an / aus umschalten)
    digitalWrite(LED_BUILTIN, state);
  }
}

Wenn du das verstanden hast, kannste alles davon ableiten.

Basierend auf #52 lege ich Dir mal ein Millis-Ei ins Nest, nicht perfekt, aber bunt:

#include <Adafruit_NeoPixel.h>

#define N_LEDS 15
#define PIN     6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);

const byte MAX_ANZAHL_LICHTMODI = 2;
const byte tasterPin = 7;
int lichtmodus = 0;
bool aktTasterStatus, altTasterStatus;
const byte potPin = A0;
uint32_t jetzt, vorhin, intervall, entprellMillis;
int pos = 0, dir = 1; // Position, direction of "eye"

void setup() {
  strip.begin();
  pinMode (tasterPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println(F("Anfang"));
  intervall = analogRead(potPin);
  Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
  Serial.println(intervall);
}

void loop() {
  jetzt = millis();
  altTasterStatus = aktTasterStatus;
  aktTasterStatus = digitalRead(tasterPin);

  if ((aktTasterStatus != altTasterStatus) && (jetzt - entprellMillis >= 30))
  {
    entprellMillis = jetzt;
    if (!aktTasterStatus)
    {
      lichtmodus = (lichtmodus + 1) % MAX_ANZAHL_LICHTMODI;
      Serial.print(F("Neuer Lichtmodus: "));
      Serial.println(lichtmodus);
    }
  }

  switch (lichtmodus) {
    case 0:
      if (jetzt - vorhin >= intervall)
      {
        vorhin = jetzt;
        intervall = analogRead(potPin);
        Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
        Serial.println(intervall);

        // Rather than being sneaky and erasing just the tail pixel,
        // it's easier to erase it all and draw a new one next time.
        for (uint16_t j = 0; j < N_LEDS; j++) strip.setPixelColor(j, 0);

        // Draw 5 pixels centered on pos.  setPixelColor() will clip any
        // pixels off the ends of the strip, we don't need to watch for that.
        strip.setPixelColor(pos - 1, 0x696969);
        strip.setPixelColor(pos    , 0xFFFFFF); // Center pixel is brightest
        strip.setPixelColor(pos + 1, 0x696969);
        strip.show();

        // Bounce off ends of strip
        pos += dir;
        if (pos < 0) {
          pos = 1;
          dir = -dir;
        } else if (pos >= N_LEDS) {
          pos = N_LEDS - 2;
          dir = -dir;
        }
      }
      break;
    case 1:
      for (uint16_t n = 0; n < N_LEDS; n++)
      {
        strip.setPixelColor(n, 255, 0, 0);
      }
      strip.show();
      break;
    default:
      lichtmodus = 0;
  }
}

Getestet mit UNO und 9 LEDs.

Vielen Dank.
Ich werde das nachher mal testen. Danke .

Aktuell stelle ich mir wieder die Frage:

Wie verkabeln.

Geht Variante 2 mit diesem Sketch oder muss etwas geändert werden und Variante 1 kommt zum tragen.

Aceli:
Geht Variante 2 mit diesem Sketch ...

Sollte gehen, aber Widerstände nicht vergessen!

also so und dazwischen widerstände....
welchen Wert sollte man nehmen?Bin unterwegs und hab glaube nur 10k mitgenommen :confused:

und dann wird auf allen streifen das gleiche ablaufen ja?!

Aceli:
also so und dazwischen widerstände....

Ja.

Aceli:
welchen Wert sollte man nehmen?

Adafruit: "Adding a ~470 ohm resistor between your microcontroller's data pin and the data input on the NeoPixels can help prevent spikes on the data line that can damage your first pixel. Please add one between your micro and NeoPixels!" Quelle

Aceli:
und dann wird auf allen streifen das gleiche ablaufen ja?!

Würde ich so vermuten.

schade..... danke.... dann muss ich warten bis ich zuhause bin.

ich habe das ganze jetzt noch mit einem dritten Effekt, Strobo versucht . aber irgendwie hackt es zwischen den Programmen nun... und ja ich schaue mir das mit Millis() nachher nochmal an.

strobo geht nur wenn ich den Knopf gedrückt halte....

#include <Adafruit_NeoPixel.h>
 
#define N_LEDS 15
#define PIN     6

const int tasterPin = 7;
int lichtmodus = 0;
int tasterStatus = LOW;
const byte potPin = A0;
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);
//Adafruit_NeoPixel pixels = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);
//int delayval = 500;
int n=0;
 
void setup() {
  strip.begin();
  //pixels.begin();
  pinMode (tasterPin, INPUT_PULLUP);
  Serial.begin(9600);
  
}
 
int pos = 0, dir = 1; // Position, direction of "eye"
 
void loop() {
  tasterStatus = digitalRead(tasterPin);

  if (tasterStatus == LOW)
{
  lichtmodus++;
  delay(30);
}
if (lichtmodus == 0)
{
uint16_t analogWert=analogRead(potPin);
Serial.print("Analog-Wert:");  //gibt Text/Variablen auf der Seriellen aus
Serial.println(analogWert);
  int j;
 
  // Draw 5 pixels centered on pos.  setPixelColor() will clip any
  // pixels off the ends of the strip, we don't need to watch for that.
  strip.setPixelColor(pos - 1, 0x696969); // Medium red
  strip.setPixelColor(pos    , 0xFFFFFF); // Center pixel is brightest
  strip.setPixelColor(pos + 1, 0x696969); // Medium red
 
 
  strip.show();
  delay(analogWert);
 
  // Rather than being sneaky and erasing just the tail pixel,
  // it's easier to erase it all and draw a new one next time.
  for(j=-2; j<= 2; j++) strip.setPixelColor(pos+j, 0);
 
  // Bounce off ends of strip
  pos += dir;
  if(pos < 0) {
    pos = 1;
    dir = -dir;
  } else if(pos >= strip.numPixels()) {
    pos = strip.numPixels() - 2;
    dir = -dir;
  }
}
else if (lichtmodus == 1)
{
  for(n=0;n<=15;n++)
{
  strip.setPixelColor(n, 138,43,226);
}
strip.show();
}
else if (lichtmodus == 2)
{
  for(n=0;n<15;n++)
  {
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    strip.setPixelColor(n, strip.Color(0,150,0)); // Moderately bright green color.
  }
  {
    strip.show(); // This sends the updated pixel color to the hardware.
    
  }
  }

 else
  {
    lichtmodus = 0;
  }
}

EDIT;

so es funktioniert super, auch mit Millis und Storno

#include <Adafruit_NeoPixel.h>

#define N_LEDS 15
#define PIN     6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);

const byte MAX_ANZAHL_LICHTMODI = 3;
const byte tasterPin = 7;
int lichtmodus = 0;
bool aktTasterStatus, altTasterStatus;
const byte potPin = A0;
uint32_t jetzt, vorhin, intervall, entprellMillis;
int pos = 0, dir = 1; // Position, direction of "eye"
#define INTER_FLASH_DELAY 30
#define INTER_FLASH_COUNT 10
void setup() {
  strip.begin();
  pinMode (tasterPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println(F("Anfang"));
  intervall = analogRead(potPin);
  Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
  Serial.println(intervall);
}

void loop() {
  jetzt = millis();
  altTasterStatus = aktTasterStatus;
  aktTasterStatus = digitalRead(tasterPin);

  if ((aktTasterStatus != altTasterStatus) && (jetzt - entprellMillis >= 30))
  {
    entprellMillis = jetzt;
    if (!aktTasterStatus)
    {
      lichtmodus = (lichtmodus + 1) % MAX_ANZAHL_LICHTMODI;
      Serial.print(F("Neuer Lichtmodus: "));
      Serial.println(lichtmodus);
    }
  }

  switch (lichtmodus) {
    case 0:
      if (jetzt - vorhin >= intervall)
      {
        vorhin = jetzt;
        intervall = analogRead(potPin);
        Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
        Serial.println(intervall);

        // Rather than being sneaky and erasing just the tail pixel,
        // it's easier to erase it all and draw a new one next time.
        for (uint16_t j = 0; j < N_LEDS; j++) strip.setPixelColor(j, 0);

        // Draw 5 pixels centered on pos.  setPixelColor() will clip any
        // pixels off the ends of the strip, we don't need to watch for that.
        strip.setPixelColor(pos - 1, 0x696969);
        strip.setPixelColor(pos    , 0xFFFFFF); // Center pixel is brightest
        strip.setPixelColor(pos + 1, 0x696969);
        strip.show();

        // Bounce off ends of strip
        pos += dir;
        if (pos < 0) {
          pos = 1;
          dir = -dir;
        } else if (pos >= N_LEDS) {
          pos = N_LEDS - 2;
          dir = -dir;
        }
      }
      break;
    case 1:
      for (uint16_t n = 0; n < N_LEDS; n++)
      {
        strip.setPixelColor(n, 138, 43, 226);
      }
      strip.show();
      break;
     case 2:
     for (uint16_t n = 0; n < N_LEDS; n++) {
       strip.setPixelColor(0, strip.Color(0, 0, 255));
    strip.setPixelColor(1, strip.Color(0, 0, 255));
    strip.setPixelColor(2, strip.Color(0, 0, 255));
    strip.setPixelColor(3, strip.Color(0, 0, 255));
    strip.setPixelColor(4, strip.Color(0, 0, 255));
    strip.setPixelColor(5, strip.Color(0, 0, 255));
    strip.setPixelColor(6, strip.Color(0, 0, 255));
    strip.setPixelColor(7, strip.Color(0, 0, 255));
    strip.setPixelColor(8, strip.Color(0, 0, 255));
    strip.setPixelColor(9, strip.Color(0, 0, 255));
    strip.setPixelColor(10, strip.Color(0, 0, 255));
    strip.setPixelColor(11, strip.Color(0, 0, 255));
    strip.setPixelColor(12, strip.Color(0, 0, 255));
    strip.setPixelColor(13, strip.Color(0, 0, 255));
    strip.setPixelColor(14, strip.Color(0, 0, 255));
   
    strip.show();
    delay(INTER_FLASH_DELAY);
    strip.setPixelColor(0, strip.Color(0, 0, 0));
    strip.setPixelColor(1, strip.Color(0, 0, 0));
    strip.setPixelColor(2, strip.Color(0, 0, 0));
    strip.setPixelColor(3, strip.Color(0, 0, 0));
    strip.setPixelColor(4, strip.Color(0, 0, 0));
    strip.setPixelColor(5, strip.Color(0, 0, 0));
    strip.setPixelColor(6, strip.Color(0, 0, 0));
    strip.setPixelColor(7, strip.Color(0, 0, 0));
    strip.setPixelColor(8, strip.Color(0, 0, 0));
    strip.setPixelColor(9, strip.Color(0, 0, 0));
    strip.setPixelColor(10, strip.Color(0, 0, 0));
    strip.setPixelColor(11, strip.Color(0, 0, 0));
    strip.setPixelColor(12, strip.Color(0, 0, 0));
    strip.setPixelColor(13, strip.Color(0, 0, 0));
    strip.setPixelColor(14, strip.Color(0, 0, 0));
  
    strip.show();
    delay(INTER_FLASH_DELAY);
     }
      break; 
    default:
      lichtmodus = 0;
  }
}

Jez noch ein
Fade in fade out

Was ich sehr schwer empfinde

Und dann sollte das eigentlich reichen ....

Hallo,

was soll dein case 2 machen? Das wechselt aktuell 15x die Farbe auf allen LEDs?
N_LEDS in deiner case 2 for Schleife hat dann aber nichts mit der LED Anzahl zu tun.

Man könnte die Code Vielfachen abkürzen wie folgt.

const byte N_LEDS = 15;
case 2:
      for (byte n = 0; n < N_LEDS; n++) {
        setFarbe(N_LEDS, 0, 0, 255);     // alle blau
        strip.show();
        delay(INTER_FLASH_DELAY);
        setFarbe(N_LEDS, 0, 0, 0);       // alle aus
        strip.show();
        delay(INTER_FLASH_DELAY);
      }
      break;
void setFarbe (const byte n, byte r, byte g, byte b)
{
  for (byte i=0; i<n; i++)
  {
    strip.setPixelColor(i, strip.Color(r, g, b));
  }  
}

Dann erhält man wieder mehr Überblick und der Umbau auf millis() fällt leichter.

Aber ich hab doch im Sketch oben mit define n_leds 15 die bereits festgelegt oder ?