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.
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.
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.
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.
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
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.
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
Das REST-Wasser was nicht aufgesaugt ist, an den Sensor kommt
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.
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)
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.
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.
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.
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
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.
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. 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.