====== NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.2 ====== Eigenschaften: Programmversion 0.2 ist "multitaskingfähig". Die Abfrage der Sensordaten und die Ausgabe an die serielle Schnittstelle erfolgt zweimal pro Sekunde, die Ansteuerung der NeoPixel-Strips erfolgt 20 Mal pro Sekunde. Das Ein- und Ausblenden der LEDs erfolgt nicht linear, sondern ahmt das Ein- und Ausatmen nach (siehe dazu auch [[bewaesserungsautomat:programmversion_0.6|Bewässerungsautomat Programmversion 0.6]]).((http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/)) Die Sensordaten beeinflussen die Atemfrequenz: Je stärker das Netzteil belastet wird, desto schneller "atmen" die NeoPixel-Streifen. Die Abfrage des Tasters funktioniert, hat aber (noch) keinen Einfluss auf das Programm. ToDo: Mit dem Taster sollen verschiedene Beleuchtungseffekte ausgewählt werden können. Der Sketch enthält Code von [[https://www.baldengineer.com/millis-cookbook.html|Baldengineer]] // Bibliotheken einbinden #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 die Variablen int numPixels = 64; int rlast; int last; int atem; int taster = 1; float counter = 0; int i; // Definiert die NeoPixel 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 previousMillisNeoPixel = 0; unsigned long previousMillisReadPins = 0; // Definiert die Intervalle für die IF-Abfragen int intervalNeoPixel = 50; int intervalReadPins = 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 alle NeoPixels 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() { // Aktuelle Zeit abfragen unsigned long currentMillis = millis(); // Abfrage der analogen und digitalen Eingänge if ((unsigned long)(currentMillis - previousMillisReadPins) >= intervalReadPins) { // Auslesen des analogen Eingangs (Last Netzteil) rlast = analogRead(lastPin); // Auslesen der digitalen Eingangs (Taster) taster = digitalRead(tasterPin); // Berechnung der Netzteillast in Prozent float rlastmin = 100; // 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 //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.println(last); Serial.print(" %\t"); // Ausgabe Zustand Taster Serial.print("Taster: "); Serial.println(taster); //Speichere die aktuelle Zeit in die zughörige Variable previousMillisReadPins = currentMillis; } // Steuerung der NeoPixel 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; } } Tags: #Arduino #NeoPixel