Go Down

Topic: Wieviel LEDs sind für ein Lauflicht möglich ? (Read 2239 times) previous topic - next topic

Aceli

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

agmue

Vorher solltest Du delay durch millis ersetzen, das verträgt sich nicht mit Tastendrücken.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Aceli

#47
Apr 17, 2019, 07:27 pm Last Edit: Apr 17, 2019, 07:41 pm by Aceli
Ich hasse millis xD

Ich versteh es einfach nicht

Würden Drehschalter die Sache ändern ? :D

postmaster-ino

Hi

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

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 ...

Aceli

Ja schon tausend mal .

Naja gut . Evtl nur 15 mal ....


agmue

Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

postmaster-ino

Hi
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
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 ...

Aceli

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.

Code: [Select]

#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.

Deltaflyer

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

Gruss Stefan

Doc_Arduino

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.   :)

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.
Code: [Select]

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.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

agmue

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

Code: [Select]

#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.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Aceli

#56
Apr 18, 2019, 02:30 pm Last Edit: Apr 18, 2019, 02:30 pm by Aceli
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.


agmue

Geht Variante 2 mit diesem Sketch ...
Sollte gehen, aber Widerstände nicht vergessen!
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Aceli

#58
Apr 18, 2019, 04:17 pm Last Edit: Apr 18, 2019, 04:21 pm by Aceli
also so und dazwischen widerstände....
welchen Wert sollte man nehmen?Bin unterwegs und hab glaube nur 10k mitgenommen :/

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

agmue

#59
Apr 18, 2019, 04:22 pm Last Edit: Apr 18, 2019, 04:23 pm by agmue
also so und dazwischen widerstände....
Ja.

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

und dann wird auf allen streifen das gleiche ablaufen ja?!
Würde ich so vermuten.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Go Up