Hallo,
die Idee ist folgende:
Wenn ein Timer (aktuell 10 Minuten) abgelaufen ist misst er die Feuchtigkeit im Topf (2 parallele Nägel, die wegen Elektrolyse nur zur Messung Strom kriegen (siehe Routine ReadSens).
Wenn diese unter der Kalibration liegen die gehalten werden soll, merkt er sich die Feuchtigkeit und gießt.
Falls bei der nächsten Messung (nach weiteren 10 Minuten) noch immer zu trocken, muss die gemessene Feuchtigkeit zumindest höher sein als die vor dem letzten Gießen.
Wenn es 3x hintereinander zu trocken ist und die Feuchtigkeit nicht gestiegen ist, ist davon auszugehen ein Schlauch ist nicht mehr am Topf und das Gießen wird gestoppt (ErrSchwelle ist 3, wenn die erreicht stoppt er das Gießen).
Sollte nachdem es vorher zu trocken war bei der nächsten Messung die Feuchtigkeit ok sein, ist der Schlauch noch dran und der "LastSense1" wird auf 0 gesetzt, damit von vorne begonnen wird, falls es wieder mal zu trocken wird.
Nun habe ich irgendwie scheinbar ein Problem mit dem LastSense1 speichern/vergleichen etc.
Irgendwie bricht er vor dem 4. Gießen (also nach 3 Fehlern) immer wieder mit Error ab.
Anfangs hatte ich den LastSense1 wenn die Feuchtigkeit beim Nächsten Messen ok war nicht auf 0 gesetzt und dachte den Fehler gefunden zu haben, aber er macht es immer noch.
Auch die +5 beim Vergleich hatte ich später hinzugefügt, weil er sonst wegen minimaler Schwankungen des ADC teilweise Err1 (Fehlercounter) auf 0 gestellt hat und dann erst nach 5-7 Fehlern statt 3 aufgehört hat zu gießen. Dies geht aber damit wie es soll.
Als ich das im Topf mit Erde getestet hab und zum simulieren der Feuchtigkeit den Sensor weiter rein oder raus gezogen habe klappte alles wie es soll.
Nur wenn ich es im mit Pflanzen laufen lasse, bricht er immer wieder nach der Anzahl Gießen ab die der Fehlerschwelle entsprechen (selber Sensor).
Eigentlich sollte er ja wenn es mal feucht genug ist LastSense wieder auf 0 setzten und daher nicht den Errorcounter hochzählen, er tut es aber scheinbar, da er nach 3x gießen (max. Fehlerschwelle) abbricht.
Er scheint nicht in die entsprechende if zu springen, die den Errorcounter resettet.
Ich hab das im EEprom aufgezeichnet. Graph diehe Anhang. Der Graph ist aber runter gemappt, damit ich es als byte ins EEprom schreiben kann (Calib +- 250 auf 0-255 gemappt), daher sind das natürlich andere Zahlen an der Skala. Aber den Verlauf sieht man gut. Im Graph ist die rote Linie der Kalibrationswert der gehalten werden soll, das blaue ist das Wasser.
Ich weiß einfach nicht weiter was ich übersehen hab!
Ich hab keine Ahnung, was das Problem ist und schon stundenlang gesucht und komme nicht weiter....
Ich hab die relevanten Teile des Codes mal rauskopiert und die unwichtigen wie LEDs und Kalibration etc weggelassen, da das alles geht wie es soll.
Achso das Gießen wird in der MessGiess Routine gestartet, abgeschaltet wird die Pumpe durch die PumpOFF Routine nach 20 Sekunden, oder durch die PumpOFFWet Routine (misst alle 3 Sekunden beim Gießen) wenn es feuchter ist als Calib+100. Dann wird auch der Messtimer für die nächsten 10 Minuten neu gestartet.
void loop() {
// Wenn Wasser voll, keine Fehler, dann messen und giessen starten (Errorcheck in Routine)
if ((WaterOK == 1) && (millis() - MessTimer1Start >= MessZeit) && (digitalRead(Pump1) == LOW) && (digitalRead(Pump2) == LOW)) { // Wenn Wasserstand OK, Messtimer 1 abgelaufen und alle Pumpen aus Giessen 1
MessGiess1();
}
if ((WaterOK == 1) && (millis() - MessTimer2Start >= MessZeit) && (digitalRead(Pump1) == LOW) && (digitalRead(Pump2) == LOW)) { // Wenn Wasserstand OK, Messtimer 2 abgelaufen und alle Pumpen aus Giessen 2
MessGiess2();
}
}
void MessGiess1() {
if ((Calib1 > 0) && (Err1 < ErrSchwelle)) { // Wenn Sensor kalibiert und Errorschwelle nocht nicht erreicht
int Messwert = ReadSens1(); // Feuchtigkeit messen
if (Messwert < MinCalib) { // Bei Sensorfehler Error setzen und nicht giessen
Err1 = ErrSchwelle;
}
else if (Messwert >= Calib1) { // Ansonsten, wenn kein Fehler Feuchtigkeit OK Messtimer und Fehlermessung resetten
LastSens1 = 0; // Fehlermessung resetten
MessTimer1Start = millis();
}
else if (Messwert < Calib1) { // Ansonsten, wenn kein Fehler und zu trocken
if (Messwert > LastSens1 + 5) { // Wenn seit letztem giessen feuchter geworden (+5 wegen ADC-Schwankungen)
LastSens1 = Messwert; // Fehlermessung auf aktuellen Wert setzen
Err1 = 0; // Fehler löschen
GiessTimer1Start = millis(); // Giesstimer starten
WetTimerStart = millis(); // Feuchtigkeitstimer starten
digitalWrite(Pump1, HIGH); // Pumpe 1 an
}
else { // Wenn seit letztem giessen nicht feuchter geworden
LastSens1 = Messwert; // Fehlermessung auf aktuellen Wert setzen
Err1++; // Fehlercounter eins hoch
GiessTimer1Start = millis(); // Giesstimer starten
WetTimerStart = millis(); // Feuchtigkeitstimer starten
digitalWrite(Pump1, HIGH); // Pumpe 1 an
}
}
}
}
void PumpOFF() {
if ((digitalRead(Pump1) == HIGH) && (millis() - GiessTimer1Start >= GiessZeit)) { // Wenn Pumpe 1 an und Giesstimer 1 abgelaufen
digitalWrite(Pump1, LOW);
digitalWrite(Sens1LED, HIGH);
MessTimer1Start = millis(); // Messtimer 1 resetten
}
if ((digitalRead(Pump2) == HIGH) && (millis() - GiessTimer2Start >= GiessZeit)) { // Wenn Pumpe 2 an und Giesstimer 2 abgelaufen
digitalWrite(Pump2, LOW);
digitalWrite(Sens2LED, HIGH);
MessTimer2Start = millis(); // Messtimer 2 resetten
}
}
void PumpOFFWet() {
if (millis() - WetTimerStart >= WetTime) {
if (digitalRead(Pump1) == HIGH) {
if (ReadSens1() > Calib1 + MaxFeuchtigkeit) {
digitalWrite(Pump1, LOW);
digitalWrite(Sens1LED, HIGH);
MessTimer1Start = millis(); // Messtimer 1 resetten
}
}
if (digitalRead(Pump2) == HIGH) {
if (ReadSens2() > Calib2 + MaxFeuchtigkeit) {
digitalWrite(Pump2, LOW);
digitalWrite(Sens2LED, HIGH);
MessTimer2Start = millis(); // Messtimer 2 resetten
}
}
WetTimerStart = millis(); // Feuchtigkeit Messstimer neu starten
}
}
int ReadSens1() {
digitalWrite(SensPower1, HIGH);
delay(1);
int Sens = analogRead(Sens1);
digitalWrite(SensPower1, LOW);
return Sens;
}