silentbase_neopixel:programmversion_0.5
NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.5
Diese Programmversion bindet die Bibliothek ResponsiveAnalogRead ein, um die Messwerte an dem analogen Eingang zu glätten. Ist das nötig? Eher nicht. Aber wenn es doch so einfach ist … Und der Algorhythmus funktioniert wirklich perfekt.
Ältere Programmversionen:
Hilfreiche Links:
ToDo: Es sind jetzt alle Funktionen integriert, die geplant waren. Jetzt müssten noch ein paar coole Beleuchtungseffekte programmiert werden.
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 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 = 1000; 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; //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 * (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) { // 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; } } // 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; } }
Tags: #Arduino #NeoPixel
silentbase_neopixel/programmversion_0.5.txt · Zuletzt geändert: 18.05.2023 12:16 von 127.0.0.1