#include "LowPower.h"
#define led 13
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
digitalWrite(led, LOW);
// Enter power down state for 8 s with ADC and BOD module disabled
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
delay(1000);
// Do something here
// Example: Read sensor, data logging, data transmission.
digitalWrite(led, HIGH);
delay(10);
}
/*
// Nachtlicht v1.00.00 - 14.02.2024 [04.03.2024]
// Schaltet bei Änderung der IR Strtahlung (Annährung durch Lebewesen) einen RGB LED Streifen
// ein und lässt ihn eine gewisse Zeit an.
// Lowpower Benutzung:
// http://s6z.de/cms/index.php/arduino/nuetzliches/9-winterschlaf-fuer-arduino
// pixels.setPixelColor(led, pixels.ColorHSV(0, 255 , 255));
// detachInterrupt(digitalPinToInterrupt(wakeupPin));
// https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use
// Rot = 0 Gelb = 60 Grüm = 120
#define ldrPin A0 // LDR Eingangspin
#define wakeupPin 2 // Interruptpin (D2)
#define buttonPin 3 // Spaanugversorgung messen / Baterieanzeige
#define stripeDataPin 4 // Datenpin LED Streifen
#define jumper1Pin 5 // LDR benutzen
#define jumper2Pin 6 // LEDs dimmen
#definr ldrVcc 7 // Versorgung des LDR (spart nochmal etwas Strom)
#define intLedPin 13 // Interne LED
byte pixelNum = 10; // Anzahl LEDs
float vcc = 0; // Versorgungsspannung
double colorHue = 0; // LED Farbe [Hue] (0 ... 65535)
byte colorSat = 255; // LED Sättigung [Saturation] (0 ... 255)
byte colorVal = 255; // LED Helligkeit [Value] (0 ... 255)
int ldrValue; // Helligkeit (LDR) 0 ... 1023
volatile unsigned long lightTime;
unsigned long runningTime; // Wann wurde die Schaltung eingeschaltet? Da Sensor erst nach 1 Min aktiv.
volatile bool lightOn = LOW; // LOW, wenn rote LED aus ist, sonst HIGH (Wärend Detektierung)
#include "LowPower.h" // Library für Tiefschlafmodus einbinden.
#include <Adafruit_NeoPixel.h> // Library für RGB LEDs einbinden.
Adafruit_NeoPixel stripe = Adafruit_NeoPixel(pixelNum, stripeDataPin, NEO_GRB + NEO_KHZ800);
void setup()
{
pinMode(wakeupPin, INPUT); // Interrupt wird an Pin 2 ausgelöst.
pinMode(jumper1Pin, INPUT_PULLUP); // Jumper: LDR benutzen
pinMode(jumper2Pin, INPUT_PULLUP); // Jumper: LEDS dimmen
pinMode(buttonPin, INPUT_PULLUP); // Taster für Batterieanzeige
pinMode(intLedPin, OUTPUT); // Int. LED an pin 13
pinMode(stripeDataPin, OUTPUT); // Datemausgabepin für RGB LEDs
pinMode(ldrVcc, OUTOUT) // Stromversorgung LDR
digitalWrite(ldrVcc, HIGH); // LDR einschalten
stripe.begin(); // RGB LEDs initialisieren
stripe.show(); // RGB LEDs ausschalten
Serial.begin(115200); // Seriellen Port initialisieren
vcc = measureVcc(); // Eigene Versorgungsspannung messen...
colorHue = map(vcc, 3200, 5200, 0, 21000); // und in HSV Wert wandeln (Rot - Gelb - Grün)
int numLeds = map(vcc, 3200, 5200, 1, 10); // Je nach vcc 1 ... alle LEDs einschalten (Spannunganzeige)
colorVal = map(analogRead(ldrPin), 0, 1023, 255, 10); // LDR auslesen
for(int currentLed = 0; currentLed < numLeds; currentLed++)
stripe.setPixelColor(currentLed, stripe.gamma32(stripe.ColorHSV(colorHue, 255, colorVal)));
stripe.show();
delay(1000);
attachInterrupt(digitalPinToInterrupt(wakeupPin), wakeUp , CHANGE);
for(int currentLed = 0; currentLed < pixelNum; currentLed++)
stripe.setPixelColor(currentLed, stripe.gamma32(stripe.ColorHSV(0, 0, 0)));
stripe.show();
runningTime = millis(); // Gesamtlaufzeit der Schaltung seit dem Einschalten.
while(millis() <= runningTime + 3000) // Da IR Sensor ca. 1 Minute warmlaufen muss, 50 Sekunden lang...
{
digitalWrite(intLedPin, HIGH); // int. LED für 20mS einschalten...
delay(20);
digitalWrite(intLedPin, LOW); // und dann für 980mS aus.
delay(980);
}
while(millis() <= runningTime + 6000) // Danach 10 Sekunden lang...
{
digitalWrite(intLedPin, HIGH); // int. LED 20mS einschalten...
delay(20);
digitalWrite(intLedPin, LOW); // und 230mS aus.
delay(230);
}
}
void loop()
{
if (millis() >= lightTime + 10000)
{
for(int currentLed = 0; currentLed < pixelNum; currentLed++)
stripe.setPixelColor(currentLed, stripe.gamma32(stripe.ColorHSV(0, 0, 0)));
stripe.show();
// Power Down Modus aktivieren, bei dem ADC und BOD abgeschaltet sind.
// Aufwachen mit Pegeländerung an Pin 2 (Interrupt)
digitalWrite(ldrVcc, LOW); // LDR ausschalten
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
// Hier gehts nach dem Aufwachen durch den Interrupt an Pin 2 weiter
if(digitalRead(jumper1Pin) == HIGH) // Jumoer 1: Helligkeit per LDR steuern oder fixe Helligkeit
colorVal = map(analogRead(ldrPin), 0, 1023, 255, 10);
else
colorVal = 255;
if(digitalRead(jumper2Pin) == HIGH) // Jumper 2: Farbe per LDR steuern oder weiß
colorHue = map(analogRead(ldrPin), 0, 1023, 40000, 55000);
else
colorHue = 10500;
colorSat = 255;
//while(digitalRead(wakeupPin) == HIGH)
//{
// measureVcc();
// vcc = measureVcc();
// colorHue = map(vcc, 3200, 5200, 0, 21000);
//}
for(int currentLed = 0; currentLed < pixelNum; currentLed++)
stripe.setPixelColor(currentLed, stripe.gamma32(stripe.ColorHSV(colorHue, colorSat, colorVal)));
stripe.show();
}
void wakeUp()
{
digitalWrite(ldrVcc, HIGH); // LDR einschalten
digitalWrite(intLedPin, digitalRead(wakeupPin));
if(digitalRead(wakeupPin) == HIGH)
lightTime = millis();
}
void checkBatt()
{
}
float measureVcc()
{
vcc = 0;
for(int i = 0; i < 100; i++)
vcc += readVcc();
vcc = vcc / 100;
return vcc;
}
long readVcc()
{
// https://dumbpcs.blogspot.com/2013/07/secret-voltmeter-in-arduino.html
long result; // Read 1.1V reference against AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); // Warten, dass vref sich stabilisieren kann.
ADCSRA |= _BV(ADSC); // Konvertieren
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH << 8;
result = 1126400L / result; // Rückgabe der Spannung in V
return result;
}
*/
// ###############################################################################################################################
/*
// Nachtlicht v1.00.00 - 14.02.2024 [27.02.2024]
// Schaltet bei Änderung der IR Strtahlung (Annährung durch Lebewesen) einen RGB LED Streifen
// ein und lässt ihn eine gewisse Zeit an.
// Lowpower Benutzung:
// http://s6z.de/cms/index.php/arduino/nuetzliches/9-winterschlaf-fuer-arduino
// pixels.setPixelColor(led, pixels.ColorHSV(0, 255 , 255));
// detachInterrupt(digitalPinToInterrupt(wakeupPin));
// https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use
// Rot = 0 Gelb = 60 Grün = 120
#define ldrPin A0 // LDR Eingangspin
#define wakeupPin 2 // Interruptpin (D2)
#define stripeDataPin 3 // Datenpin LED Streifen
#define extLedPin 4 // Externe LED, wenn interne nicht verwendet werden soll (optional)
#define jumper1Pin 5 // LDR benutzen
#define jumper2Pin 6 // LEDs dimmen
#define modeSwitch 7 // Modusschalter
#define intLedPin 13 // Interne LED
byte pixelNum = 10; // Anzahl LEDs
float vcc = 0; // Versorgungsspannung
double colorHue = 0; // LED Farbe [Hue] (0 ... 65535)
byte colorSat = 255; // LED Sättigung [Saturation] (0 ... 255)
byte colorVal = 255; // LED Helligkeit [Value] (0 ... 255)
float ref = 3.286; // 3.3V Ref Messen
int ldrValue; // Helligkeit (LDR) 0 ... 1023
volatile unsigned long lightTime;
unsigned long runningTime; // Wann wurde die Schaltung eingeschaltet? Da Sensor erst nach 1 Min aktiv.
volatile bool lightOn = LOW; // LOW, wenn rote LED aus ist, sonst HIGH (Wärend Detektierung)
#include "LowPower.h" // Library für Tiefschlafmodus einbinden.
#include <Adafruit_NeoPixel.h> // Library für RGB LEDs einbinden.
void setup()
{
pinMode(wakeupPin, INPUT); // Interrupt wird an Pin 2 ausgelöst.
pinMode(jumper1Pin, INPUT_PULLUP); // Jumper: LDR benutzen
pinMode(jumper2Pin, INPUT_PULLUP); // Jumper: LEDS dimmen
pinMode(modeSwitch, INPUT_PULLUP); // Modus Taster
pinMode(intLedPin, OUTPUT); // Int. LED an pin 13
pinMode(extLedPin, OUTPUT); // Ext. LED an Pin 4 (spiegelt int. LED)
pinMode(stripeDataPin, OUTPUT); // Datemausgabepin für RGB LEDs
Adafruit_NeoPixel stripe = Adafruit_NeoPixel(pixelNum, stripeDataPin, NEO_GRB + NEO_KHZ800);
stripe.begin(); // RGB LEDs initialisieren
Serial.begin(115200); // Seriellen Port initialisieren
vcc = measureVcc(); // Eigene Versorgungsspannung messen...
colorHue = map(vcc, 3200, 5200, 0, 21000); // und in HSV Wert wandeln (Rot - Gelb - Grün)
int numLeds = map(vcc, 3200, 5200, 1, 10); // Je nach vcc 1 ... alle LEDs einschalten (Spannunganzeige)
colorVal = map(analogRead(ldrPin), 0, 1023, 255, 10); // LDR auslesen
for(int currentLed = 0; currentLed < numLeds; currentLed++)
stripe.setPixelColor(currentLed, stripe.gamma32(stripe.ColorHSV(colorHue, 255, colorVal)));
stripe.show();
delay(2000);
attachInterrupt(digitalPinToInterrupt(wakeupPin), wakeUp, CHANGE);
for(int currentLed = 0; currentLed < pixelNum; currentLed++)
stripe.setPixelColor(currentLed, stripe.gamma32(stripe.ColorHSV(0, 0, 0)));
stripe.show();
runningTime = millis(); // Gesamtlaufzeit der Schaltung seit dem Einschalten.
while(millis() <= runningTime + 3000) // Da IR Sensor ca. 1 Minute warmlaufen muss, 50 Sekunden lang...
{
digitalWrite(intLedPin, HIGH); // tnt. und ext. LED für 20mS einschalten...
digitalWrite(extLedPin, HIGH);
delay(20);
digitalWrite(intLedPin, LOW); // und dann für 980mS aus.
digitalWrite(extLedPin, LOW);
delay(980);
}
while(millis() <= runningTime + 6000) // Danach 10 Sekunden lang...
{
digitalWrite(intLedPin, HIGH); // int. und ext. LED 20mS einschalten...
digitalWrite(extLedPin, HIGH);
delay(20);
digitalWrite(intLedPin, LOW); // und 230mS aus.
digitalWrite(extLedPin, LOW);
delay(230);
}
}
void loop()
{
Adafruit_NeoPixel stripe = Adafruit_NeoPixel(pixelNum, stripeDataPin, NEO_GRB + NEO_KHZ800);
stripe.begin();
if (millis() >= lightTime + 10000)
{
for(int currentLed = 0; currentLed < pixelNum; currentLed++)
stripe.setPixelColor(currentLed, stripe.gamma32(stripe.ColorHSV(0, 0, 0)));
stripe.show();
// Power Down Modus aktivieren, bei dem ADC und BOD abgeschaltet sind.
// Aufwachen mir Pegeländerung an Pin 2 (Interrupt)
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
// Hier gehts nach dem Aufwachen durch den Interrupt an Pin 2 weiter.
//if(digitalRead(jumper1Pin) == LOW) // Jumper 1 an GND: LDR steuert die Helligkeit der RGB LEDs
// colorVal = map(analogRead(ldrPin), 0, 1023, 255, 10);
//else
// colorVal = 150;
//if(digitalRead(jumper2Pin) == LOW) // Jumper 2 an GND: Steuert die Farbe der RGB LEDs
// colorHue = map(analogRead(ldrPin), 0, 1023, 40000, 55000);
//else
// colorHue = 40000;
for(int currentLed = 0; currentLed < pixelNum; currentLed++)
stripe.setPixelColor(currentLed, stripe.gamma32(stripe.ColorHSV(colorHue, 0, colorVal)));
stripe.show();
}
void wakeUp()
{
digitalWrite(intLedPin, digitalRead(wakeupPin)); // Int. und ext. LED zeigen das Signal des IR Sensors an.
digitalWrite(extLedPin, digitalRead(wakeupPin));
if(digitalRead(wakeupPin) == HIGH)
lightTime = millis();
}
float measureVcc()
{
vcc = 0;
for(int i = 0; i < 100; i++)
vcc += readVcc();
vcc = vcc / 100;
return vcc;
}
long readVcc()
{
// https://dumbpcs.blogspot.com/2013/07/secret-voltmeter-in-arduino.html
long result; // Read 1.1V reference against AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); // Warten, dass vref sich stabilisieren kann.
ADCSRA |= _BV(ADSC); // Konvertieren
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH << 8;
result = 1126400L / result; // Rückgabe der Spannung in V
return result;
}
*/JP1 (Farbe)
JP2 (Hell)