Problem: Zeitgesteuertes Abschalten eines LED Streifens.

Guten Tag.

Ich bin völliger Anfänger was Arduinos betrifft, und das letzte was ich programmiert habe war in Pascal in der 10. Klasse (2004).

Kurz zu meinem Projekt:
Nun habe ich 3D Drucken schon vor längerem als Hobby für mich entdeckt und wollte für meine Kinder was schönes Basteln. Da beide derzeit mit dem Thema einschlafen im Dunkeln zu Kämpfen haben, wollte ich für sie eine Art "Nachtlicht bauen.

Das Nachtlicht besteht aus:

  • Arduino Nano
  • 1x ca. 80cm WS2812b LED streifen
  • 1x ca 20 cm WW LED streifen
  • 3D gedrucktes Gehäuse

meine gewünschte Schaltung sieht wie folgt aus:

Arduino und die LED streifen werden (über ein kleines Extension Board) von einem 5V/2A Netzteil mit 5,5mm Hohlstecker mit Spannung versorgt. Zwischen Netzteil und Hohlstecker befindet sich noch ein Ein/Aus Schalter, um das Nachtlicht komplett Stromlos zu bekommen. Die LED streifen werden direkt vom Netzteil mit 5V versorgt und der WS2812b LED streifen über Pin 6 gesteuert. Nach einschalten des Nachtlichtes sollen beide Streifen anfangen zu leuchten. Dabei soll der Arduino den RGB streifen in einem langsamen Rainbow Effekt leuchten lassen (Hab ich zugegebenermaßen aus dem Strandtest von Adafruit geklaut.)

Nun zu meinem Problem:
Ich würde gerne nach einer definierten Zeit nach einschalten (z.B. 2 Stunden) des Arduinos den RGB Streifen komplett abschalten (also alle LEDs auf 0 Farbe und danach wenn möglich auch gleich noch den Arduino), sodass nurnoch der kleine Warmweiße LED streifen als kleines Nachtlicht leuchtet. Am morgen schalten die Kinder das Nachtlicht aus. Wenn sie die Lampe am Abend wieder einschalten, soll der Timer wieder von vorne starten.

Das mit dem Regenbogeneffekt funktioniert schon sehr gut, allerdings habe ich wirklich keine Ahnung wie ich einen 2h Sleeptimer programmiere. Auch die Nachtwächtererklärung hat mir dabei irgendwie nicht geholfen. Ich glaube ich bin wirklich noch nicht genug in der Materie um zu verstehen was alles geht und was nicht.

Ich hoffe jemand kann mir helfen.

Vielen Dank schonmal im vorraus.

PS.: Das ist übrigens das Programm welches ich für den rainbow effekt benutzt habe.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN    6

// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 60

unsigned long LED_timestore;  // Variable Speicher für Systemzeit.
int LedStatus = LOW;
int LedPin = 6;

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)



// setup() function -- runs once at startup --------------------------------

void setup() {

  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}


// loop() function -- runs repeatedly as long as board is on ---------------

void loop() {
  // Fill along the length of the strip in various colors...

  rainbow(100);             // Flowing rainbow cycle along the whole strip

}

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
  // Hue of first pixel runs 5 complete loops through the color wheel.
  // Color wheel has a range of 65536 but it's OK if we roll over, so
  // just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
  // means we'll make 5*65536/256 = 1280 passes through this outer loop:
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
    for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
      // Offset pixel hue by an amount to make one full revolution of the
      // color wheel (range of 65536) along the length of the strip
      // (strip.numPixels() steps):
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
      // optionally add saturation and value (brightness) (each 0 to 255).
      // Here we're using just the single-argument hue variant. The result
      // is passed through strip.gamma32() to provide 'truer' colors
      // before assigning to each pixel:
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    delay(wait);  // Pause for a moment
  }
}

belgarion:
Ich bin völliger Anfänger was Arduinos betrifft, und das letzte was ich programmiert habe war in Pascal in der 10. Klasse (2004).

Na ist ja noch frisch…

meine gewünschte Schaltung sieht wie folgt aus:

Arduino und die LED streifen werden
von einem 5V/2A Netzteil
versorgt.
befindet sich noch ein Ein/Aus Schalter, um das Nachtlicht komplett Stromlos zu bekommen.
der WS2812b LED streifen über Pin 6 gesteuert.

Nach einschalten des Nachtlichtes sollen beide Streifen anfangen zu leuchten. Dabei soll der Arduino den RGB streifen in einem langsamen Rainbow Effekt leuchten lassen (Hab ich zugegebenermaßen aus dem Strandtest von Adafruit geklaut.)

nach einer definierten Zeit nach einschalten (z.B. 2 Stunden) des Arduinos den RGB Streifen komplett abschalten (also alle LEDs auf 0 Farbe und danach wenn möglich auch gleich noch den Arduino),

Wenn sie die Lampe am Abend wieder einschalten, soll der Timer wieder von vorne starten.

Ich habe versucht Deinen Text runterzubrechen.
Aufgabe so einfach wie logisch.

ABER: Der Sketch ist - ich formuliere es vorsichtig - verbesserungswürdig.

// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN    6

int LedPin = 6;

Die Aufgabe ist, das nach 2 Stunden nach Start des Controllers einfach der PIN nicht mehr macht als 0.
Ich habe Deinen Code genommen und vor setup() noch ne Zeile eingefügt.
und loop() geändert.

unsigned long anzeit = 2 * 60UL * 60UL * 1000UL; // Stunden*Minute*Sekunde*1000ms
// setup() function -- runs once at startup --------------------------------

void setup() {

  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)

}

// loop() function -- runs repeatedly as long as board is on ---------------

void loop() {
  if ((millis() < anzeit))
  {
    // Fill along the length of the strip in various colors...

    rainbow(100);             // Flowing rainbow cycle along the whole strip
  }
  else {
    strip.setBrightness(0);
    strip.show();
  }
}

probiere.

belgarion:
Arduino ... von einem 5V/2A Netzteil mit 5,5mm Hohlstecker mit Spannung versorgt.

Da allerdings sehe ich ein Problem. An der Hohlbuchse dürfen es gerne 7V sein - mit 5V geht das nicht.

wno158:
Da allerdings sehe ich ein Problem. An der Hohlbuchse dürfen es gerne 7V sein - mit 5V geht das nicht.

Stimmt! Den habe ich übersehen - da war bei mir nur der Strip...
Thx.

wno158:
Da allerdings sehe ich ein Problem. An der Hohlbuchse dürfen es gerne 7V sein - mit 5V geht das nicht.

Wieso geht das nicht? Ich hab n 5V/2A Netzteil das da dran läuft.

belgarion:
Wieso geht das nicht? Ich hab n 5V/2A Netzteil das da dran läuft.

Du wirst Dich irgendwann fragen, warum da komische Sachen passieren.
Der Hohlbuchse nachgeschaltet ist ein Spannungsregler(Längsregler) der eine definierte Eingangsspannung benötigt um am Ausgang 5V zur Verfügung zu stellen... Und die muss höher sein als die 5V :wink:

Nun ja dann könnte man sich Gedanken über einen Nano machen, der hat ja nen 5V eingang (buchse dran löten) oder nen nackten Atmel, je nach grösse des Programms könnte ja nen Attiny reichen. Für nen Bisschen blinke nehme ich die gerne.
Der Arduino dürfte da 9V abkönnen. so ein netzteil hab ich bei meinem Starterkit beiliegen.

belgarion:
Wieso geht das nicht? Ich hab n 5V/2A Netzteil das da dran läuft.

Zwischen Der Buchse und der 5V Leitung liegen 2 Bauteile:
Eine Schutzdiode an der 0,7V abfallen und ein Spannungsstabilisator der mindestes 1,4V braucht damit er die Spannung stabilisieren kann. Daraus ergibt sich daß es 7V an der Netzteilbuchse braucht.

5V kannst Du am 5V Pin einspeisen. Dann kannst Du aber nicht mehr 5V über USB anschließen.

Willst Du über UB den Sketch draufladen oder Daten an eine PC senden/empfangen. Wenn Du bei einem USB-Kabel die Rote Ader (5V) durchschneiden.

Grüße Uwe

senseman:
Nun ja dann könnte man sich Gedanken über einen Nano machen, der hat ja nen 5V eingang (buchse dran löten) oder nen nackten Atmel, je nach grösse des Programms könnte ja nen Attiny reichen. Für nen Bisschen blinke nehme ich die gerne.
Der Arduino dürfte da 9V abkönnen. so ein netzteil hab ich bei meinem Starterkit beiliegen.

Moin. Ja ich benutze ja einen Nano. Aber ich denke auch fast dass der fast ein wenig überdimensioniert ist. Gibts diese Attiny denn auch mit board mit Hohlstecker? würde das ganze ungerne über ein USB kabel betreiben.

Bzw. Andere frage: Ich habe hier noch ein 9V Netzteil. Bekomm ich den Arduino Nano irgendwie dazu am 5V Pin wirklich nur 5V auszugeben? da kommt derzeit nämlich die komplette eingangsspannung an wenn ich ein 9V Netzteil, ohne last am 5V output, anschließe. Und das bei zwei neuen nanos.

  1. Aus den 2 neuen Nanos sind gerade 2 alte kaputte Nanos geworden.
  2. wer hat Dir gesagt am 5V pin 9V anzuschließen?
  3. der Nano hat das Vin Pin für Spannungan von 7V bis 12V.

Grüße Uwe

uwefed:

  1. Aus den 2 neuen Nanos sind gerade 2 alte kaputte Nanos geworden.
  2. wer hat Dir gesagt am 5V pin 9V anzuschließen?
  3. der Nano hat das Vin Pin für Spannungan von 7V bis 12V.

Grüße Uwe

Ja mein Satzbau war echt nich perfekt gewählt. Also so doof 9V an den 5V pin anzuschließen bin ich dann doch nich... Ich meinte nicht dass ich 9V am 5V pin anschließe, sondern nur dass ich am 5V pin die komplette eingangsspannung messe. Nein ich hab ein extension Board mit Hohlstecker, wo die 9V auf den VIN Pin gehen. Die zwei Arduinos laufen damit auch ohne Probleme.

belgarion:
Die zwei Arduinos laufen damit auch ohne Probleme.

Rein aus Interesse.: Gibt es Erkenntnisse zu #1?

Ja also die Abschaltung funktioniert, aber der Delay von dem Rainbow Effekt scheint die Millis zu beeinflussen. Je höher ich den Delay wert setze, desto länger ist die Zeit bis zur Abschaltung.

Ich weiß allerdings nicht wie ich das beheben könnte. Übrigens läuft der arduino jetzt doch über das 9V Netzteil. Aus irgendeinem Grund hat mein Messgerät vorher immer 8, irgendwas Volt am 5V Aushang angezeigt und irgendwann ging es dann auf einmal... jetzt gehen 9V in den Vin und 5V kommen am VCC raus.

Wäre es eigentlich möglich den ganzen Loop mit rainbow Effekt und Timer über einen Taster neu zu starten?

Einfach das delay weg lassen.

Gruß Tommy

Tommy56:
Einfach das delay weg lassen.

Gruß Tommy

Moment ich dachte dass der Wert in dieser Zeile:

rainbow(100);

Der Delay wert ist. Je kleiner dieser Wert nämlich ist, desto schneller läuft der Effekt. Und ich möchte einen relativ langsamen rainbow Effekt haben. Deshalb kann ich den Wert ja schlecht weg lassen oder?

belgarion:
Moment ich dachte dass der Wert in dieser Zeile:
rainbow(100);

Ja, das ist Deine Zeit, die der Effekt pausiert.
Was Du musst, ist das frühzeitige Aussteigen aus den verschachtelten Schleifen, die da ewig laufen.

Ich hab mal kurz geschaut - versuch mal void rainbow zu ersetzen mir folgendem: (Nicht erschrecken, die ganzen Klammern sind bei mir so… Kannst gerne umformatieren :wink:

(Unsinn) - Ich nehm das zurück - bau da noch was draus…

  • was hiermit geschehen ist
void rainbow(int wait){
  static long firstPixelHue = 0;
  static unsigned long lastmillis = millis();

  if (millis() - lastmillis > wait)
  {
    firstPixelHue += 256;
    if (firstPixelHue >= 5 * 65536) firstPixelHue = 0;
    for (int i = 0; i < strip.numPixels(); i++)  { // For each pixel in strip...
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    lastmillis = millis();
  }
}

Dann musst Du Die Rainbow-Funktion auch mit millis umbauen. Beides durcheinander wird nix.

Gruß Tommy

my_xy_projekt:
Ja, das ist Deine Zeit, die der Effekt pausiert.
Was Du musst, ist das frühzeitige Aussteigen aus den verschachtelten Schleifen, die da ewig laufen.

Ich hab mal kurz geschaut - versuch mal void rainbow zu ersetzen mir folgendem: (Nicht erschrecken, die ganzen Klammern sind bei mir so… Kannst gerne umformatieren :wink:

(Unsinn) - Ich nehm das zurück - bau da noch was draus…

  • was hiermit geschehen ist
void rainbow(int wait){

static long firstPixelHue = 0;
  static unsigned long lastmillis = millis();

if (millis() - lastmillis > wait)
  {
    firstPixelHue += 256;
    if (firstPixelHue >= 5 * 65536) firstPixelHue = 0;
    for (int i = 0; i < strip.numPixels(); i++)  { // For each pixel in strip…
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    lastmillis = millis();
  }
}

Geil! Vielen dank! Funktioniert ohne probleme! Jetzt zu der frage die ich vorher schonmal gestellt habe. Ich kann doch sicher über einen If befehl irgendwie den ganzen loop mit einem touch sensor (ttp223) neu starten oder? :smiley: bzw. wäre es auch möglich mit dem gleichen taster den loop zu beenden wenn die LEDs grade leuchten?

belgarion:
Geil! Vielen dank! Funktioniert ohne probleme!

Danke fürs rückmelden ... - schick :wink:

Ich kann doch sicher über einen If befehl irgendwie den ganzen loop mit einem touch sensor (ttp223) neu starten oder? :smiley: bzw. wäre es auch möglich mit dem gleichen taster den loop zu beenden wenn die LEDs grade leuchten?

Möglich ist alles.
Du musst prüfen, ob der Tastergedrückt wurde und vorher nicht.
Dann setzt Du den Zustand den Du haben willst und merkst Dir das wieder...

my_xy_projekt:
Danke fürs rückmelden ... - schick :wink:

Möglich ist alles.
Du musst prüfen, ob der Tastergedrückt wurde und vorher nicht.
Dann setzt Du den Zustand den Du haben willst und merkst Dir das wieder...

Ja ich dachte eigentlich das wird relativ einfach zu machen sein indem ich quasi den LED pin aus diesem Beispielprogramm (https://funduino.de/wp-content/uploads/2021/01/Licht_Beruehrungssensor.pdf) zurch den LED streifen ersetzen und könnte somit den Pin 6 steuern. Aber so einfach ist es wohl nicht... zumindest schmeißt er mir dann jedesmal ne fehlermeldung raus "rainbow was not declared".