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