Benutzer-Werkzeuge

Webseiten-Werkzeuge


silentbase_neopixel:programmversion_0.5

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
silentbase_neopixel:programmversion_0.5 [14.11.2016 17:59] Frickelpietsilentbase_neopixel:programmversion_0.5 [18.05.2023 12:16] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 ====== NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.5 ====== ====== NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.5 ======
-Diese Programmversion wird einen weiteren Beleuchtungseffekt hinzufügenAUßerdem sollen die Messerte des analogen Eingangs gemittelt werden.+Diese Programmversion bindet die Bibliothek [[https://github.com/dxinteractive/ResponsiveAnalogRead|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: 
 +  * [[silentbase_neopixel:Programmversion 0.2]] 
 +  * [[silentbase_neopixel:Programmversion 0.3]] 
 +  * [[silentbase_neopixel:Programmversion 0.4]]
  
 Hilfreiche Links: Hilfreiche Links:
   * https://www.arduino.cc/en/Tutorial/Smoothing   * https://www.arduino.cc/en/Tutorial/Smoothing
 +  * http://damienclarke.me/code/posts/writing-a-better-noise-reducing-analogread
   * https://github.com/dxinteractive/ResponsiveAnalogRead   * https://github.com/dxinteractive/ResponsiveAnalogRead
  
 +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 [[https://www.baldengineer.com/millis-cookbook.html|Baldengineer]] und [[http://www.scynd.de/tutorials/arduino-tutorials/1-taster/1-2-taster-entprellt.html|Scynd]].
 +<code>
 +// 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;
 +   }
 +
 +}
 +</code>
 Tags: #Arduino #NeoPixel Tags: #Arduino #NeoPixel
silentbase_neopixel/programmversion_0.5.1479142774.txt.gz · Zuletzt geändert: 18.05.2023 09:09 (Externe Bearbeitung)