Bewässerungsanwendung mit Arduini Uno + vier kapazitive Feuchtesensoren + vier Pumpen

Guten Tag!
ich bin neu hier und möcht schon vorweg um Geduld bitten wenn ich nicht so firm bin und vom Programm-Code keine Ahnung habe.
Mein Problem:
Ich habe kein passenden Sketch für folgende Anwendung: Ich habe ein Arduino Uno, ein Vier-fach Relaisboard, vier kapazitive Feuchtesensor und vier Tauchpumpen.

Ich möchte im urlaub über einen großen Kanister meine Zimmerpflanzen wässern. Da ich vom Programmieren keine Ahnung habe bitte ich Euch mir einen Tip zu geben wo ich ein passenden Sketch herbekomme.
Für die Antworten bedanke ich mich im Voraus.
Gruß
Gibgut8

Wenn du nach einer Bewässerung mit einem Sensor und einer Pumpe suchst, wirst du sicher fündig. Diese kannst du dann auf jeweils 4 erweitern.
Allerdings möchte ich bezweifeln, dass genau deine Hardware dafür im Einsatz ist. Aber auch da lässt sich durch eigene Initiative daran etwas ändern.

Hallo gibgut8

Nimm die Forensuchmaschine.

Na dann schreib halt mal zusammen was dein Sketch machen soll.
Ganz exakt.
Möglichst einfach beschrieben.
Einfach weil - du musst das dann auch in Programmzeilen umsetzen.
Umso einfacher und klarer du definierst, desto leichter kannst du das dann in C++ umsetzen.

Wenn du Inspiration für die Programmumsetzung benötigst, such mal nach "Arduino Giesomat".
Aber an deiner Stelle würde ich zunächst mal eine Anforderung zusammenschreiben.

Anregungen:

Einsteigerfragen: Kann mein Code optimiert werden? Welches Board für Wifi?

Bewässerungssteuerung für Reitplatz

Einfacher Code für automatische Bewässerung

Wieder bewässerung

Extra für Anfänger.

Muss nur auf die 4 Sensoren angepasst werden.

Ich könnte dir zwar mein Code geben, aber dazu hast du zu wenig Komponenten.
Weil ich noch eine Tastatur (über i2c) und ein Display (1602) angeschlossen habe.
Sowie eine UHR. Zum Schonen der Sensoren.

Dadurch läuft das ganze Autark.

Aktuell überlege ich nur noch wie Groß die Solarzelle sein muss, damit das Ohne Netzteil läuft. Hab wenig Erfahrung in Sachen Solar.

Ach. Einige kleiner Tipp's noch.

  1. Messe wie viel Wasser die Pumpe in X-Sekunden fördert und beachte diesen Wert.

Sonst ist der Eimer schnell leer und deine Blumen lernen Baden. Das nennt der Fachmann STAUNÄSSE und das ist genau so schlimm (teilweise schlimmer weil Ansteckend) als zu trocken.

  1. Warte nach JEDER Messung des Sensors mind. 1 Stunde. Grund : Zu viel Messungen schaden den Sensor + Der Sensor steckt in der Erde. Das Wasser braucht seine Zeit bis es am Sensor ankommt. Ich messe 2 x am Tag (um 9:00 und um 15:00). Das reicht völlig. Man muss die Pflanzen nicht verwöhnen :wink:

  2. Wenn du Blumenkästen bewässern willst (so wie ich für meine Erdbeeren) dann kauf dir bei Amazon (oder wo auch immer) ein Adapter-Set für den Schlauch. Ich habe 2 Löcher unterhalb der Kante gebohrt und so 2 Einflussstellen geschaffen. 1 über Winkeladapter und eine über den Y-Adapter. So reicht eine Pumpe pro Kasten aus und das Wasser wird besser verteilt.

Gruß

Pucki

Nicht die Sensoren was hat der TO, mach keine Panik.
Woher weist du was für Pflanzen hat der Fragesteller?

In allen Fachberichten schreiben die Experden das man die Sensoren nicht überstrapazierten soll. Je nach Sensor gibt es da aber gravierende Unterschiede, da gebe ich dir Recht.

Und JA, ich nutze sogar aktuell die falschen (die mit den 2 Achsen). Von den anderen habe ich damals nix gewusst, und bei 10 Senoren für unter 5 Euro inkl. VK war mir das auch egal. Und ja, meine "Rosten" irgenwann. Die werden trotzdem verbraucht. Ich mag es nicht Funktionieren Produkte wegzuwerfen.

Ich weiß nicht welche Pflanzen der TO hat. Ist auch egal, weil alle stecken in der Erde. Und Erde ist ein saugendes Element. Also braucht man ein gewisse Zeit bis

  1. Das REST-Wasser was nicht aufgesaugt ist, an den Sensor kommt
  2. Die Erde ein sicheren Feuchtigkeitsgrad hat (Also oben und unten am Sensor das selbe Ergebnis ist)

Nach ca. 1 Std. sollte die Erde soweit sein das sie den max. Zustand erreicht hat, der mit der eingespeisten Menge Wasser zu erreichen ist.

Gruß

Pucki

Wenn du schon ein Beispiel gefunden hast zeige den. Du musst wissen das jeder Sensor was anderes anzeigt, die muss mann Kalibrieren, sonst schwimt eine Pflanze oder ist erhoffen, das wilst du nicht.

Das man Sensoren i.d.R. kalibrieren muss ist mir halt zu selbstverständlich.
Allein schon wegen einer Funktionskontrolle (ich traue halt keinen Chinesen) :wink:

Was die Feuchte Sensoren angeht, so habe ich das so gemacht.

Ein Glas Gurken leer gefuttert.
Dann es mit Staubtrockener Erde befüllt und den Sensor rein gesteckt
Eine Messung gestartet und deren Wert aufgeschrieben.
Nun etwas Wasser in das Glas und gewartet.
Nachdem ich der Meinung war (Finger Prüfung) das die Erde feucht war oben und KEIN Wasser mehr an der Oberfläche war, eine Neue Messung gemacht.
DAS Ergebnis als "Startrichtwert" programmiert.

Da ich wie geschrieben Tastatur + Display dran habe (und ein Test sich in der Praxis bestätigen muss) habe ich die Möglichkeit diesen Wert und die Laufzeit der Pumpe (Wegen Wassermenge) jedezeit zu ändern. Gespeichert werden diese Werte im Flash der Uhr (spart mir eine Libs) . D.h. der Startwert wird im Code hinterlegt. Danach wird die "Lese den Flash der Uhr)-Routine aufgerufen und wenn > 0 der Wert geändert.

Gruß

Pucki

Guten Tag!``
Danke für die vielen Hinweise.
Das der Feuchtesensor kalibriert werden muß, weiß ich. Das ist nicht i.M. mein Problem.
Ich habe folgenden Sketch zusammengestellt, bringt aber Compilierungs-fehler.
Hier ist der Sketch:

const byte pflanzenNum = 4;          // Anzahl der Kübel - darauf basiert dann die Pumpen etc...
const byte pumpePin[pflanzenNum] = {3, 4, 5, 6}; // Namen für Digitalpins 1-5
const byte sensorPin[pflanzenNum] = {A1, A2, A3, A4};
unsigned int sensorWert;
const unsigned int trocken = 600;
const unsigned int nass = 475;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  for (byte b = 0; b < pflanzenNum; b++)
   {  
      pinMode(pumpePin[b], OUTPUT);
}
 
 
void loop() 
{
   for (byte b = 0; b < pflanzenNum; b++)
   { 
      sensorWert = analogRead(sensorPin[b]);     // Wert von Sensor wird ausgelesen
    if (sensorWert > trocken)
    {
      digitalWrite(pumpePin[b], HIGH);        // Pumpe einschalten
      Serial.print(F("Pumpe"));
      Serial.print(b);
      Serial.println(F(": pumpt!"));
            digitalWrite(pumpePin, HIGH);            // Pumpe an
      Serial.println(F("Pumpe ist an"));
      delay(5000);                             // 5 Sekunden warten
      while (sensorWert > nass)                // Solange Sensorwert größer 475 ist nachfolgende Anweisungen ausführen
      {
        delay(2000);                           // 2 Sekunden Warten
        sensorWert = analogRead(sensorPin[b]); // Sensorwert auslesen. Zurück zu "while"
      }
      digitalWrite(pumpePin, LOW);             // Pumpe aus
      Serial.println(F("Pumpe ist aus"));
      // delay(3000);                          // 3 Sekunden warten
    }

}

Fehlercode:
C:\Users\Admi\Documents\Arduino\sketch_jun21a\sketch_jun21a.ino: In function 'void setup()':
C:\Users\Admi\Documents\Arduino\sketch_jun21a\sketch_jun21a.ino:19:1: error: a function-definition is not allowed here before '{' token
{
^
C:\Users\Admi\Documents\Arduino\sketch_jun21a\sketch_jun21a.ino:42:1: error: expected '}' at end of input
}
^
exit status 1

Compilation error: a function-definition is not allowed here before '{' token

Das mit den geschweiften Klammern klappt bei mir noch nicht richtig.

Gruß Gibgut8

Zähle doch einfach mal die öffnenden { und die schließenden }. Die Anzahl muss gleich bleiben.
Schaue Deine Einrückungen an. Da könnte man einen strukturellen Aufbau vermuten.
Lies die Fehlermeldung: Am Ende vom Text fehlt eine }
Anscheinend fehlt die schließende } von loop.

Gruß Tommy

drück mal STRG-T und formatiere deinen Sketch - vermutlich siehst du dann die zwei Klammerfehler.

Und ein weiterer Hinweis:
Du kannst ein Klammer mit der Maus markieren und solltest dann das Gegenüber auch als markiert finden. Wenn nicht, könnte diese fehlen.

@gibgut8
NA Ja sieht aus als wurde das falsch kopiert :wink:

const byte pflanzenNum = 4;          // Anzahl der Kübel - darauf basiert dann die Pumpen etc...
const byte pumpePin[pflanzenNum] = {3, 4, 5, 6}; // Namen für Digitalpins 1-5
const byte sensorPin[pflanzenNum] = {A1, A2, A3, A4};
unsigned int sensorWert;
const unsigned int trocken = 600;
const unsigned int nass = 475;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  for (byte b = 0; b < pflanzenNum; b++)
  {
    pinMode(pumpePin[b], OUTPUT);
  }
}
void loop()
{
  for (byte b = 0; b < pflanzenNum; b++)
  {
    sensorWert = analogRead(sensorPin[b]);     // Wert von Sensor wird ausgelesen
    if (sensorWert > trocken)
    {
      digitalWrite(pumpePin[b], HIGH);        // Pumpe einschalten
      Serial.print(F("Pumpe"));
      Serial.print(b);
      Serial.println(F(": pumpt!"));
      digitalWrite(pumpePin, HIGH);            // Pumpe an
      Serial.println(F("Pumpe ist an"));
      delay(5000);                             // 5 Sekunden warten
      while (sensorWert > nass)                // Solange Sensorwert größer 475 ist nachfolgende Anweisungen ausführen
      {
        delay(2000);                           // 2 Sekunden Warten
        sensorWert = analogRead(sensorPin[b]); // Sensorwert auslesen. Zurück zu "while"
      }
      digitalWrite(pumpePin, LOW);             // Pumpe aus
      Serial.println(F("Pumpe ist aus"));
      // delay(3000);                          // 3 Sekunden warten
    }
  }
}

Das kompiliert, aber ob das tut was du willst?

Der Sketch verwendet 2374 Bytes (7%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 198 Bytes (9%) des dynamischen Speichers, 1850 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Wenn ein Fehler auftaucht würde ich mal über DIESE Zeile nachdenken.

digitalWrite(pumpePin, HIGH);            // Pumpe an  // Aber welche ???

Davon abgesehen würde ich das anders machen.

Pumpe eine Zeit X (muss man austesten) Laufen lassen.
Dann eine Zeit warten und DANN Sensor abfragen.

Vor den Ablauf eine Variable (boolean) setzen. Nass = false
Dann eine While-Schleife Nass = false

Wenn der Sensor NASS meldet, Nass auf TRUE setzten damit While -Schleife verlassen werden kann, dann schaltet die FOR -Schleife ein weiter, Nass wird wieder False gesetzt, und das Spiel geht von vorne los.

Gruß

Pucki

sonst regnet es rein. :wink:
Grüße Uwe

Zu wem schreibst du das?

Hallo,
Danke für die Anteilnahme.
So, jetzt habe ich den Sketch ohne Fehler compiliert. Jetzt mach ich mich an die Programm-Logik ran. Klar, ist der Sketch nicht ausschließlich von mir. Ich habe ihn an meine Hardware angepasst, die ich mit einem Breadboard verbinde. Muß auch noch die kapazitiven Fühler kalibrieren.
Gruß
Gibgut8

Vergiss die Pumpe nicht. Die muss auch Kalibriert werden. :wink: Nach der folgenden Formel.-
Benötigte Menge Wasser / Fördermenge der Pumpe = Laufzeit der Pumpe.

Und das macht man von Hand mit Stopuhr (im Handy) und verlässt sich NIE auf die Angaben des Herstellers. Und beachte die Förderhöhe dabei. Neue Förderhöhe kann das Ergebnis der Formel verändern. Sind halt kleine kuschelige China-TAUCH-Pumpen.

Gruß

Pucki