Benutzer-Werkzeuge

Webseiten-Werkzeuge


silentbase_neopixel:programmversion_0.4

NeoPixel-Beleuchtung für SilentBase 800 Programmversion 0.4

Diese Programmversion speichert den ausgewählten Programmmodus in das EEPROM. Nach einem Neustart wird der letzte Programmmodus wieder aufgerufen. Es können theoretisch 256 Programmmodi gespeichert werden.

Ältere Programmversionen:

Hilfreiche Links:

ToDo: Jetzt müssen noch ein paar coole Beleuchtungseffekte programmiert werden. Außerdem könnte man die Messwerte am analogen Eingang glätten.

Der Sketch enthält Code von Baldengineer und Scynd.

// Bibliotheken einbinden
#include <EEPROM.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;

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 = 2000;
int intervalNeoPixel = 50;
int intervalSerialPrint = 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 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 = analogRead(lastPin);

     // Berechnung der Netzteillast in Prozent
     float rlastmin = 350; // Messwert bei minimaler Last
     float rlastmax = 700; // Messwert bei maximaler Last
     last = 100 - ((rlastmax - rlast) / (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 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;
   }

}

Tags: #Arduino #NeoPixel

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