bewaesserungsautomat:programmversion_0.5
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungLetzte ÜberarbeitungBeide Seiten der Revision | ||
bewaesserungsautomat:programmversion_0.5 [11.06.2016 14:40] – Frickelpiet | bewaesserungsautomat:programmversion_0.5 [24.06.2016 22:05] – Frickelpiet | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Programmversion 0.5 ====== | + | ====== |
- | Nein, bei der Nummerirung der Programmversionen hat sich kein Fehler eingeschlichen: | + | <box 100% round red|**Achtung!**> |
+ | |||
+ | Programmversion | ||
Hilfreiche Links: | Hilfreiche Links: | ||
* https:// | * https:// | ||
* http:// | * http:// | ||
- | * https:// | ||
- | * https:// | ||
- | * http:// | ||
* http:// | * http:// | ||
* https:// | * https:// | ||
Zeile 13: | Zeile 12: | ||
* https:// | * https:// | ||
+ | Der folgende Code läuft, allerdings nicht ganz rund: Der Fading-Effekt hakelt etwas. Durch einige Optimierungen des Programms konnte das Hakeln gemildert werden, ganz verschwunden ist es aber noch nicht. | ||
+ | |||
+ | Was noch zu tun ist: | ||
+ | * Der Fading-Effekt muss geschmeidiger laufen. | ||
+ | |||
+ | < | ||
+ | // Bibliotheken einbinden | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | // Definiert die Pins für die NeoPixel | ||
+ | #define neoPin1 36 // Neopixel an Blumenkastenensor 1 | ||
+ | #define neoPin2 38 // Neopixel an Blumenkastenensor 2 | ||
+ | #define neoPin3 40 // Neopixel an Blumenkastenensor 3 | ||
+ | #define neoPin4 42 // Neopixel an Blumenkastenensor 4 | ||
+ | #define neoPin5 44 // Neopixelring am Wasserstandssensor im Vorratsbehälter | ||
+ | #define neoPin6 48 // Neopixelring im Gehäusedeckel | ||
+ | //#define neoPin6 = 50 // Reserviert für Erweiterungen | ||
+ | |||
+ | // Definiert die NeoPixel | ||
+ | Adafruit_NeoPixel neopix1 = Adafruit_NeoPixel(1, | ||
+ | Adafruit_NeoPixel neopix2 = Adafruit_NeoPixel(1, | ||
+ | Adafruit_NeoPixel neopix3 = Adafruit_NeoPixel(1, | ||
+ | Adafruit_NeoPixel neopix4 = Adafruit_NeoPixel(1, | ||
+ | Adafruit_NeoPixel neopix5 = Adafruit_NeoPixel(12, | ||
+ | Adafruit_NeoPixel neopix6 = Adafruit_NeoPixel(24, | ||
+ | |||
+ | // pass in a number for the sensor identifier (for your use later) | ||
+ | Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591); | ||
+ | |||
+ | // Definiert die Pins für die Hall-Sensoren | ||
+ | #define hallPin1 35 // Hall-Sensor 1 | ||
+ | #define hallPin2 33 // Hall-Sensor 2 | ||
+ | #define hallPin3 31 // Hall-Sensor 3 | ||
+ | #define hallPin4 29 // Hall-Sensor 4 | ||
+ | |||
+ | // Definiert die Pins für die Verfügbarkeitskontrolle | ||
+ | #define massePin1 47 // Masse an Blumenkastenensor 1 | ||
+ | #define massePin2 49 // Masse an Blumenkastenensor 2 | ||
+ | #define massePin3 51 // Masse an Blumenkastenensor 3 | ||
+ | #define massePin4 53 // Masse an Blumenkastenensor 4 | ||
+ | |||
+ | |||
+ | // Definiert die Pins des Wasserstandssensor für den Vorratsbehälter | ||
+ | #define refPin A0 // Rref | ||
+ | #define levelPin A1 // Rsense | ||
+ | |||
+ | // Definiert den Pin für den DHT22 | ||
+ | #define dhtPin 28 | ||
+ | |||
+ | // Definiert den angeschlossenen Sensor | ||
+ | #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321) | ||
+ | |||
+ | // Initialisiert den DHT-Sensor | ||
+ | DHT dht(dhtPin, DHTTYPE); | ||
+ | |||
+ | // Definiert die Variablen | ||
+ | int hall1 = LOW; | ||
+ | int hall2 = LOW; | ||
+ | int hall3 = LOW; | ||
+ | int hall4 = LOW; | ||
+ | |||
+ | int masse1 = LOW; | ||
+ | int masse2 = LOW; | ||
+ | int masse3 = LOW; | ||
+ | int masse4 = LOW; | ||
+ | |||
+ | int rlevel; | ||
+ | int rref; | ||
+ | int level; | ||
+ | float h; | ||
+ | float t; | ||
+ | float taupunkt; | ||
+ | |||
+ | uint16_t ir; | ||
+ | uint16_t full; | ||
+ | uint32_t lum; | ||
+ | |||
+ | float brightness = 127; | ||
+ | |||
+ | byte green; | ||
+ | byte red; | ||
+ | byte blue; | ||
+ | |||
+ | boolean | ||
+ | boolean | ||
+ | boolean | ||
+ | boolean | ||
+ | |||
+ | // Definiert die Tracking-Variablen für die IF-Abfragen | ||
+ | unsigned long previousMillisNeoPixel = 0; | ||
+ | unsigned long previousMillisWaterPumps = 0; | ||
+ | unsigned long previousMillisTankSensor = 0; | ||
+ | unsigned long previousMillisSerialWrite = 0; | ||
+ | |||
+ | // Definiert die Intervalle für die IF-Abfragen | ||
+ | int intervalNeoPixel = 10; | ||
+ | int intervalWaterPumps = 500; | ||
+ | int intervalTankSensor = 500; | ||
+ | int intervalSerialWrite = 2000; | ||
+ | |||
+ | byte counter = 0; | ||
+ | boolean sw = true; | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | // Initialisiere die NeoPixel-Pins | ||
+ | pinMode(neoPin1, | ||
+ | pinMode(neoPin2, | ||
+ | pinMode(neoPin3, | ||
+ | pinMode(neoPin4, | ||
+ | pinMode(neoPin5, | ||
+ | pinMode(neoPin6, | ||
+ | |||
+ | // Initialisiere die Hall-Pins als Inputs mit Pullup. Außerdem werden die internen Pullup-Widerstände aktiviert. | ||
+ | // Liegt an dem Hall-Sensor ein Magnetfeld an, ist der Input LOW, ansonsten ist der Input HIGH. | ||
+ | pinMode(hallPin1, | ||
+ | pinMode(hallPin2, | ||
+ | pinMode(hallPin3, | ||
+ | pinMode(hallPin4, | ||
+ | |||
+ | pinMode(massePin1, | ||
+ | pinMode(massePin2, | ||
+ | pinMode(massePin3, | ||
+ | pinMode(massePin4, | ||
+ | | ||
+ | // | ||
+ | pinMode(dhtPin, | ||
+ | |||
+ | // Initialisiere den Wasserstandssensor | ||
+ | pinMode(rlevel, | ||
+ | pinMode(rref, | ||
+ | |||
+ | |||
+ | // Initialisiere alle NeoPixels | ||
+ | neopix1.begin(); | ||
+ | neopix1.show(); | ||
+ | neopix2.begin(); | ||
+ | neopix2.show(); | ||
+ | neopix3.begin(); | ||
+ | neopix3.show(); | ||
+ | neopix4.begin(); | ||
+ | neopix4.show(); | ||
+ | neopix5.begin(); | ||
+ | neopix5.show(); | ||
+ | neopix6.begin(); | ||
+ | neopix6.show(); | ||
+ | |||
+ | |||
+ | // Konfiguration des TSL2591 | ||
+ | // You can change the gain on the fly, to adapt to brighter/ | ||
+ | // | ||
+ | tsl.setGain(TSL2591_GAIN_MED); | ||
+ | // tsl.setGain(TSL2591_GAIN_HIGH); | ||
+ | | ||
+ | // Changing the integration time gives you a longer time over which to sense light | ||
+ | // longer timelines are slower, but are good in very low light situtations! | ||
+ | tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS); | ||
+ | // tsl.setTiming(TSL2591_INTEGRATIONTIME_200MS); | ||
+ | // tsl.setTiming(TSL2591_INTEGRATIONTIME_300MS); | ||
+ | // tsl.setTiming(TSL2591_INTEGRATIONTIME_400MS); | ||
+ | // tsl.setTiming(TSL2591_INTEGRATIONTIME_500MS); | ||
+ | // tsl.setTiming(TSL2591_INTEGRATIONTIME_600MS); | ||
+ | |||
+ | | ||
+ | // Initialisiere die serialle Schnittstelle | ||
+ | Serial.begin(9600); | ||
+ | |||
+ | // | ||
+ | dht.begin(); | ||
+ | tsl.begin(); | ||
+ | |||
+ | delay(2000); | ||
+ | // Perspektivisch könnte eine Startanimation des NeoPixel-Rings die Wartezeit verkürzen. | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // Aktuelle Zeit abfragen | ||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | |||
+ | // Abfrage der analogen und digitalen Eingänge und Steuerung der Pumpen | ||
+ | if ((unsigned long)(currentMillis - previousMillisWaterPumps) >= intervalWaterPumps) { | ||
+ | | ||
+ | | ||
+ | // Auslesen der digitalen Eingänge | ||
+ | hall1 = digitalRead(hallPin1); | ||
+ | hall2 = digitalRead(hallPin2); | ||
+ | hall3 = digitalRead(hallPin3); | ||
+ | hall4 = digitalRead(hallPin4); | ||
+ | |||
+ | |||
+ | masse1 = digitalRead(massePin1); | ||
+ | masse2 = digitalRead(massePin2); | ||
+ | masse3 = digitalRead(massePin3); | ||
+ | masse4 = digitalRead(massePin4); | ||
+ | | ||
+ | // Auslesen der analogen Eingänge | ||
+ | rlevel = analogRead(levelPin); | ||
+ | rref = analogRead(refPin); | ||
+ | |||
+ | //Auslesen des Helligkeitssensors | ||
+ | lum = tsl.getFullLuminosity(); | ||
+ | ir = lum >> 16; | ||
+ | full = lum & 0xFFFF; | ||
+ | |||
+ | // Auslesen des DHT22 | ||
+ | // Reading temperature or humidity takes about 250 milliseconds! | ||
+ | // Sensor readings may also be up to 2 seconds ' | ||
+ | h = dht.readHumidity(); | ||
+ | t = dht.readTemperature(); | ||
+ | |||
+ | // Berechnung des Wasserstands im Vorratsbehälter in Prozent | ||
+ | int rlevelmin = 830; // Messwert bei minimalem Wasserstand | ||
+ | int rlevelmax = 430; // Messwert bei maximalem Wasserstand | ||
+ | level = 100 - (((rlevelmax - rlevel) / (rlevelmax - rlevelmin)) * 100); | ||
+ | |||
+ | // Berechnung der Helligkeit der NeoPixel | ||
+ | brightness = log(full) / 10; | ||
+ | |||
+ | // Taupunkt berechnen | ||
+ | float a = 17.271; | ||
+ | float b = 237.7; | ||
+ | float taupunktTmp = (a * t) / (b + t) + log(h/ | ||
+ | taupunkt = (b * taupunktTmp) / (a - taupunktTmp); | ||
+ | |||
+ | |||
+ | // Ansteuerung der Pumpen. | ||
+ | // Ist der Wasserstand niedrig, liegt kein Magnetfeld am Hall-Sensor an (hall = 1). | ||
+ | // Die entsprechende Pumpe wird aktiviert, bis der Soll-Wasserstand erreicht ist (hall = 0), | ||
+ | // - sofern keine andere Pumpe läuft und | ||
+ | // - sofern Wasser im Vorratsbehälter ist. | ||
+ | |||
+ | // Pumpe 1 an PWM-Pin 2 | ||
+ | if (masse1 == 0 && hall1 == 1 && level > 5 && pumpe2 == false && pumpe3 == false && pumpe4 == false) { | ||
+ | analogWrite(11, | ||
+ | pumpe1 = true; | ||
+ | } | ||
+ | else { | ||
+ | analogWrite(11, | ||
+ | pumpe1 = false; | ||
+ | } | ||
+ | |||
+ | // Pumpe 2 an PWM-Pin 3 | ||
+ | if (masse2 == 0 && hall2 == 1 && level > 5 && pumpe1 == false && pumpe3 == false && pumpe4 == false) { | ||
+ | analogWrite(10, | ||
+ | pumpe2 = true; | ||
+ | } | ||
+ | else { | ||
+ | analogWrite(10, | ||
+ | pumpe2 = false; | ||
+ | } | ||
+ | |||
+ | // Pumpe 3 an PWM-Pin 4 | ||
+ | if (masse3 == 0 && hall3 == 1 && level > 5 && pumpe1 == false && pumpe2 == false && pumpe4 == false) { | ||
+ | analogWrite(9, | ||
+ | pumpe3 = true; | ||
+ | } | ||
+ | else { | ||
+ | analogWrite(9, | ||
+ | pumpe3 = false; | ||
+ | } | ||
+ | |||
+ | // Pumpe 4 an PWM-Pin 5 | ||
+ | if (masse4 == 0 && hall4 == 1 && level > 5 && pumpe1 == false && pumpe2 == false && pumpe3 == false) { | ||
+ | analogWrite(8, | ||
+ | pumpe4 = true; | ||
+ | } | ||
+ | else { | ||
+ | analogWrite(8, | ||
+ | pumpe4 = false; | ||
+ | } | ||
+ | |||
+ | |||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisWaterPumps = currentMillis; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | // Steuerung der NeoPixel | ||
+ | if ((unsigned long)(currentMillis - previousMillisNeoPixel) >= intervalNeoPixel) { | ||
+ | |||
+ | |||
+ | // Ansteuerung der NeoPixels in den Blumenkastensensoren | ||
+ | if(sw) | ||
+ | { | ||
+ | counter++; | ||
+ | if(counter==255) sw = !sw; | ||
+ | } | ||
+ | if(!sw) | ||
+ | { | ||
+ | counter--; | ||
+ | if(counter==10) sw = !sw; | ||
+ | } | ||
+ | // fade led mit counter | ||
+ | green = counter*brightness; | ||
+ | red = counter*brightness; | ||
+ | |||
+ | // | ||
+ | |||
+ | if (hall1 == 0) { | ||
+ | | ||
+ | } | ||
+ | else { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | |||
+ | |||
+ | // | ||
+ | |||
+ | if (hall2 == 0) { | ||
+ | | ||
+ | } | ||
+ | else { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | |||
+ | |||
+ | // | ||
+ | |||
+ | if (hall3 == 0) { | ||
+ | | ||
+ | } | ||
+ | else { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | |||
+ | |||
+ | // | ||
+ | |||
+ | if (hall4 == 0) { | ||
+ | | ||
+ | } | ||
+ | else { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | |||
+ | // | ||
+ | | ||
+ | } | ||
+ | |||
+ | // | ||
+ | if ((unsigned long)(currentMillis - previousMillisTankSensor) >= intervalTankSensor) { | ||
+ | // | ||
+ | neopix5.setPixelColor(0, | ||
+ | neopix5.setPixelColor(11, | ||
+ | |||
+ | if (level >= 90) { | ||
+ | neopix5.setPixelColor(10, | ||
+ | } else if (level < 90) { | ||
+ | neopix5.setPixelColor(10, | ||
+ | } | ||
+ | | ||
+ | if (level >= 80) { | ||
+ | neopix5.setPixelColor(9, | ||
+ | } else if (level < 80) { | ||
+ | neopix5.setPixelColor(9, | ||
+ | } | ||
+ | | ||
+ | if (level >= 70) { | ||
+ | neopix5.setPixelColor(8, | ||
+ | } else if (level < 70) { | ||
+ | neopix5.setPixelColor(8, | ||
+ | } | ||
+ | | ||
+ | if (level >= 60) { | ||
+ | neopix5.setPixelColor(7, | ||
+ | } else if (level < 60) { | ||
+ | neopix5.setPixelColor(7, | ||
+ | } | ||
+ | | ||
+ | if (level >= 50) { | ||
+ | neopix5.setPixelColor(6, | ||
+ | } else if (level < 50) { | ||
+ | neopix5.setPixelColor(6, | ||
+ | } | ||
+ | | ||
+ | if (level >= 40) { | ||
+ | neopix5.setPixelColor(5, | ||
+ | } else if (level < 40) { | ||
+ | neopix5.setPixelColor(5, | ||
+ | } | ||
+ | | ||
+ | if (level >= 30) { | ||
+ | neopix5.setPixelColor(4, | ||
+ | } else if (level < 30) { | ||
+ | neopix5.setPixelColor(4, | ||
+ | } | ||
+ | | ||
+ | if (level >= 20) { | ||
+ | neopix5.setPixelColor(3, | ||
+ | } else if (level < 20) { | ||
+ | neopix5.setPixelColor(3, | ||
+ | } | ||
+ | | ||
+ | if (level >= 10) { | ||
+ | neopix5.setPixelColor(2, | ||
+ | } else if (level <10) { | ||
+ | neopix5.setPixelColor(2, | ||
+ | } | ||
+ | | ||
+ | neopix5.show(); | ||
+ | | ||
+ | |||
+ | |||
+ | // Warnung bei Unterschreiten der Gehäuseinnentemperatur unter den Taupunkt | ||
+ | if (t <= taupunkt) { | ||
+ | neopix5.setPixelColor(0, | ||
+ | neopix5.setPixelColor(11, | ||
+ | } else if (t > taupunkt) { | ||
+ | neopix5.setPixelColor(0, | ||
+ | neopix5.setPixelColor(11, | ||
+ | } | ||
+ | |||
+ | // | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | //Ausgabe an die serielle Schnittstelle | ||
+ | if ((unsigned long)(currentMillis - previousMillisSerialWrite) >= intervalSerialWrite) { | ||
+ | |||
+ | Serial.println(" | ||
+ | | ||
+ | //Ausgabe des Zeitstempels | ||
+ | | ||
+ | |||
+ | // Ausgabe der Eingangssignale an den digitalen Masse-Pins an die serielle Schnittstelle | ||
+ | // Der Ausgabewert " | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | | ||
+ | // Ausgabe der Eingangssignale an den digitalen Hall-Pins an die serielle Schnittstelle | ||
+ | // Der Ausgabewert " | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | |||
+ | //Ausgabe des Status der Pumpen | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | | ||
+ | // Ausgabe des Eingangssignals an den analogen Wasserstands-Pins an die serielle Schnittstelle | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | |||
+ | // Ausgabe des Wasserstands im Vorratsbehälter in Prozent an die serielle Schnittstelle | ||
+ | Serial.print(" | ||
+ | |||
+ | //Ausgabe verschiedener Helligkeitswerte an die serielle Schnittstelle | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | |||
+ | //Ausgabe der Temperatur-, | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | |||
+ | //Ausgabe des berechneten Helligkeitswerts an die sereille Schnittstelle | ||
+ | Serial.print(" | ||
+ | |||
+ | // Check if any reads failed and exit early (to try again). | ||
+ | if (isnan(h) || isnan(t)) { | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | previousMillisSerialWrite = currentMillis; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
Tags: #Arduino # | Tags: #Arduino # |
bewaesserungsautomat/programmversion_0.5.txt · Zuletzt geändert: 18.05.2023 12:15 von 127.0.0.1