silentbase_neopixel:programmversion_0.7
NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.7
Die Weihnachtszeit steht vor der Tür. Daher wurde ein neuer Effekt hinzugefügt, der den Stabthermometereffekt glitzern lässt. Außerdem wurden kleinere Verbesserungen am Code des Breathing-Effekts vorgenommen.
Ältere Versionen:
Hilfreiche Links:
ToDo: Mehr Effekte!
Der Sketch enthält Code von Baldengineer und Scynd.
// Bibliotheken einbinden
#include <EEPROM.h>
#include <ResponsiveAnalogRead.h>
#include <Adafruit_NeoPixel.h>
// Definiert die Pins
#define buttonPin 7 // Taster
#define loadPin A0 // analoge Spannungsmessung
#define neoPin1 11 // Neopixel-Strip rechte Seite
#define neoPin2 12 // Neopixel-Strip linke Seite
// Definiert eine Adresse im EEPROM
int addr = 0; // An dieser Adresse wird später der ausgewählte Programmmodus gespeichert
// Definiert ein ResponsiveAnalogRead Objekt
ResponsiveAnalogRead rload(loadPin, true);
// Definiert die Variablen
int numPixels = 64; // Anzahl der NeoPixel
int load; // Gibt später die Netzteillast in Prozent an
int buttonstate = HIGH; // aktuelles Signal vom Eingangspin
int buttonpressed = 0; // abfragen ob Taster gedrückt war
int debouncetime = 200; // Zeit für Entprellung ggf. anpassen
float counter = 0; // Zählwert für verschiedene Beleuchtungseffekte
boolean sw1 = true; // Schaltvariable für verschiedene Beleuchtungseffekte
boolean sw2 = true; // Schaltvariable für verschiedene Beleuchtungseffekte
int i;
int j;
int k;
byte programmode = 0; // Programmmodus
// Definiert die NeoPixel-Strips
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(numPixels, neoPin1, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(numPixels, neoPin2, NEO_GRBW + NEO_KHZ800);
// Definiert die globalen RGBW-Werte
byte r = 0;
byte g = 0;
byte b = 0;
byte w = 0;
// Definiert die Tracking-Variablen für die IF-Abfragen
unsigned long previousMillisCalcLoad = 0;
unsigned long previousMillisNeoPixel = 0;
unsigned long previousMillisSerialPrint = 0;
unsigned long buttontime = 0;
unsigned long sparkle1on = 0;
unsigned long sparkle1off = 0;
unsigned long sparkle1ondelay = 100;
unsigned long sparkle1offdelay = 500;
unsigned long sparkle2on = 0;
unsigned long sparkle2off = 0;
unsigned long sparkle2ondelay = 100;
unsigned long sparkle2offdelay = 500;
// Definiert die Intervalle für die IF-Abfragen
int intervalCalcLoad = 500; // Delay für Berechnung der Last
int intervalNeoPixel = 50; // Delay für Ansteuerung der NeoPixel
int intervalSerialPrint = 1000; // Delay für serielle Ausgabe
void setup() {
// Initialisiere den Button-Pin
pinMode(buttonPin, INPUT_PULLUP);
// Initialisiere die NeoPixel-Pins
pinMode(neoPin1, OUTPUT);
pinMode(neoPin2, OUTPUT);
// Initialisiere den analogen Pin
pinMode(loadPin, INPUT);
// Initialisiere die NeoPixel-Strips
strip1.begin(); // Initialisiert das Neopixel
strip1.show(); // Macht das NeoPixel sichtbar
//strip1.clear(); // Macht das NeoPixel aus
strip2.begin(); // Initialisiert das Neopixel
strip2.show(); // Macht das NeoPixel sichtbar
//strip2.clear(); // Macht das NeoPixel aus
// Lese den abgespeicherten Wert für den Programmmodus aus dem EEPROM
programmode = EEPROM.read(addr);
// Initialisiere die serialle Schnittstelle
Serial.begin(57600);
delay (2000);
}
void loop() {
// Lesen und entprellen des Tasters
buttonstate = digitalRead(buttonPin);
// Wenn der Taster gedrückt ist...
if (buttonstate == LOW)
{
buttontime = millis(); // aktualisiere tasterZeit
buttonpressed = 1; // speichert, dass Taster gedrückt wurde
}
// Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
if ((millis() - buttontime > debouncetime) && buttonpressed == 1)
{
programmode++; // Programmmodus wird um +1 erhöht
buttonpressed = 0; // setzt gedrückten Taster zurück
r = 0; // setzt den globalen Farbwert zurück
g = 0; // setzt den globalen Farbwert zurück
b = 0; // setzt den globalen Farbwert zurück
w = 0; // setzt den globalen Farbwert zurück
EEPROM.write(addr, programmode); // Schreibt den Programmmodus ins EEPROM
}
// Aktuelle Zeit abfragen
unsigned long currentMillis = millis();
// Messen und Berechnen der Last des Netzteils
if ((unsigned long)(currentMillis - previousMillisCalcLoad) >= intervalCalcLoad) {
// Auslesen des analogen Eingangs (Last Netzteil)
rload.update();
// Berechnung der Netzteillast in Prozent
float rloadmin = 350; // Messwert bei minimaler Last
float rloadmax = 700; // Messwert bei maximaler Last
load = 100 - ((rloadmax - rload.getValue()) / (rloadmax - rloadmin)) * 100;
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisCalcLoad = currentMillis;
}
// Steuerung der NeoPixel-Strips
// Beleuchtungseffekt für Programmmodus 0 (Atmen rot)
if (programmode == 0) {
if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {
if(load < 10) { // Variable soll für diesen Effekt nicht kleiner als 10 werden
load = 10;
}
// Ansteuerung der NeoPixel-Strips
counter = counter + (0.05 * (load/10));
if (counter >= 6.28) {
counter = 0;
}
// fade led mit counter
r = ((exp(sin(counter)) - 0.36787944) * 108.492061351);
for (int i = 0; i < numPixels; i++) {
strip1.setPixelColor(i, r, g, b, w);
strip2.setPixelColor(i, r, g, b, w);
}
strip1.show();
strip2.show();
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisNeoPixel = currentMillis;
}
}
//Beleuchtungseffekt für Programmmodus 1 (Atmen weiß)
else if (programmode == 1) {
if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {
if(load < 10) { // Variable soll für diesen Effekt nicht kleiner als 10 werden
load = 10;
}
// Ansteuerung der NeoPixel-Strips
counter = counter + (0.05 * (load/10));
if (counter >= 6.28) {
counter = 0;
}
// fade led mit counter
w = ((exp(sin(counter)) - 0.36787944) * 108.492061351);
for (int i = 0; i < numPixels; i++) {
strip1.setPixelColor(i, r, g, b, w);
strip2.setPixelColor(i, r, g, b, w);
}
strip1.show();
strip2.show();
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisNeoPixel = currentMillis;
}
}
//Beleuchtungseffekt für Programmmodus 2 (Stabthermometer)
else if (programmode == 2) {
if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {
if(load > 63) { // Variable soll für diesen Effekt nicht größer als 63 werden
load = 63;
}
// Weißer Bereich
for (int i = 0; i < 63; i++) {
strip1.setPixelColor(i, r, g, b, 127);
strip2.setPixelColor(i, r, g, b, 127);
}
// Roter Bereich
for (int i = 63; i > (63 - load); i--) {
strip1.setPixelColor(i, 127, g, b, w);
strip2.setPixelColor(i, 127, g, b, w);
}
strip1.show();
strip2.show();
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisNeoPixel = currentMillis;
}
}
//Beleuchtungseffekt für Programmmodus 3 (Stabthermometer mit Glitzer)
else if (programmode == 3) {
if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {
if(load > 63) { // Variable soll für diesen Effekt nicht größer als 63 werden
load = 63;
}
// Blauer Bereich
for (int i = 0; i < 63; i++) {
strip1.setPixelColor(i, r, g, 127, w);
strip2.setPixelColor(i, r, g, 127, w);
}
// Roter Bereich
for (int i = 63; i > (63 - load); i--) {
strip1.setPixelColor(i, 127, g, b, w);
strip2.setPixelColor(i, 127, g, b, w);
}
// Sparkle NeoPixel-Strip 1
if(sw1)
{
strip1.setPixelColor(j, r, g, b, 255);
if(millis() - sparkle1on >= sparkle1ondelay)
{
sparkle1offdelay = random (100, 1000);
sparkle1off = millis();
sw1 = !sw1;
}
}
if(!sw1)
{
if(millis() - sparkle1off >= sparkle1offdelay)
{
j = random(0, 63);
sparkle1on = millis();
sw1 = !sw1;
}
}
// Sparkle NeoPixel-Strip 2
if(sw2)
{
strip2.setPixelColor(k, r, g, b, 255);
if(millis() - sparkle2on >= sparkle2ondelay)
{
sparkle2offdelay = random (100, 1000);
sparkle2off = millis();
sw2 = !sw2;
}
}
if(!sw2)
{
if(millis() - sparkle2off >= sparkle2offdelay)
{
k = random(0, 63);
sparkle2on = millis();
sw2 = !sw2;
}
}
// Sende die Daten an die Neopixel
strip1.show();
strip2.show();
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisNeoPixel = currentMillis;
}
}
// Wenn der Programmodus auf einen höheren Wert sprngt, wird er zurück auf 0 gesetzt und beginnt von vorne
else {
programmode = 0;
}
// Ausgabe an die serielle Schnittstelle
if ((unsigned long)(currentMillis - previousMillisSerialPrint) >= intervalSerialPrint) {
//Ausgabe der gemessenen Netzteillast an die sereille Schnittstelle
//Serial.print("Last (gemessen): "); Serial.println(rlast);
//Ausgabe der berechneten Netzteillast an die sereille Schnittstelle
Serial.print("Last (prozentual): "); Serial.print(load); Serial.println(" %");
//Ausgabe der Werte von ResponsiveAnalogRead
Serial.print("Last (getRawValue): "); Serial.println(rload.getRawValue());
Serial.print("Last (getValue): "); Serial.println(rload.getValue());
// if the repsonsive value has change, print out 'changed'
if(rload.hasChanged()) {
Serial.println("\tchanged");
}
// Ausgabe Zustand Taster
Serial.print("Taster: "); Serial.println(buttonstate);
// Ausgabe Programmzähler
Serial.print("Programm Nr.: "); Serial.println(programmode);
// Ausgabe Zufallswerte
Serial.print("Randomwert fuer j: "); Serial.println(j);
Serial.print("Randomwert fuer t1: "); Serial.println(sparkle1offdelay);
Serial.print("Randomwert fuer t2: "); Serial.println(sparkle2offdelay);
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisSerialPrint = currentMillis;
}
}
Der Sketch verwendet 9.720 Bytes (30%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes. Globale Variablen verwenden 495 Bytes (24%) des dynamischen Speichers, 1.553 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
Tags: #Arduino #NeoPixel
silentbase_neopixel/programmversion_0.7.txt · Zuletzt geändert: 18.05.2023 12:16 von 127.0.0.1