arduino:silentbase_802_neopixel:programmversion_1
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
arduino:silentbase_802_neopixel:programmversion_1 [18.03.2023 08:27] – Frickelpiet | arduino:silentbase_802_neopixel:programmversion_1 [18.05.2023 12:34] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
+ | Diesem Programm liegt der Fire2012-Effekt von Mark Kriegsman aus der FastLED-Bibliothek zugrunde, der allerdings so umgeschrieben wurde, dass er mit der Adafruit NeoPixel-Bibliothek funktioniert. | ||
+ | < | ||
+ | // Beleuchtung BeQuiet SilentBase 802 | ||
+ | // Arduino Nano (Every) | ||
+ | |||
+ | // | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // Debug-Level | ||
+ | #define DEBUG_EFFECT | ||
+ | //#define DEBUG_SENSOR | ||
+ | |||
+ | // | ||
+ | #define NEOPIN1 | ||
+ | #define NEOPIN2 | ||
+ | #define POWERPIN | ||
+ | #define LEDPIN1 | ||
+ | #define LEDPIN2 | ||
+ | #define ONE_WIRE_BUS 11 // Datenleitung für die Temperatursensoren DS18B20 | ||
+ | |||
+ | // | ||
+ | // 9 bit resolution: 0,5°C increments, takes 94 ms for A/D conversion | ||
+ | // 10 bit resolution: 0,25°C increments, takes 188 ms for A/D conversion | ||
+ | // 11 bit resolution: 0,125°C increments, takes 375 ms for A/D conversion | ||
+ | // 12 bit resolution: 0,0625°C increments, takes 750 ms for A/D conversion | ||
+ | #define TEMPERATURE_PRECISION 11 | ||
+ | |||
+ | // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/ | ||
+ | OneWire oneWire(ONE_WIRE_BUS); | ||
+ | |||
+ | // Pass our oneWire reference to Dallas Temperature. | ||
+ | DallasTemperature sensors(& | ||
+ | |||
+ | // arrays to hold device addresses | ||
+ | DeviceAddress sensor0, sensor1, sensor2; | ||
+ | |||
+ | // Definiert die Variablen | ||
+ | int numPixels = 71; // Anzahl der NeoPixel | ||
+ | float temperature; | ||
+ | int load; // Variable repäsentiert später die Differenz zwischen minimaler und maximaler Netzteillast in Prozent | ||
+ | |||
+ | float temperature_min = 20; // Konfiguriert den unteren Grenzwert der Gehäusetemperatur | ||
+ | float temperature_max = 40; // Konfiguriert den oberen Grenzwert der Gehäusetemperatur | ||
+ | |||
+ | boolean LEDstate; | ||
+ | boolean POWERstate = 0; // Wird " | ||
+ | |||
+ | int cooling; | ||
+ | int sparkling; | ||
+ | int cooldown; | ||
+ | static byte heat[71]; | ||
+ | byte t192; // Variable für Beleuchtungseffekt Flammen | ||
+ | | ||
+ | // Definiert die NeoPixel-Strips | ||
+ | Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(numPixels, | ||
+ | Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(numPixels, | ||
+ | |||
+ | |||
+ | |||
+ | // 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 previousMillisSensors = 0; | ||
+ | unsigned long previousMillisLED = 0; | ||
+ | unsigned long previousMillisEffect = 0; | ||
+ | unsigned long previousMillisSerialPrint = 0; | ||
+ | |||
+ | // Definiert die Intervalle für die IF-Abfragen | ||
+ | int intervalSensors = 1000; // Delay für Auslesen der Temperatursensoren | ||
+ | int intervalLED = 500; // Delay für die Ausgabe der Temperatur als Blinkfrequenz der LED2 | ||
+ | int intervalEffect = 5; // Delay für Effekte | ||
+ | int intervalSerialPrint = 1000; // Delay für serielle Ausgabe | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | digitalWrite(POWERPIN, | ||
+ | Serial.begin(115200); | ||
+ | | ||
+ | // Initialisiere die NeoPixel-Pins | ||
+ | pinMode(NEOPIN1, | ||
+ | pinMode(NEOPIN2, | ||
+ | pinMode(POWERPIN, | ||
+ | pinMode(LEDPIN1, | ||
+ | pinMode(LEDPIN2, | ||
+ | | ||
+ | |||
+ | // Initialisiere die NeoPixel-Strips | ||
+ | digitalWrite(POWERPIN, | ||
+ | | ||
+ | strip1.begin(); | ||
+ | // | ||
+ | strip1.clear(); | ||
+ | | ||
+ | strip2.begin(); | ||
+ | // | ||
+ | strip2.clear(); | ||
+ | | ||
+ | // Start up the library | ||
+ | sensors.begin(); | ||
+ | |||
+ | // locate devices on the bus | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(sensors.getDeviceCount(), | ||
+ | Serial.println(" | ||
+ | |||
+ | // Search for devices on the bus and assign based on an index. Ideally, | ||
+ | // you would do this to initially discover addresses on the bus and then | ||
+ | // use those addresses and manually assign them (see above) once you know | ||
+ | // the devices on your bus (and assuming they don't change). | ||
+ | // | ||
+ | // method 1: by index | ||
+ | if (!sensors.getAddress(sensor0, | ||
+ | if (!sensors.getAddress(sensor1, | ||
+ | if (!sensors.getAddress(sensor2, | ||
+ | |||
+ | // show the addresses we found on the bus | ||
+ | Serial.print(" | ||
+ | printAddress(sensor0); | ||
+ | Serial.println(); | ||
+ | |||
+ | Serial.print(" | ||
+ | printAddress(sensor1); | ||
+ | Serial.println(); | ||
+ | |||
+ | Serial.print(" | ||
+ | printAddress(sensor2); | ||
+ | Serial.println(); | ||
+ | | ||
+ | // set the resolution to 11 bit per device | ||
+ | sensors.setResolution(sensor0, | ||
+ | sensors.setResolution(sensor1, | ||
+ | sensors.setResolution(sensor2, | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.println(sensors.getResolution(sensor0), | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.println(sensors.getResolution(sensor1), | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.println(sensors.getResolution(sensor2), | ||
+ | |||
+ | delay (2000); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // Aktuelle Zeit abfragen | ||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | // Schaltet die NeoPixel ein und initialisiert die NeoPixel | ||
+ | if(POWERstate == 0) { | ||
+ | POWERstate = 1; | ||
+ | digitalWrite(LEDPIN1, | ||
+ | /* | ||
+ | digitalWrite(POWERPIN, | ||
+ | | ||
+ | strip1.begin(); | ||
+ | strip1.show(); | ||
+ | // | ||
+ | | ||
+ | strip2.begin(); | ||
+ | strip2.show(); | ||
+ | // | ||
+ | */ | ||
+ | } | ||
+ | |||
+ | // Auslesen der Temperatursensoren und Berechnen einiger Variablen zur Beeinflussung des Effekts | ||
+ | if ((unsigned long)(currentMillis - previousMillisSensors) >= intervalSensors) { | ||
+ | | ||
+ | // Request to all devices on the bus | ||
+ | // | ||
+ | unsigned long start = micros(); | ||
+ | sensors.setWaitForConversion(false); | ||
+ | sensors.requestTemperatures(); | ||
+ | sensors.setWaitForConversion(true); | ||
+ | unsigned long stop = micros(); | ||
+ | | ||
+ | #ifdef DEBUG_SENSOR | ||
+ | Serial.print(" | ||
+ | Serial.print(stop - start); | ||
+ | Serial.println(" | ||
+ | |||
+ | // print the device information | ||
+ | printData(sensor0); | ||
+ | printData(sensor1); | ||
+ | printData(sensor2); | ||
+ | #endif | ||
+ | | ||
+ | // Berechnen der höchsten Temperatur an den verfügbaren Sensoren | ||
+ | float tempSensor0 = sensors.getTempC(sensor0); | ||
+ | float tempSensor1 = sensors.getTempC(sensor1); | ||
+ | float tempSensor2 = sensors.getTempC(sensor2); | ||
+ | |||
+ | temperature = 0; | ||
+ | temperature = tempSensor0; | ||
+ | if(tempSensor1 > temperature) { | ||
+ | temperature = tempSensor1; | ||
+ | } | ||
+ | if(tempSensor2 > temperature) { | ||
+ | temperature = tempSensor2; | ||
+ | } | ||
+ | #ifdef DEBUG_SENSOR | ||
+ | Serial.print(" | ||
+ | Serial.print(temperature); | ||
+ | Serial.println(" | ||
+ | #endif | ||
+ | | ||
+ | // Berechenen der Blinkfrequenz von LED2 | ||
+ | if(temperature < temperature_min) { | ||
+ | temperature = temperature_min; | ||
+ | } | ||
+ | if(temperature > temperature_max) { | ||
+ | temperature = temperature_max; | ||
+ | } | ||
+ | intervalLED = map(temperature, | ||
+ | #ifdef DEBUG_SENSOR | ||
+ | Serial.print(" | ||
+ | #endif | ||
+ | | ||
+ | // Berechnung der Netzteillast in Prozent: Bei ruhendem Desktop soll der Wert 0 sein, bei maximaler Auslastung 100 | ||
+ | load = map(temperature, | ||
+ | |||
+ | // Berechnung von Cooling für den Effekt Fire 2012: Legt fest, wie stark die aufsteigenden Flammen abkühlen | ||
+ | // Werte zwischen 20 und 100 sollen am hübschesten sein, ein guter Standard ist 50 | ||
+ | cooling = map(temperature, | ||
+ | |||
+ | // Berechnung von Sparkling für den Effekt Fire2012: Legt fest, wie oft ein Funke auflohdert | ||
+ | //Werte zwischen 50 und 200 sollen am hübschesten sein, ein guter Standard ist 120 | ||
+ | sparkling = map(temperature, | ||
+ | |||
+ | #ifdef DEBUG_EFFECT | ||
+ | // | ||
+ | Serial.print(load); | ||
+ | // | ||
+ | Serial.print(cooling); | ||
+ | // | ||
+ | Serial.println(sparkling); | ||
+ | #endif | ||
+ | | ||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisSensors = currentMillis; | ||
+ | } | ||
+ | |||
+ | |||
+ | // Ausgabe der Temperatur als Blinkfrequenz der LED1 | ||
+ | if ((unsigned long)(currentMillis - previousMillisLED) >= intervalLED) { | ||
+ | |||
+ | if(LEDstate == 0) { | ||
+ | digitalWrite(LEDPIN2, | ||
+ | // | ||
+ | LEDstate = 1; | ||
+ | } | ||
+ | else if(LEDstate == 1) { | ||
+ | digitalWrite(LEDPIN2, | ||
+ | // | ||
+ | LEDstate = 0; | ||
+ | } | ||
+ | | ||
+ | | ||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisLED = currentMillis; | ||
+ | } | ||
+ | |||
+ | |||
+ | // Feuer-Effekt | ||
+ | if ((unsigned long)(currentMillis - previousMillisEffect) >= intervalEffect) { | ||
+ | |||
+ | // Step 1. Cool down every cell a little | ||
+ | for(int i = 0; i < numPixels; i++) { | ||
+ | cooldown = random(0, ((cooling * 10) / numPixels) + 2); | ||
+ | | ||
+ | if(cooldown > heat[i]) { | ||
+ | heat[i] = 0; | ||
+ | } else { | ||
+ | heat[i] = heat[i] - cooldown; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Step 2. Heat from each cell drifts ' | ||
+ | if( t192 > 0x80) { // hottest | ||
+ | for(int k = numPixels - 1; k >= 2; k--) { | ||
+ | heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3; // muss noch angepasst werden | ||
+ | } | ||
+ | } else if( t192 > 0x40 ) { // middle | ||
+ | for(int k = numPixels - 1; k >= 2; k--) { | ||
+ | heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3; // muss noch angepasst werden | ||
+ | } | ||
+ | } else { // coolest | ||
+ | for(int k = numPixels - 1; k >= 2; k--) { | ||
+ | heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3; // muss noch angepasst werden | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | // Step 3. Randomly ignite new ' | ||
+ | if(random(255) < sparkling) { | ||
+ | int l = random(7); | ||
+ | heat[l] = heat[l] + random(160, | ||
+ | //heat[l] = random(160, | ||
+ | } | ||
+ | |||
+ | // Step 4. Convert heat to LED colors | ||
+ | for(int j = numPixels -1; j >= 0; j--) { | ||
+ | // Scale ' | ||
+ | t192 = round((heat[j] | ||
+ | |||
+ | // calculate ramp up from | ||
+ | byte heatramp = t192 & 0x3F; // 0..63 | ||
+ | heatramp <<= 2; // scale up to 0..252 | ||
+ | |||
+ | // figure out which third of the spectrum we're in: | ||
+ | if( t192 > 0x80) { // hottest | ||
+ | strip1.setPixelColor(map(j, | ||
+ | strip2.setPixelColor(map(j, | ||
+ | } else if( t192 > 0x40 ) { // middle | ||
+ | strip1.setPixelColor(map(j, | ||
+ | strip2.setPixelColor(map(j, | ||
+ | } else { // coolest | ||
+ | strip1.setPixelColor(map(j, | ||
+ | strip2.setPixelColor(map(j, | ||
+ | } | ||
+ | } | ||
+ | strip1.show(); | ||
+ | strip2.show(); | ||
+ | | ||
+ | | ||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisEffect = currentMillis; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | // function to print a device address | ||
+ | void printAddress(DeviceAddress deviceAddress) | ||
+ | { | ||
+ | for (uint8_t i = 0; i < 8; i++) | ||
+ | { | ||
+ | // zero pad the address if necessary | ||
+ | if (deviceAddress[i] < 16) Serial.print(" | ||
+ | Serial.print(deviceAddress[i], | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // function to print the temperature for a device | ||
+ | void printTemperature(DeviceAddress deviceAddress) | ||
+ | { | ||
+ | float tempC = sensors.getTempC(deviceAddress); | ||
+ | Serial.print(" | ||
+ | Serial.print(tempC); | ||
+ | } | ||
+ | |||
+ | // function to print a device' | ||
+ | void printResolution(DeviceAddress deviceAddress) | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.print(sensors.getResolution(deviceAddress)); | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | // main function to print information about a device | ||
+ | void printData(DeviceAddress deviceAddress) | ||
+ | { | ||
+ | Serial.print(" | ||
+ | printAddress(deviceAddress); | ||
+ | Serial.print(" | ||
+ | printTemperature(deviceAddress); | ||
+ | Serial.println(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | {{tag> |
arduino/silentbase_802_neopixel/programmversion_1.1679124420.txt.gz · Zuletzt geändert: 18.05.2023 12:16 (Externe Bearbeitung)