Nachfolgend ist der Programmcode dieses Projektes aufgeführt. Eine Beschreibung der einzelnen Programmteile ist über dem jeweiligen Block gegeben.

#include “LowPower.h”
#define sensorWert A0
#define sensorPower 4
#define motor 9
#define kontakt 6

/* aus wie vielen Messungen soll der Mittelwert gebildet werden? */
const int anzahlMessungen = 5;
/* wie lang soll die Pause zwischen den Messungen sein?
* 2 Stunden = 60x60x2 = 7200s
* 7200 s / 8 s = 900 */
const int zeitSleep = 900;
/* Wert für trockene Erde */
const int trocken = 800;
/* Wert für nasse Erde */
const int nass = 480;

void setup() {
     pinMode (sensorWert, INPUT);
     pinMode (sensorPower, OUTPUT);
     pinMode (motor, OUTPUT);
     pinMode (kontakt, INPUT);
     Serial.begin(9600);
}

/* Bildet einen Mittelwert aus der festgelegten Anzahl an Feuchtigkeitsmessungen */
int feuchtigkeit() {
     int mittelwert = 0;
     int summeMesswerte = 0;
     for (int i = 0; i<anzahlMessungen; i++) {
          summeMesswerte += analogRead(sensorWert);
     }
     mittelwert = summeMesswerte / anzahlMessungen;
     return mittelwert;
}

/* Methode zur aktivierung des Deep-Sleep-Modus.
* Überprüfung ob geswünschte Zeit schon abgelaufen, wenn nicht, erneuter Sleep-Modus.*/
void deepSleep() {
     unsigned int sleepCounter;
     for (sleepCounter = zeitSleep; sleepCounter > 0; sleepCounter–) {
          LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

void loop() {
     digitalWrite (sensorPower, HIGH);
     delay(5000);

/* Im Falle eines Neustarts bei geöffnetem Ventil, wird dieses zunächst geschlossen.*/

     if (digitalRead(kontakt)==1) {
          digitalWrite(motor, HIGH);
          while (digitalRead(kontakt)==1) {}
          digitalWrite(motor, LOW);
     }
/* Prüft ob Boden trocken. Wenn ja, wird der Motor solange betrieben,
* bis das Ventil geöffnet ist (kontakt==1).
* Wenn die gewünschte Feuchtigkeit erreicht ist, wird der Motor wieder eingeschaltet,
* bis das Ventil geschlossen ist (kontakt==0).
* Anschließend aktivierung des Deep-Sleep-Modus.*/

     if (feuchtigkeit() > trocken) {
          digitalWrite(motor, HIGH);
          while (digitalRead(kontakt)==0) {}
          digitalWrite(motor, LOW);

          while (feuchtigkeit() > nass) {
               LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
          }
          digitalWrite(motor, HIGH);
          while (digitalRead(kontakt)==1) {}
          digitalWrite(motor, LOW);;

          digitalWrite (sensorPower, LOW);
      }
     deepSleep();
}

8.554 Kommentare zu „Programmcode