Arduino für Pflanzen während des Urlaubs nutzen - Einsteiger braucht Hilfe

Guten Abend zusammen!
Ich bin noch recht frisch im Thema Arduino und programmieren im generellen, also seht mir bitte Fehler nach :slight_smile:
Mein Name ist Jannis, ich bin 21 Jahre jung und wohne derzeit im Großraum Köln.
Für den Arduino hab ich mir schon einige Sachen angeschafft - Wobei ich zugeben muss, dass erst gekauft wurde und dann informiert.. :frowning: Dennoch möchte ich den Kram irgendwie verwursten - Und lernen kann man dabei ja auch!

Mein Plan ist ein Arduino, welcher meine Pflanzen für ca. 1-2 Wochen selbstständig gießt.

Mein Material sieht dabei wie folgt aus:

-Mega 2560 (Imitat)
-SainSmart Uno
- 4x Soil Humidity Sensor
- Tiny RTC
- DHT12
- 16x3 Display
- 12V Pumpe
- Durchlaufsensor (YF-S401 Water Flow Sensor)
- Diverse Bauteile (Widerstände,Dioden etc.)

Mein Plan sieht so aus, dass ich einen der beiden Arduinos mit der RTC koppeln möchte, um so Zeitgesteuerte Aktion besser durchführen zu können - Anstatt mit der delay Funktion.
Es soll so laufen, dass der Arduino mindestens 2 Soil Humidity Sensoren Werte gleichzeitig ausließt, diese miteinander vergleicht und falls der Wert unter einen definierten Bereich fällt (zB. <50%)
eine definierte Wassermenge durch den Durchlaufsensor abgibt.
Gleichzeitig sollen die Temperatur und die RLF mittels DHT12 gemessen werden und alles soll an das Display ausgegeben werden.
Soweit so gut. Doch wie mach ich das alles ?
Ich habe mir für dir RTC bereits einen Sketch angeschaut und sie entsprechend eingestellt.
Für die SoilSensors hab ich ebenfalls bereits Sketche geschrieben, welche ich später in den kompletten Sketch einbauen möchte. Dabei dachte ich an eine simple If-Abfrage.

Für den Durchlaufsensor, die Pumpe und die genaue Kalendarische Abfolge habe ich aber leider noch garkeinen Plan, wie ich das durchbringen soll.

Damit ihr mich nicht falsch versteht, ich möchte nicht, dass ihr ganze sketche vorbetet. Lediglich Erklärungen, Hilfestellungen oder verlinkungen würden mir glaube ich schon weiterhelfen.
Ich möchte halt dabei was lernen, und das geht eher schlecht als recht wenn ich einfach copy + paste mache.

Bei all den Sensoren die einsetzen möchte, frage ich mich natürlich, ob die Pins beim uno ausreichen oder ob ich lieber den mega verwenden sollte. Wie seht ihr das ? Habt ihr da eventuell Ideen, Vorschläge oder sogar Links für mich ?

Ich freue mich auf eure Beiträge!

Liebe Grüße,
der Jannis

shubliu:
Ich bin noch recht frisch im Thema Arduino und programmieren im generellen ...
Mein Material sieht dabei wie folgt aus ...

Was Du vorhast, ist für einen Einsteiger IMO zu viel. Knöpfe Dir zunächst nur ein paar einfache Dinge aus den Beispielen vor. Wenn Du die hast, kannst Du das mit dem Auslesen der Sensoren angehen. Am besten (IMO) realisierst Du die Sachen nacheinander, bis Du sie im Griff hast. Dann kommt das Nächste ...

HTH

Gregor

Für das was du beschrieben hast, sollte der Uno dicke reichen. Und falls dir die I/O's ausgehen, kann man auch noch mit Portexpandern und den integrierten Schnittstellen "aufrüsten". Z.B. das erwähnte Display mittels "Huckepackplatine" über I2C betreiben. Das sind nur zwei gegenüber 7 Pins und außerdem ist I2C ein Bus, den du auch noch für andere Dinge parallel nutzen kannst. Sollte das Projekt mal fertig sein, kannst du statt des Uno's auch einen Nano oder Pro Micro nehmen und den Uno weiter zum experimentieren nehem. Oder einen nackten Atmega328 auf einer Lochrasterplatine mit ein paar Bauelementen verlöten.

Auch von mir ein Hallo und als ersten Link eine "vernünftige" RTC.

RTC DS3231

Wobei der Link nur als Beispiel zu sehen ist, es gibt noch billigere und auch teurere.
Diese RTC ist deutlich genauer als die von dir beschriebene DS1307, die pro Tag mehrere Sekunden falsch gehen kann.
Was die anderen Dinge betrifft, stimme ich meinen Vorrednern zu. Nimm I2C für das Display und du sparst dir Pins. Für die RTC benötigst du I2C sowieso.

Den notwendigen Adapter für das Display hier auch als Beispiel-Link.

Guten Morgen!

Ich weiß, dass Vorhaben ist vielleicht etwas hochgegriffen, aber bis zu den Ferien sollte hier was stehen ;D
Mit dem Arduino habe ich schon davor etwas rumgespielt.
Ich hatte vor ein paar Monaten bereits einen Code geschrieben, dieser hat aber eher semi optimal funktioniert .. Also eigentlich kam er nie zum Einsatz :smiley:

int soil_humidity_1;
int soil_humidity_2;
int motorPin = A0;
int blinkPin = 13;
int watertime = 5000;
int waittime = 20000;

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

void loop()
{
// Für zwei Feuchtigkeitsmesser

int sensorValue = analogRead(A1);
sensorValue = constrain(sensorValue, 485 , 1023);
soil_humidity_1 = map(sensorValue, 485, 1023, 100, 0);
Serial.print(soil_humidity_1);
Serial.println("%");
delay (1000);

int sensorValue_2 = analogRead(A2);
sensorValue_2 = constrain(sensorValue_2, 485 , 1023);
soil_humidity_2 = map(sensorValue_2, 485, 1023, 100, 0);
Serial.print(soil_humidity_2);
Serial.println("%");
delay (1000);

// hier soll die if-Abfrage hin
if(soil_humidity_1 < 50 && soil_humidity_2 < 50)
{
digitalWrite(motorPin, HIGH);
digitalWrite(blinkPin, HIGH);
delay(watertime);
digitalWrite(motorPin, LOW);
digitalWrite(blinkPin, LOW);
delay(waittime);
}
}

Da wird mit delay gearbeitet und ohne Display. Nicht so ganz das, was ich mir dabei wünsche..
Nur vom Ablauf her, könnte ich mich doch weiterhin daran orientieren, oder ? Natürlich würde die definierten "..time" dann rausfallen.

Ich würde sowieso jetzt erstmal versuchen, einzelne sketche für die einzelnen Sensoren aufzubauen und diese im finalen Sketch zusammenführe mit ein paar extra parametern.
Kann ich auf eure Hilfe hoffen ? :slight_smile:

Mir ist noch nicht ganz klar, wofür du die RTC brauchst.

Du misst ja die Feuchte in der Erde. Wenns zu trocken wird, einfach gießen.
Oder warum willst du, wenn die Feuchte in der Erde unter das Minimum fällt, erst noch ein paar Tage warten, bis der nächste Gießzyklus anfällt?

Also ich würde das so machen:

loop(){
Alle_100ms(){
  Feuchtesensoren_lesen();  // Sensoren werden gelesen, Fehler abgefangen und Werte gefiltert
  DHT_lesen();                     // DHT wird gelesen, Fehler abgefangen und Werte gefiltert
}
Alle_1Sek(){
  Display_Schreiben();
  Feuchte_prüfen();            // prüfen, ob bewässert werden muss, dann Flag setzen
}
bewässern();  // prüft bewässerungsflag, lässt für tbd Sek die Pumpe laufen.
} // end loop()

Da Pumpen meist recht konstante Förderquoten haben, würde ich den Durchflusssensor höchstens zur Absicherung verwenden, ob auch wirklich Wasser gefördert wird. Brauchen tust du ihn nicht.

Hi Gunther!

Mir wurde mal gesteckt, dass die delay Funktion generell eher zu vermeiden ist, da damit halt das gesamte System angehalten wird. Deswegen sollte die RTC jeden Tag mehrfach die Feuchte messen. So zumindest das Sinnbild.

Dass die Förderquote konstant ist, hätte ich jetzt so nicht gedacht.. Wieder was gelernt! :slight_smile:
Mein Gedanke beim Durchflussensor war, dass ich halt größere Blumentöpfe dabei habe, welche einen gewissen Satz an Wasser benötigen. Man könnte die Zeit messen, die die Pumpe braucht um zB. 500ml zu fördern und diesen Wert dann einsetzen. Das ist mir aber etwas zu unsicher..
Ansonsten könnte man den Part des Zeit zählen sich auch stecken, wenn man sagt, dass das Wasser einfach nur fließen soll, bis ein Wert von 80% feuchte gemessen wird. Allerdings seh ich hier das Problem, dass das nicht schnell genug versickerte Wasser die Messung zu sehr beeinflusst.

Wenn du alle x Zeiteinheiten was machen willst kann man das meistens mit millis() erschlagen. Das gibt dir die Zeit in ms seit dem Einschalten des Controllers zurück. Damit kann man dann vergleichen ob eine bestimmte Zeit abgelaufen ist. Schau dir das BlinkWithoutDelay Beispiel an.

Eine RTC nimmt man eher wenn etwas genau zu einer bestimmten Uhrzeit geschehen muss. Oder wenn man einen sehr genauen Sekundentakt braucht. Das ist bei dir eigentlich nicht der Fall.

shubliu:
Mir wurde mal gesteckt, dass die delay Funktion generell eher zu vermeiden ist, da damit halt das gesamte System angehalten wird. Deswegen sollte die RTC jeden Tag mehrfach die Feuchte messen. So zumindest das Sinnbild.

Delay ist immer eine schlechte oder besser keine Alternative. Das hat aber nichts damit zu tun, dass du dazu eine RTC brauchst. Delay kann man durch "millis" quasi ersetzen. Ist allerdings etwas komplizierter.

Aber deine Idee, per RTC eine Zeitvorgabe zum Messen der Feuchte zu erhalten, ist auch nicht schlecht.

So kannst du an verschiedenen Zeitpunkten messen und darauf reagieren.

Guten Abend,

ich habe, entsprechend meiner Vorstellung und meinem Verständnisses, mal versucht einen Schaltplan aufzustellen. Ich bin kein Elektriker und habe bisher noch nicht allzuviele Schaltplane gezeichnet, also verzeiht mir bitte diverse Fehler oder unüberischtlichkeiten.

Ich hoffe, ihr könnt was damit anfangen.. :smiley:
So, wie es dort aufgezeichnet ist, haut es doch nicht hin, oder ?
Ich kann mir nicht vorstellen, dass der Soil Sensor, der Durchflusssensor, die Pumpe, der DHT sowie das Display alle den Saft des Arduinos nutzen können. Da muss doch noch irgendwo eine externe Stromquelle hin, oder ? Und wo genau ?

Die Verkabeln von der Pumpe hab ich hier gefunden:
Link

Ich möchte nur ungern meine Bauteile einzeln in den Himmel schicken... :smiley:

Du musst unbedingt den Motor oder was es ist vom digitalen Pin1 auf einen anderen Pin legen.
Pin0 und Pin1 sind für die serielle Schnittstelle reserviert.
Und für die Pumpe musst du unbedingt ein zusätzliche Spannungsversorgung herstellen.

Und ich glaube nicht dass dieser Pin mit GND vom Display verbunden werden soll

Serenifly:
Und ich glaube nicht dass dieser Pin mit GND vom Display verbunden werden soll

Ups, das habe ich auf meinem Tablet ja noch nichtmal erkannt.
Muss das doch gleich noch am PC ansehen.

Das ist ja allerfeinste Elektronik. :slight_smile:

Oh.. Tja, späte Mühe lohnt nicht.. :smiley:

Also: Die Pinbelegung vom Durchlaufsensor muss anders belegt werden. Ginge denn der dig.Pin 3 ?
Und natürlich sollte diese Verbindung nicht mit der GND des Display belegt werden.. Dieser müsste auf eine GND Bahn gelegt werden. :smiley:

Wie ist es genau mit der Pumpe ? Ich hab hier irgendwo ein paar 12V Netzteile rumfliegen.. Wird die Anode an die Pumpe angeschlossen und die Kathode an die GND des Arduinos ?
Weil wenn ich sowohl Anode als auch Kathode direkt an die Pumpe bringe, läuft diese doch unabhängig vom Arduino, ganz egal ob er jetzt fördern soll, oder nicht.

Wenn ich den schematischen und sicheren Aufbau geschafft habe, setzte ich mich an einen vernünftigen Sketch. Möchte nur die Arbeit nicht umsonst machen, weil ich die Schaltung noch abändern muss :wink:

Ich danke euch schonmal!

Wenn du 12V mit einem Arduino schalten willst muss ein Transistor dazwischen. Das ist doch schon in dem Schaltplan so.


z.B. IRLZ34, IRLZ44 oder IRLU024

Ich habe dir mal die Stromversorgung in deinen Schaltplan eingezeichnet, die Pumpe betreffend.

Der PN2222A scheint mir etwas klein zu sein, aber das hängt von deine Pumpe ab.

Von delay() habe ich nichts geschrieben.
Ein Zeitscheibenmodell könnte z.B. so funktionieren:

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  if (Zeitscheibe_100ms()){
     // Befehle, die alle 100ms ausgeführt werden sollen
     Serial.print("Aufruf Zeitscheibe: ");Serial.print(millis());Serial.println("ms")
  } // Ende 100ms Zeitscheibe

  
  if (Zeitscheibe_1sek()){
     // Befehle, die alle 1000ms ausgeführt werden sollen
     Serial.print("Aufruf Zeitscheibe 1sek: ");Serial.print(millis()/1000.0);Serial.println("sek")
  } // Ende 1sek Zeitscheibe
    
}

boolean Zeitscheibe_100ms(){
  static unsigned long lasttrue = 0;  
  if (millis() - lasttrue >= 100){
    lasttrue = millis();
    return true;
  }
  return false;
}

boolean Zeitscheibe_1sek(){
  static unsigned long lasttrue = 0;  
  if (millis() - lasttrue >= 1000){
    lasttrue = millis();
    return true;
  }
  return false;
}

Geht natürlich auch anders. Viele Wege führen zum Ziel.

Um wirklich beurteilen zu können, welche deiner Bauteile wie versorgt werden müssen, bräuchte man mehr Angaben. Vor allem: mit welcher Spannung laufen sie, wieviel Strom ziehen sie, dauernd / Peak?

Grad ist die Faktenlage etwas dünn.

Zum Gießverfahren:
Meist ist die exakte Wassermenge ja nicht so wichtig. Etwas mehr oder weniger Wasser bedeutet nur, dass die Zeit zum nächsten Gießen verschiebt.
Ausserdem musst du nach dem Wässern einen Totzeit einführen, bis sich das Wasser im Topf verteilt hat und der Sensor den richtigen Wert anzeigt. Du kannst ja auch sowas machen:
Untere Feuchtigkeitsmenge erreicht:
10sek Pumpen
10 min warten, Feuchte Messen
Obere Feuchte erreicht? Nein:
10sek Pumpen
10 min warten, Feuchte Messen
Obere Feuchte erreicht?....

Wie so oft ist es erst mal wichtig was genau passieren soll, bevor man anfängt zu programmieren.
Schreib / mal dir doch mal einen Ablauf auf, wie das passieren soll.
Stell dir vor, du hast einen extrem dummen Helfer, der 4 Wochen deine Blumen gießen soll, und dem schreibst du eine sehr detaillierte Handlungsanweisung.

Hallo!

Okay.. Ich glaube, ich kann das verstehen.. Es ist aber kein Problem, wenn die Kathoden mehrerer "Verbraucher" zusammenlaufen? Auf der Skizze kommen ja die GND's vom DHT, des Senors, der ext. Stromversorgung und des Display zusammen.

Hier hab ich die Daten zur Pumpe gefunden:
Spannungsversorgung: 6 - 12 V DC
Stromaufnahme: 50 - 100 mA
Pumphöhe unter normalen Bedingungen: ca. 0,5 - 2,6 m
Pumpvolumen: ca. 0,8 - 2,5 l/min

Und das hab ich zum Flowsensor gefunden:
The lowest rated working voltage: DC4.5 5V-24V
Maximum operating current: 15 mA (DC 5V)
Working voltage range: DC 5~18 v
Load capacity: <= 10 mA (DC 5V)
Use temperature: <= 80 C
Operating humidity range: 35%~90%RH (no frost)
Allowing pressure: pressure 2.0Mpa
Temperature: -25~+80 C

Der Ablauf ist (im Prinzip) ganz einfach, hoffe ich.. :smiley:

  • Messe alle 6h die Feuchtigkeit in Topf A,B, evtl C.
  • Gleiche nach jedem Messen die Werte untereinander ab
  • Überprüfe, ob mindestens 2x Werte <20% liegen
  • Falls ja, gieße für 20sek und messe 20min danach nochmal die Feuchtigkeit und vergleiche wieder (<20%)
  • Falls min. 2x Werte >20% <50% liegen, führe eine erneute Messung in 3h durch
  • Falls die Werte >50% sind, wiederhole die Messung in 6h

Ich hab es jetzt mal versucht, möglichst einfach zu machen. Komplett ohne Flowsensor..

Von der Zeitscheibe höre ich so zum ersten mal, ich bin mir noch nicht ganz sicher, ob ich den Code so verstanden habe. Im Prinzip lässt du also nur eine Aktion in einem definierten Zeitintervall immer wieder ablaufen, aber ohne dafür mit int zu arbeiten ? Hätte jetzt gedacht, dass man zuvor irgendwas definieren muss.
Was genau wird mit dieser Zeile abgefragt:
static unsigned long lasttrue = 0 ?

Danke dir!

Kann ich vom Ablauf her, darauf aufbauend einen Sketch zusammen zimmern ? Oder fehlen mir da noch logische Ansätze ?

shubliu:
Was genau wird mit dieser Zeile abgefragt:
static unsigned long lasttrue = 0 ?

Die Variable lasttrue wird als unsigned long mit vier Byte ohne Vorzeichen definiert und ist statisch. Lokale Variablen gelten nur bis zum Ende der Funktion, lokale statische Variablen bleiben bestehen. Sie verhalten sich damit wie globale Variablen, sind aber nur innerhalb der Funktion "sichtbar". Daher können auch mehrere Funktionen gleiche Variablennamen nutzen. Beim ersten Aufruf der Funktion erhält die Variable den Wert Null.

Bitte schaue für eine genaue Beschreibung nochmal in einem Nachschlagewerk nach, ein paar Stichworte hast Du ja nun. Ich will ja kein Buch schreiben.

Zeitscheibenverfahren=Multitasking

hi,

der thread ist zwar tot, aber ich bin grad auf diesen feuchtesensor gestoßen, der recht gut aussieht. falls jemand was ähnliches sucht, findet er's hier.

http://de.aliexpress.com/item/Smart-Electronics-Soil-Moisture-Hygrometer-Detection-Humidity-Sensor-Module-For-arduino-Development-Board-DIY-Robot-Smart/32328189936.html?spm=2114.47010108.6.1.wjNxH1&&scm=1007.12785.38449.0

gruß stefan