silentbase_neopixel:programmversion_0.6
NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.6
Neben kleinen Verbesserungen gegenüber der Programmversion 0.5 enthält diese Versionen einen neuen Beleuchtungseffekt: Das Stabthermometer.
ToDo: Weitere Beleuchtungseffekte programmieren.
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 tasterPin 7 // Taster
#define lastPin A0 // Spannungsteiler
#define neoPin1 11 // Neopixel-Strip rechte Seite
#define neoPin2 12 // Neopixel-Strip linke Seite
// Definiert eine Adresse im EEPROM
int addr = 0;
// Definiert die Variablen
int numPixels = 64;
//int rlast;
int last;
// Definiert ein ResponsiveAnalogRead Objekt
ResponsiveAnalogRead rlast(lastPin, true);
int tasterStatus = HIGH; // aktuelles Signal vom Eingangspin
int tasterGedrueckt = 0; // abfragen ob Taster gedrückt war
int entprellZeit = 200; // Zeit für Entprellung ggf. anpassen
float counter = 0;
int i;
byte programmmodus = 0;
// 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 tasterZeit = 0;
// Definiert die Intervalle für die IF-Abfragen
int intervalCalcLoad = 500;
int intervalNeoPixel = 50;
int intervalSerialPrint = 1000;
void setup() {
// Initialisiere den Button-Pin
pinMode(tasterPin, INPUT_PULLUP);
// Initialisiere die NeoPixel-Pins
pinMode(neoPin1, OUTPUT);
pinMode(neoPin2, OUTPUT);
// Initialisiere den analogen Pin
pinMode(lastPin, 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
programmmodus = EEPROM.read(addr);
// Initialisiere die serialle Schnittstelle
Serial.begin(57600);
delay (2000);
}
void loop() {
// Lesen und entprellen des Tasters
tasterStatus = digitalRead(tasterPin);
// Wenn der Taster gedrückt ist...
if (tasterStatus == LOW)
{
tasterZeit = millis(); // aktualisiere tasterZeit
tasterGedrueckt = 1; // speichert, dass Taster gedrückt wurde
}
// Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
if ((millis() - tasterZeit > entprellZeit) && tasterGedrueckt == 1)
{
programmmodus++; // Programmmodus wird um +1 erhöht
tasterGedrueckt = 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, programmmodus); // 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)
rlast.update();
// Berechnung der Netzteillast in Prozent
float rlastmin = 350; // Messwert bei minimaler Last
float rlastmax = 700; // Messwert bei maximaler Last
last = 100 - ((rlastmax - rlast.getValue()) / (rlastmax - rlastmin)) * 100;
if(last < 10) // Variable soll nicht kleiner als 10 Werden
{last = 10;
}
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisCalcLoad = currentMillis;
}
// Steuerung der NeoPixel-Strips
// Beleuchtungseffekt für Programmmodus 0 (Atmen rot)
if (programmmodus == 0) {
if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {
if(last < 10) { // Variable soll für diesen Effekt nicht kleiner als 10 werden
last = 10;
}
// Ansteuerung der NeoPixel-Strips
counter = counter + (0.05 * (last/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 (programmmodus == 1) {
if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {
if(last < 10) { // Variable soll für diesen Effekt nicht kleiner als 10 werden
last = 10;
}
// Ansteuerung der NeoPixel-Strips
counter = counter + (0.05 * (last/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 (programmmodus == 2) {
if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {
if(last > 63) { // Variable soll für diesen Effekt nicht größer als 63 werden
last = 63;
}
for (int i = 63; i > (63 - last); i--) {
strip1.setPixelColor(i, 127, g, b, w);
strip2.setPixelColor(i, 127, g, b, w);
}
for (int i = 0; i < (63 - last); i++) {
strip1.setPixelColor(i, r, g, b, 127);
strip2.setPixelColor(i, r, g, b, 127);
}
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 {
programmmodus = 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(last); Serial.println(" %");
//Ausgabe der Werte von ResponsiveAnalogRead
Serial.print("Last (getRawValue): "); Serial.println(rlast.getRawValue());
Serial.print("Last (getValue): "); Serial.println(rlast.getValue());
// if the repsonsive value has change, print out 'changed'
if(rlast.hasChanged()) {
Serial.println("\tchanged");
}
// Ausgabe Zustand Taster
Serial.print("Taster: "); Serial.println(tasterStatus);
// Ausgabe Programmzähler
Serial.print("Programm Nr.: "); Serial.println(programmmodus);
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisSerialPrint = currentMillis;
}
}
silentbase_neopixel/programmversion_0.6.txt · Zuletzt geändert: 18.05.2023 12:16 von 127.0.0.1