bewaesserungsautomat:programmversion_0.4
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
bewaesserungsautomat:programmversion_0.4 [12.06.2016 09:59] – angelegt Frickelpiet | bewaesserungsautomat:programmversion_0.4 [18.05.2023 12:15] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Bewässerungsautomat Programmversion 0.4 ====== | ====== Bewässerungsautomat Programmversion 0.4 ====== | ||
+ | <box 100% round red|**Achtung!**> | ||
+ | |||
[[bewaesserungsautomat: | [[bewaesserungsautomat: | ||
Die einzige Veränderung der Programmversion 0.4 zur Version 0.3 ist daher, dass die Pumpen per PWM angesteuert werden. | Die einzige Veränderung der Programmversion 0.4 zur Version 0.3 ist daher, dass die Pumpen per PWM angesteuert werden. | ||
+ | |||
+ | ACHTUNG: Im Sketch unten ist das PWM-Signal mit " | ||
Hilfreiche Links: | Hilfreiche Links: | ||
* https:// | * https:// | ||
+ | |||
+ | < | ||
+ | // Bibliotheken einbinden | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | // Definiert die Pins für die NeoPixels | ||
+ | int neoPin1 = 36; // Neopixel an Blumenkastenensor 1 | ||
+ | int neoPin2 = 38; // Neopixel an Blumenkastenensor 2 | ||
+ | int neoPin3 = 40; // Neopixel an Blumenkastenensor 3 | ||
+ | int neoPin4 = 42; // Neopixel an Blumenkastenensor 4 | ||
+ | int neoPin5 = 44; // Neopixelring am Wasserstandssensor im Vorratsbehälter | ||
+ | int neoPin6 = 48; // Neopixelring im Gehäusedeckel | ||
+ | //int neoPin6 = 50; // Reserviert für Erweiterungen | ||
+ | |||
+ | // Definiert die NeoPixels | ||
+ | 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 | ||
+ | int hallPin1 = 35; // Hall-Sensor 1 | ||
+ | int hallPin2 = 33; // Hall-Sensor 2 | ||
+ | int hallPin3 = 31; // Hall-Sensor 3 | ||
+ | int hallPin4 = 29; // Hall-Sensor 4 | ||
+ | |||
+ | // Definiert die Pins für die Verfügbarkeitskontrolle | ||
+ | int massePin1 = 47; // Masse an Blumenkastenensor 1 | ||
+ | int massePin2 = 49; // Masse an Blumenkastenensor 2 | ||
+ | int massePin3 = 51; // Masse an Blumenkastenensor 3 | ||
+ | int massePin4 = 53; // Masse an Blumenkastenensor 4 | ||
+ | |||
+ | |||
+ | // Definiert die Pins des Wasserstandssensor für den Vorratsbehälter | ||
+ | int refPin = A0; // Rref | ||
+ | int levelPin = A1; // Rsense | ||
+ | |||
+ | // Definiert den Pin für den DHT22 | ||
+ | int dhtPin = 28; | ||
+ | |||
+ | // Definiert den angeschlossenen Sensor | ||
+ | #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321) | ||
+ | |||
+ | // Initialisiert den DHT-Sensor | ||
+ | DHT dht(dhtPin, DHTTYPE); | ||
+ | |||
+ | // Definiert die Pins für die Pumpenrelais | ||
+ | //int relPin1 = 36; // Pumpe 1 | ||
+ | //int relPin2 = 38; // Pumpe 2 | ||
+ | //int relPin3 = 40; // Pumpe 3 | ||
+ | //int relPin4 = 42; // Pumpe 4 | ||
+ | // Auskommentiert, | ||
+ | |||
+ | // 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 = 0; | ||
+ | int rref = 0; | ||
+ | |||
+ | int brightness = 0; | ||
+ | |||
+ | boolean | ||
+ | boolean | ||
+ | boolean | ||
+ | boolean | ||
+ | |||
+ | |||
+ | 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 die Relais-Pins | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | |||
+ | // 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); | ||
+ | |||
+ | | ||
+ | // Debugging output | ||
+ | Serial.begin(9600); | ||
+ | dht.begin(); | ||
+ | tsl.begin(); | ||
+ | |||
+ | | ||
+ | // Perspektivisch könnte eine Startanimation des NeoPixel-Rings die Wartezeit verkürzen. | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // 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); | ||
+ | |||
+ | // Ausgabe der Eingangssignale an den digitalen Masse-Pins an die serielle Schnittstelle | ||
+ | // Der Ausgabewert " | ||
+ | Serial.print(" | ||
+ | Serial.print(masse1); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(masse2); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(masse3); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(masse4); | ||
+ | Serial.println(" | ||
+ | | ||
+ | // Ausgabe der Eingangssignale an den digitalen Hall-Pins an die serielle Schnittstelle | ||
+ | // Der Ausgabewert " | ||
+ | Serial.print(" | ||
+ | Serial.print(hall1); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(hall2); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(hall3); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(hall4); | ||
+ | Serial.println(" | ||
+ | |||
+ | //Ausgabe des Status der Pumpen | ||
+ | Serial.print(" | ||
+ | Serial.print(pumpe1); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(pumpe2); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(pumpe3); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(pumpe4); | ||
+ | Serial.println(" | ||
+ | | ||
+ | |||
+ | // Ausgabe des Eingangssignals an den analogen Wasserstands-Pins an die serielle Schnittstelle | ||
+ | Serial.print(" | ||
+ | Serial.print(rlevel); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(rref); | ||
+ | Serial.println(" | ||
+ | |||
+ | // Berechnung des Wasserstands im Vorratsbehälter in Prozent | ||
+ | float rlevelmin = 830; // Messwert bei minimalem Wasserstand | ||
+ | float rlevelmax = 430; // Messwert bei maximalem Wasserstand | ||
+ | float level = 100 - (((rlevelmax - rlevel) / (rlevelmax - rlevelmin)) * 100); | ||
+ | |||
+ | // Ausgabe des Wasserstands im Vorratsbehälter in Prozent an die serielle Schnittstelle | ||
+ | Serial.print(" | ||
+ | Serial.print(level); | ||
+ | Serial.println(" | ||
+ | |||
+ | // More advanced data read example. Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum | ||
+ | // That way you can do whatever math and comparisons you want! | ||
+ | uint32_t lum = tsl.getFullLuminosity(); | ||
+ | uint16_t ir, full; | ||
+ | ir = lum >> 16; | ||
+ | full = lum & 0xFFFF; | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | |||
+ | // Berechnung der Helligkeit der NeoPixel | ||
+ | float brightness = log(full) / 10; | ||
+ | Serial.print(brightness); | ||
+ | |||
+ | |||
+ | | ||
+ | // 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; | ||
+ | } | ||
+ | |||
+ | |||
+ | // Ansteuerung der NeoPixels in den Blumenkastensensoren | ||
+ | if (hall1 == 0) { | ||
+ | neopix1.setPixelColor(0, | ||
+ | } | ||
+ | else { | ||
+ | neopix1.setPixelColor(0, | ||
+ | | ||
+ | } | ||
+ | | ||
+ | | ||
+ | if (hall2 == 0) { | ||
+ | neopix2.setPixelColor(0, | ||
+ | } | ||
+ | else { | ||
+ | neopix2.setPixelColor(0, | ||
+ | } | ||
+ | neopix1.show(); | ||
+ | | ||
+ | if (hall3 == 0) { | ||
+ | neopix3.setPixelColor(0, | ||
+ | } | ||
+ | else { | ||
+ | neopix3.setPixelColor(0, | ||
+ | } | ||
+ | neopix3.show(); | ||
+ | | ||
+ | if (hall4 == 0) { | ||
+ | neopix4.setPixelColor(0, | ||
+ | } | ||
+ | else { | ||
+ | neopix4.setPixelColor(0, | ||
+ | } | ||
+ | neopix4.show(); | ||
+ | |||
+ | // | ||
+ | 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(); | ||
+ | | ||
+ | // Auslesen des DHT22 und Ausgabe der Werte an serielle Schnittstelle | ||
+ | // Reading temperature or humidity takes about 250 milliseconds! | ||
+ | // Sensor readings may also be up to 2 seconds ' | ||
+ | float h = dht.readHumidity(); | ||
+ | float t = dht.readTemperature(); | ||
+ | | ||
+ | // Check if any reads failed and exit early (to try again). | ||
+ | if (isnan(h) || isnan(t)) { | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Hitzeindex in Celsius berechnen (isFahreheit = false) | ||
+ | float hic = dht.computeHeatIndex(t, | ||
+ | |||
+ | // Taupunkt berechnen | ||
+ | float a = 17.271; | ||
+ | float b = 237.7; | ||
+ | float taupunktTmp = (a * t) / (b + t) + log(h/ | ||
+ | float taupunkt = (b * taupunktTmp) / (a - taupunktTmp); | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.print(h); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(t); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(hic); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(taupunkt); | ||
+ | Serial.println(" | ||
+ | |||
+ | // 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, | ||
+ | } | ||
+ | | ||
+ | delay(1000); | ||
+ | } | ||
+ | </ |
bewaesserungsautomat/programmversion_0.4.1465718384.txt.gz · Zuletzt geändert: 18.05.2023 09:06 (Externe Bearbeitung)