Bewässerung

Hallo Leute,

ich wollte mit meinem Arduino_Mega ein Programm erstellen, welches zur Automatischen Bewässerung des Gartens genutzt werden soll.

Abhängig von der Feuchtigkeit, Sonneneinstrahlung und der Durchschnittstemperatur des Tages.
Ist mein Sketch bis jetzt korrekt?

Mit der Temperatur weiß ich noch nicht weiter.

Danke schonmal!

MfG Cheffe

int messwert_Feuchte = 0;
int messwert_Licht = 0;
int Feuchte = A0;
int Licht = A1;
int Pumpe = 4;

void setup() {
 Serial.begin(9600);
 pinMode (4, OUTPUT);
}

void loop() {
 messwert_Feuchte = analogRead(Feuchte);
 Serial.print("Feuchtigkeits-Messwert:");
 Serial.println(messwert_Feuchte);

 delay (200);

 messwert_Licht = analogRead(Licht);
 Serial.print("messwert_Licht:" );
 Serial.println(messwert_Licht);

 delay(500);

 if 
 (( messwert_Feuchte < 500 ) && (messwert_Licht < 500 ));

 {
   digitalWrite(Pumpe, HIGH);
 }
else

{
   digitalWrite(Pumpe, LOW);
 }

Kannst du bitte mal ein vernünftiges Thema für deinen Thread wählen, so wir es nie gefunden.

Edit:

bezüglich Sketch, was sagt denn der Compiler ?

Hier " (( messwert_Feuchte < 500 ) && (messwert_Licht < 500 ));" muss das Semikolon weg.

Und zum besseren lesen muss der Sketch in Code-Tags gesetzt werden, “Schaltfläche </>” oben links im Editor.

Danke, Titel ist ok. :wink:

Am Schluss meckert er nun bei der geschweiften Klammer.

exit status 1 expected '}' at end of input

ChefDerAffen: Am Schluss meckert er nun bei der geschweiften Klammer.

exit status 1 expected '}' at end of input

Ja, da fehlt am Ende der Loop eine Klammer. Habe ich übersehen, da der Sketch schlecht zu lesen ist.

Jetzt funktioniert der Sketch :slight_smile:
Würde es ändern aber weiß leider nicht was du meinst…

Jetzt würde ich gerne noch die Bewässerung abhängig von der Tagesdurchschnittstemperatur machen.
Also z.B. Durchschnittstemperatur 25 C Pumpe Abends an und Durchschnittstemperatur 15 C Pumpe Abends nicht einschalten.

Bitte gern geschehen.

Code-Tags sind: “<code>" vor und "</code>” nach dem Sketch, ohne Anführungszeichen und ohne *Stern oder eben die entsprechende Schaltfläche nehmen.

Du machst jede Stunde eine Messung und addierst die Messwerte. Die Summe teilst Du durch die Anzahl Messungen.

Durchschnitt = (M1 + ... + Mn)/n = M1/n + ... + Mn/n

Lösungsansätze: endlicher Automat und millis().

int TMP36 = A0;

int temperatur = 0;

int temp[10];

int time= 20;


















void setup() 
{
Serial.begin(9600);
}







void loop() 
{

temp[0] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[1] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[2] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[3] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[4] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[5] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[6] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[7] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[8] = map(analogRead(TMP36), 0, 410, -50, 150);

delay(time);

temp[9] = map(analogRead(TMP36), 0, 410, -50, 150);

temperatur=(temp[0]+temp[1]+temp[2]+temp[3]+temp[4]+temp[5]

+temp[6]+temp[7]+temp[8]+temp[9])/10; // Alles in eine Zeile!

Serial.print(temperatur);

Serial.println(" Grad Celsius");

}

Könnte ich nicht diesen Sketch verwenden und anstatt " int Time=20; " "int Time = 3600; " z.B. nehmen?

Danke für den Link mit millis. Ich werde mir es Morgen mal in ruhe anschauen und mich dann nochmal melden. Vielen Dank schonmal für eure Hilfe :-)

ChefDerAffen: Könnte ich nicht diesen Sketch verwenden und anstatt " int Time=20; " "int Time = 3600; " z.B. nehmen?

Wenn Du nichts anderes machen willst, ja. Aber Du möchtst noch andere Werte messen und die Bewässerung steuern, später auch noch eine Anzeige ...

Dazu brauchst Du sowas wie Multitasking, was der Arduino aber nur quasi, also nacheinander, kann.

Hier findest Du das passende Werkzeug: Mittwochs-Weekender: Automat ohne delay()

Eine Suche "agmue Anleitung" bringt Dich zu meinen Versuchen.

Ist so das delay richtig ersetzt, so dass er 3 Sekunden wartet?

String readString;
int ergebnis = 0;
unsigned long previousMillis = 0;
const long interval = 1000;
int messwert_Feuchte = 0;
int messwert_Licht = 0;
int Feuchte = A0;
int Licht = A1;
int Pumpe = 4;





void setup() {
  Serial.begin(9600);
  pinMode (4, OUTPUT);


}

void loop() {

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    }    
  }
void Messung()
{
  messwert_Feuchte = analogRead(Feuchte);
  Serial.print("Feuchtigkeits-Messwert:");
  Serial.println(messwert_Feuchte);
  
  if(millis ()>(previousMillis+3000))
  

    messwert_Licht = analogRead(Licht);
  Serial.print("messwert_Licht:" );
  Serial.println(messwert_Licht);
   if(millis ()>(previousMillis+3000))


  if 
  (( messwert_Feuchte < 500 ) && (messwert_Licht < 500 ))

  {
    digitalWrite(Pumpe, HIGH);
  }

else
 
 {
    digitalWrite(Pumpe, LOW);
 }
 }

ChefDerAffen: Ist so das delay richtig ersetzt, so dass er 3 Sekunden wartet?

Die Funktion Messung wird in deinem Sketch NIE aufgerufen.

Die if-Abfrage in deiner loop wird jede sekunde mal wahr weil interval = 1000. Weiter passiert da aber nichts.

Deine Frage ist also schwierig zu beantworten.

hmm...wie komme ich denn in die Funktion Messung? Durch das millis soll er eigentlich nur 3 Sekunden warten bis er die nächste Messung ausgibt.

Generell (ganz grundlegende Arduino-Grundlagen):
setup wird (nur) einmal durchlaufen,
loop wird (danach) ständig durchlaufen,
andere Funktionen nur, wenn sie in einer dieser Funktionen aufgerufen werden.

Wenn du also alle 3 Sekunden die Funktion Messung aufrufen willst, dann wäre das so möglich:

String readString;  // ???
int ergebnis = 0;  // ???
unsigned long previousMillis = 0;
const long interval = 3000;   // Messintervall
int messwert_Feuchte = 0;
int messwert_Licht = 0;
int Feuchte = A0;
int Licht = A1;
int Pumpe = 4;


void setup() {
  Serial.begin(9600);
  pinMode (4, OUTPUT);
}


void loop() {
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Messung();
  }   
}


void Messung() {
  messwert_Feuchte = analogRead(Feuchte);
  Serial.print("Feuchtigkeits-Messwert:");
  Serial.println(messwert_Feuchte);

  // if(millis ()>(previousMillis+3000))
  
  messwert_Licht = analogRead(Licht);
  Serial.print("messwert_Licht:" );
  Serial.println(messwert_Licht);
  
  // if(millis ()>(previousMillis+3000))
  
  if (( messwert_Feuchte < 500 ) && (messwert_Licht < 500 ))
  {  digitalWrite(Pumpe, HIGH);
  }
  else
  {  digitalWrite(Pumpe, LOW);
  }
}

Also

Messung();

in loop einfügen
und die Zeilen

 if(millis ()>(previousMillis+3000))

in deiner Messen-Funktion müsstest du raus schmeißen.
Diese Zeilen machen ohnehin nicht viel, bzw. glaube ich nicht, dass die das machen, was du denkst, dass sie machen.
Da fehlen wohl geschweifte Klammern…
Ausserdem ist es eher ungünstig zu einer unsigned log Variable 3000 zu addieren - da gibt es im Falle eines Überlaufes dann mitunter Probleme (das wäre aber in deinem Fall wohl nicht so schlimm).

Was
String readString;
int ergebnis = 0;
machen, geht aus deinem Sketch nicht hervor.

Gleich sagt er, ach ja stimmt, ist mir beim kopieren ein Fehler unterlaufen:D

Danke schonmal für deine Hilfe!
“int=ergebnis” war aus dem Versuch die Tagesdurchschnittstemperatur zu ermitteln.
Habe den Sketch angepasst:

unsigned long previousMillis = 0;
const long interval = 3000;
int messwert_Feuchte = 0;
int messwert_Licht = 0;
int Feuchte = A0;
int Licht = A1;
int Pumpe = 4;








void setup() {
  Serial.begin(9600);
  pinMode (4, OUTPUT);


}

void loop() {

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

messwert_Feuchte = analogRead(Feuchte);
  Serial.print("Feuchtigkeits-Messwert:");
  Serial.println(messwert_Feuchte);  
  

  messwert_Licht = analogRead(Licht);
  Serial.print("messwert_Licht:" );
  Serial.println(messwert_Licht);
   


  if 
  (( messwert_Feuchte < 500 ) && (messwert_Licht < 500 ))

  {
    digitalWrite(Pumpe, HIGH);
  }

else
 
 {
    digitalWrite(Pumpe, LOW);

    
    }    
  }
  }

skorpi08:
Gleich sagt er, ach ja stimmt, ist mir beim kopieren ein Fehler unterlaufen:D

Nicht wirklich…bin über jede Hilfe Dankbar :wink:

Ja, so erfolgt eine Messung alle 3 Sekunden - obwohl ich die Version mit getrennter "Messung-Funktion" übersichtlicher finde, aber das ist zum Teil wohl auch Geschmackssache. Und in der Zwischenzeit kann sich der Arduino um vieles Andere kümmern.

Ok, super! Was meinst du mit getrennt? Wäre schon sinvoll, weil der Arduino noch als Alarmanlage genutzt werden soll. Dann werde ich mich jetzt mal an die Messung der Tagesdurchschnittstemperatur machen. Wenn ich soweit bin stelle ich den Sketch hier mal rein.

Mit "getrennt" meine ich im Code "getrennt" - als eigene Funktion. Der Sketch in #15 macht genau das Gleiche wie in #13. Aber in #15 ist alles "in einer Wurst" in loop "verpackt". In #13 ist "Messung" in eine eigene Funktion ausgelagert, das macht es (für uns Menschen) übersichtlicher zu lesen.

Bei einem kleinen Programm ist es ja gar kein Problem den Überblick zu behalten, bei einem umfangreicheren hingegen wird es schwieriger, wenn alles "in einer langen Wurst" in loop gepackt ist. Der Code ist viel einfacher zu durchschauen und zu warten, wenn man "Programmteile" sinnvoll in Funktionen aufteilt.

Zum Beispiel

// ...

void setup() {
  // das wird einmal durchlaufen
  // ...
}

void loop() {
  taster_einlesen();
  sensoren_einlesen();
  tastereingabe_bearbeiten();
  sesorwerte_bearbeiten();
  LCD_ausgabe();
  aktuatoren_treiben();
  // und so weiter...
}

void taster_einlesen() {
  // Code um die vielen Taster einzulesen
  // ...
}

void sensoren_einlesen() {
  // Myriaden von Sensoren liefern Werte
  // ...
}

void tastereingabe_bearbeiten() {
  // Die Tastereingabe wird bearbeitet
  // ...
}

void sesorwerte_bearbeiten() {
  // ...
}

void LCD_ausgabe() {
  // ...
}

void aktuatoren_treiben() {
  // Servos, Solenoide, Stepper
  // etc. werden bedient
}

uxomm: ... obwohl ich die Version mit getrennter "Messung-Funktion" übersichtlicher finde....

Es ist nicht nur übersichtlicher, der Sketch ist auch besser zu debuggen.