silentbase_neopixel:programmversion_0.3
NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.3
In Programmversion 0.3 wird der Taster an der Gehäusefront regelmäßig abgefragt. Der Taster ist entprellt, und es ist egal, wie lange er gedrückt wird. Bei jedem Tastendruck wird ein Zähler um den Wert 1 erhöht und ein entsprechendes Beleuchtungsprogramm aufgerufen. In diesem Sketch kann zwischen einem roten und einem weißen Atemeffekt gewechselt werden. Hier geht es zu Programmversion 0.2.
Hilfreiche Links:
ToDo: Es wäre schön, wenn der Arduino sich den zuletzt ausgewählte Programmmodus merken würde.
Der Sketch enthält Code von Baldengineer und Scynd.
// Bibliotheken einbinden
#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 die Variablen
int numPixels = 64;
int rlast;
int last;
int atem;
int tasterStatus = HIGH; // aktuelles Signal vom Eingangspin
int tasterGedrueckt = 0; // abfragen ob Taster gedrückt war
int entprellZeit = 200; // Zeit für Entprellung, anpassen!
float counter = 0;
int i;
int 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 = 2000;
int intervalNeoPixel = 50;
int intervalSerialPrint = 500;
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
// 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
}
// 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 = analogRead(lastPin);
// Berechnung der Netzteillast in Prozent
float rlastmin = 350; // Messwert bei minimaler Last
float rlastmax = 1023; // Messwert bei maximaler Last
last = 100 - ((rlastmax - rlast) / (rlastmax - rlastmin)) * 100;
// Berechnung der Atemgeschwindigkeit
atem = last/200; // Der Wert kann theoretisch zwischen 0 und 0,5 variieren und die Geschwindigkeit des Atemeffekts beschleunigen
//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) {
// Ansteuerung der NeoPixel-Strips
counter = counter + (0.05 + atem);
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) {
// Ansteuerung der NeoPixel-Strips
counter = counter + (0.05 + atem);
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;
}
}
// 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 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;
}
}
Tags: #Arduino #NeoPixel
silentbase_neopixel/programmversion_0.3.txt · Zuletzt geändert: 18.05.2023 12:16 von 127.0.0.1