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();
}
Es sieht so aus, also wäre beim Einfügen etwas schief gegangen..
for (sleepCounter = zeitSleep; sleepCounter > 0; sleepCounter–)
Danke, habe ich korrigiert.