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

Auf dieser Seite werden Cookies für die Bereitstellung personalisierter Inhalte und die Seitenanalyse mit Matomo verwendet. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Computer gespeichert werden. Weitere Information
silentbase_neopixel/programmversion_0.8.txt · Zuletzt geändert: 21.11.2016 16:52 von Frickelpiet