====== NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.6 ====== Neben kleinen Verbesserungen gegenüber der [[silentbase_neopixel:programmversion_0.5|Programmversion 0.5]] enthält diese Versionen einen neuen Beleuchtungseffekt: Das Stabthermometer. ToDo: Weitere Beleuchtungseffekte programmieren. Der Sketch enthält Code von [[https://www.baldengineer.com/millis-cookbook.html|Baldengineer]] und [[http://www.scynd.de/tutorials/arduino-tutorials/1-taster/1-2-taster-entprellt.html|Scynd]]. // Bibliotheken einbinden #include #include #include // 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; } }