Benutzer-Werkzeuge

Webseiten-Werkzeuge


silentbase_neopixel:programmversion_0.6

NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.6

Neben kleinen Verbesserungen gegenüber der Programmversion 0.5 enthält diese Versionen einen neuen Beleuchtungseffekt: Das Stabthermometer.

ToDo: Weitere Beleuchtungseffekte programmieren.

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 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;
   }

}
silentbase_neopixel/programmversion_0.6.txt · Zuletzt geändert: 18.05.2023 12:16 von 127.0.0.1