Benutzer-Werkzeuge

Webseiten-Werkzeuge


silentbase_neopixel:programmversion_0.8

NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.8

Gegenüber Programmversion 0.7 enthält dieser Sketch kleinere Verbesserungen am Code und zwei neue Effekte. Beide sollen Feuer nachahmen. Der Effekt Nr. 5 könnte ganz gut bei einer waagerechten Anordnung aussehen.1) In eine zukünftige Version 1.0 würde er es so nicht schaffen. Effekt Nr. 6 ist auch ganz gut gelungen. Der Effekt ist von der Variable load abhängig: Bei ruhendem Desktop lodern die Flammen 15 bis 20 Pixel hoch, bei voller Last schladen sie bis nach oben.

Der Sketch enthält Code von Baldengineer, Scynd und http://www.walltech.cc.

// Bibliotheken einbinden
#include <EEPROM.h>
#include <ResponsiveAnalogRead.h>
#include <Adafruit_NeoPixel.h>


// Definiert die Pins
#define buttonPin 7           // Taster
#define loadPin A0            // analoge Spannungsmessung
#define neoPin1 11            // Neopixel-Strip rechte Seite
#define neoPin2 12            // Neopixel-Strip linke Seite


// Definiert eine Adresse im EEPROM
int addr = 0;                 // An dieser Adresse wird später der ausgewählte Programmmodus gespeichert


// Definiert ein ResponsiveAnalogRead Objekt
ResponsiveAnalogRead rload(loadPin, true);


// Definiert die Variablen
int numPixels = 64;           // Anzahl der NeoPixel
int load;                     // Variable repäsentiert später die Differenz zwischen minimaler und maximaler Netzteillast in Prozent

int buttonstate = HIGH;       // aktuelles Signal vom Tasterpin
int buttonpressed = 0;        // abfragen ob Taster gedrückt war
int debouncetime = 50;       // Zeit für Entprellung ggf. anpassen

float rloadmin = 350;         // Messwert am loadPin bei minimaler Netzteillast
float rloadmax = 650;         // Messwert am loadPin bei maximaler Netzteillast

float x = 0;                  // Zählwert für verschiedene Beleuchtungseffekte 
boolean sw1 = true;           // Schaltvariable für verschiedene Beleuchtungseffekte
boolean sw2 = true;           // Schaltvariable für verschiedene Beleuchtungseffekte
int i;                        // Zählwert für verschiedene Beleuchtungseffekte
int j;                        // Zählwert für verschiedene Beleuchtungseffekte
int k;                        // Zählwert für verschiedene Beleuchtungseffekte

byte programmode = 0;         // Programmmodus

// 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 buttontime = 0;
unsigned long sparkle1on = 0;
unsigned long sparkle1off = 0;
unsigned long sparkle1ondelay = 100;
unsigned long sparkle1offdelay = 500;
unsigned long sparkle2on = 0;
unsigned long sparkle2off = 0;
unsigned long sparkle2ondelay = 100;
unsigned long sparkle2offdelay = 500;


// Definiert die Intervalle für die IF-Abfragen
int intervalCalcLoad = 500;      // Delay für Berechnung der Last
int intervalNeoPixel = 50;       // Delay für Ansteuerung der NeoPixel
int intervalSerialPrint = 1000;  // Delay für serielle Ausgabe


void setup() {
  // Initialisiere den Button-Pin
  pinMode(buttonPin, INPUT_PULLUP);

  // Initialisiere die NeoPixel-Pins
  pinMode(neoPin1, OUTPUT);
  pinMode(neoPin2, OUTPUT);

  // Initialisiere den analogen Pin 
  pinMode(loadPin, 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
  programmode = EEPROM.read(addr);

  // Initialisiere die serialle Schnittstelle
  Serial.begin(57600);

delay (2000);
}



void loop() {
// Lesen und entprellen des Tasters
  buttonstate = digitalRead(buttonPin);
 
  // Wenn der Taster gedrückt ist...
  if (buttonstate == LOW)
  {
    buttontime = millis();                      // aktualisiere tasterZeit
    buttonpressed = 1;                          // speichert, dass Taster gedrückt wurde
  }
 
  // Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
  if ((millis() - buttontime > debouncetime) && buttonpressed == 1)
    {
      buttonpressed = 0;                        // setzt gedrückten Taster zurück
      programmode++;                            // Programmmodus wird um +1 erhöht
      EEPROM.write(addr, programmode);          // Schreibt den Programmmodus ins EEPROM
      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
      strip1.clear();                           // setzt die NeoPixel zurück
      strip2.clear();                           // setzt die NeoPixel zurück
    }


// 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)
     rload.update();

     // Berechnung der Netzteillast in Prozent
     load = 100 - ((rloadmax - rload.getValue()) / (rloadmax - rloadmin)) * 100;
     
  //Speichere die aktuelle Zeit in die zughörige Variable
  previousMillisCalcLoad = currentMillis;
  }



// Steuerung der NeoPixel-Strips
  // Beleuchtungseffekt für Programmmodus 0 (Atmen rot)
  if (programmode == 0) {
    if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {

     if(load < 10) {       // Variable soll für diesen Effekt nicht kleiner als 10 werden
        load = 10;
        }
        
      // Ansteuerung der NeoPixel-Strips
      x = x + (0.05 * (load/10));
      if (x >= 6.28) {
        x = 0;
      }
        // fade led mit x
        r = ((exp(sin(x)) - 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 (programmode == 1) {
    if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {

     if(load < 10) {       // Variable soll für diesen Effekt nicht kleiner als 10 werden
        load = 10;
        }
        
      // Ansteuerung der NeoPixel-Strips
      x = x + (0.05 * (load/10));
      if (x >= 6.28) {
        x = 0;
      }
        // fade led mit x
        w = ((exp(sin(x)) - 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 (programmode == 2) {
    if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {

      if(load >= numPixels) {       // Variable soll für diesen Effekt nicht größer als NeoPixel vorhanden
        load = 63;
        }
      // Weißer Bereich
      for (int i = 0; i < numPixels; i++) {
      strip1.setPixelColor(i, r, g, b, 127);
      strip2.setPixelColor(i, r, g, b, 127);
      }
      // Roter Bereich      
      for (int i = 63; i > (63 - load); i--) {
        strip1.setPixelColor(i, 127, g, b, w);
        strip2.setPixelColor(i, 127, g, b, w);
      }
      strip1.show();
      strip2.show();
   
    //Speichere die aktuelle Zeit in die zughörige Variable
    previousMillisNeoPixel = currentMillis;
    }
  }


  //Beleuchtungseffekt für Programmmodus 3 (Stabthermometer mit Glitzer)
  else if (programmode == 3) {
    if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {

      if(load >= numPixels) {       // Variable soll für diesen Effekt nicht größer als NeoPixel vorhanden
        load = 63;
        }
      // Blauer Bereich
      for (int i = 0; i < numPixels; i++) {
      strip1.setPixelColor(i, r, g, 127, w);
      strip2.setPixelColor(i, r, g, 127, w);
      }
      // Roter Bereich     
      for (int i = 63; i > (63 - load); i--) {
        strip1.setPixelColor(i, 127, g, b, w);
        strip2.setPixelColor(i, 127, g, b, w);
      }

      // Sparkle NeoPixel-Strip 1
      if(sw1)
        {
          strip1.setPixelColor(j, r, g, b, 255);
          if(millis() - sparkle1on >= sparkle1ondelay)
          {
          sparkle1offdelay = random (100, 1000);
          sparkle1off = millis();
          sw1 = !sw1;
          }
        }
        if(!sw1)
          {
          if(millis() - sparkle1off >= sparkle1offdelay)
              {
                j = random(0, (numPixels -1));
                sparkle1on = millis();
                sw1 = !sw1;       
              }
        } 
      // Sparkle NeoPixel-Strip 2
      if(sw2)
        {
          strip2.setPixelColor(k, r, g, b, 255);
          if(millis() - sparkle2on >= sparkle2ondelay)
          {
          sparkle2offdelay = random (100, 1000);
          sparkle2off = millis();
          sw2 = !sw2;
          }
        }
        if(!sw2)
          {
          if(millis() - sparkle2off >= sparkle2offdelay)
              {
                k = random(0, (numPixels - 1));
                sparkle2on = millis();
                sw2 = !sw2;       
              }
        } 
      // Sende die Daten an die Neopixel
      strip1.show();
      strip2.show();
   
    //Speichere die aktuelle Zeit in die zughörige Variable
    previousMillisNeoPixel = currentMillis;
    }
  }


    //Beleuchtungseffekt für Programmmodus 4 (Feuer 1)
  else if (programmode == 4) {
    if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {

      for (int i = 0; i < numPixels; i++) {
        int flicker = random (0, 150);
        int r = 255;
        int g = r-100;
        int b = 30;
        
        r = r - flicker;
        g = g - flicker;
        b = b - flicker;

        if(r < 0) r = 0;
        if(g < 0) g = 0;
        if(b < 0) b = 0;
        
      strip1.setPixelColor(i, r, g, b, 0);
      strip2.setPixelColor(i, r, g, b, 0);
      }
      // Sende die Daten an die Neopixel
      strip1.show();
      strip2.show();
   
    //Speichere die aktuelle Zeit in die zughörige Variable
    previousMillisNeoPixel = currentMillis;
    }
  }


    //Beleuchtungseffekt für Programmmodus 5 (Feuer 2)
  else if (programmode == 5) {
    if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) {

      if(load >= numPixels) {       // Variable soll für diesen Effekt nicht größer als NeiPoxel vorhanden
        load = 63;
        }
        int r = 255;
        int g = 130;
        int b = 30;
        int w = 63;

      for (int i = (numPixels -1); i > 0; i--) {
        int flicker = random (0, (42 - (load/2)));

        r = r - flicker;
        g = g - flicker;
        b = b - flicker;
        w = w - (flicker * 3);
        
        if(r < 0) r = 0;
        if(g < 0) g = 0;
        if(b < 0) b = 0;
        if(w < 0) w = 0;
        
      strip1.setPixelColor(i, r, g, b, w);
      strip2.setPixelColor(i, r, g, b, w);
      }
      // Sende die Daten an die Neopixel
      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 {
    programmode = 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(load); Serial.println(" %");

     //Ausgabe der Werte von ResponsiveAnalogRead
     Serial.print("Last (getRawValue): "); Serial.println(rload.getRawValue());
     Serial.print("Last (getValue): "); Serial.println(rload.getValue());
  
     // if the repsonsive value has change, print out 'changed'
     if(rload.hasChanged()) {
     Serial.println("\tchanged");
     }
     
     // Ausgabe Zustand Taster
     Serial.print("Taster: "); Serial.println(buttonstate);

     // Ausgabe Programmzähler
     Serial.print("Programm Nr.: "); Serial.println(programmode);

     // Ausgabe Zufallswerte
     Serial.print("Randomwert fuer j: "); Serial.println(j);
     Serial.print("Randomwert fuer t1: "); Serial.println(sparkle1offdelay);
     Serial.print("Randomwert fuer t2: "); Serial.println(sparkle2offdelay);

   //Speichere die aktuelle Zeit in die zughörige Variable
   previousMillisSerialPrint = currentMillis;
   }

}

Der Sketch verwendet 10.312 Bytes (31%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes. Globale Variablen verwenden 495 Bytes (24%) des dynamischen Speichers, 1.553 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.

Tags: #Arduino # NeoPixel

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