Hallo Leute
Ich will eine Bewässerungsanlage mit einem Arduino Realisieren jedoch verzweifle ich an der Programmierung. Die Bewässerungsanlage soll mit 2 DFRobot Senoren SEN0308 und einem Temperatursensor SHT31 und einem Relais für die Wasserpumpe laufen. Die Anlage soll automatisch über die Sensoren laufen wenn die Feuchtigkeit zu gering ist und es sollte eine manuelle bedienung vorhanden sein damit man immer Wasser geben kann. Die werte sollen an einem Display abgelesen werden können. Bin dankbar für jeden Lösungsvorschlag den ihr habt.
Danke im Voraus.
Dann zeige uns doch mal, was Du schon geschrieben hast.
Ansonsten beginne mit den Beispielen der Libs zu Deinen Sensoren und lies diese ein und gib den Messwert erst mal auf dem seriellen Monitor aus.
Gruß Tommy
SHT31 ist ein I2C Modul, es gibt eine Lib von Adafruit im LibManager dazu.
Displays gibt's eine menge, such dir aus, natürlich mit einem I2C Backpack viel bequemer.
SEN0308 Ausgang einfach an analogen Pin anschließen.
Relais Modulen gibt's auch genug, manch sogar mit wählbaren Schaltpegel.
Danke für die schnelle Antwort , hier mal mein Code bin aber bin totaler anfänger was das angeht.
int LED_PIN = 13;
int BUTTON_PIN = 12;
int MOISTURE_SENSOR_PIN = A0; // Feuchtigkeitssensor Pin
int buttonstatus = 0;
int buttonZaehler = 0;
int letzterStatus = 0;
int messwert_Feucht =0; // Feuchtigkeitssensor
int moistureThreshold = 300; // Schwellenwert für Feuchtigkeit
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
pinMode(MOISTURE_SENSOR_PIN, INPUT);
}
void loop() {
buttonstatus = digitalRead(BUTTON_PIN);
messwert_Feucht = analogRead(MOISTURE_SENSOR_PIN);
if(buttonstatus != letzterStatus)
{
if (buttonstatus == 1)
{
buttonZaehler++;
}
else
{
digitalWrite(LED_PIN, HIGH);
}
}
if (buttonZaehler % 2 == 0) {
digitalWrite(LED_PIN, LOW);
buttonZaehler = 0;
} else {
if (messwert_Feucht < moistureThreshold) {
digitalWrite(LED_PIN, HIGH); // Pumpe ein, wenn Feuchtigkeit zu niedrig
} else {
digitalWrite(LED_PIN, LOW); // Pumpe aus, wenn Feuchtigkeit ausreichend
}
digitalWrite(LED_PIN, HIGH);
}
letzterStatus = buttonstatus;
Serial.println(buttonZaehler);
Serial.print("Feuchtigkeitswert: ");
Serial.println(messwert_Feucht);
delay(10);
Ich würde für den SHT31 eher zu dieser Lib tendieren, da Adafruit oft einen höheren Speicherverbrauch hat.
Gruß Tommy
Danke für die Antwort, wo finde ich diese und wie muss ich die hinzufügen?
es gibt youtube und Tutorials im Netz
Wenn ich mir deinen Sketch ansehe, frage ich mich, was der mit deiner gewünschten "automatischen" Pumpensteuerung zu tun hat.
Ich sehe da nur eine Tastenabfrage, aber nicht von den verwendeten Sensoren.
Da solltest du doch besser erst mal mit den Sensoren und dem auslesen dieser anfangen.
Und zwar möglichst erst mal nur einen. Wo du dafür Beisüpiele findest, wurde dir ja schon geschrieben.
Wen Du beide Sensoren am einem Pin hast bekommst ganz falsche Werte.
Musst auch dran denken, das bis sich das Wasser verteilt durchsickert und der Sensor anspricht, nach paar Sekunden schwimmen die Pflanzen je nach Pumpe.
Hallo
Danke für deine Hilfe
Die Taster sind eigentlich für eine manuelle Bedienung, ich will mit einem Schalter zwischen Auto und Manuell umschalten können, Auto wäre in diesem fall mit den Sensoren und einer Bewässerungszeit, Morgenfrüh und Abend, die manuelle Steuerung würde nur mit dem Sensorwert Arbeiten ohne die Zeit, damit man auch Tagsüber bewässern könnte.
Danke für deine Hilfe, ich habe jetzt mal einen Sensor eingefügt und kann die Werte jetzt am Monitor ablesen, sogar in Prozent. Kann ich mit dem Programm weiterarbeiten oder sollte ich neu beginnen und was müsste ich bei der Reihenfolge beachten?
Danke für den Tipp
Ich will das die Pumpe nur für eine kurze Zeit läuft und der Sensor nur alle 10min den Wert misst z.B. Die Zeiten kann ich dann ändern wenn ich sehe wie lange es in der Erde braucht bis die Feuchtigkeit steigt.
Wie kann ich diese Zeiten programmieren? Also das der Sensor nur alle 10 min misst?
Besten Dank
Da kommt es jetzt drauf an, ob du eine RTC verwenden willst, oder ob es reicht, dies über die "millis-Funktion" zu erledigen. Aus meiner Sicht, reicht da die millis aus.
Dazu sieh dir das Beispiel "BlinkWithoutDelay" in der IDE an. Da werden die millis verwendet.
Danke für die Hilfe, habe noch eine andere frage und zwar: Mit diesem Code sollte die Pumpe über den PIN 13 das Relais schalten und somit die Pumpe einschalten, wenn der Feuchtigkeitswert über 260 ist oder? Also wenn ich den Sensor ins Wasser halte geht der wert auf 0 und wenn er Trocken ist geht er auf 470. Somit schaltet die Pumpe doch bei 260 wieder aus oder?
int Relais_Pumpe = 13;
int Bodenfeuchtigkeitssensor = A0; // Feuchtigkeitssensor Pin
int messwert_Feucht =0; // Feuchtigkeitssensor
int vari;// Variable um in Wert in Prozent anzugeben
int letzterStatus = 0;
void setup() {
Serial.begin(9600);
pinMode(Relais_Pumpe,OUTPUT);
pinMode(Bodenfeuchtigkeitssensor,INPUT);
}
void loop() {
messwert_Feucht = analogRead(Bodenfeuchtigkeitssensor);
vari=map(messwert_Feucht,15,500,100,0);
if (messwert_Feucht > 260 ) {
digitalWrite(Relais_Pumpe, HIGH); // Pumpe ein, wenn Feuchtigkeit zu niedrig
} else {
digitalWrite(Relais_Pumpe, LOW); // Pumpe aus, wenn Feuchtigkeit ausreichend
}
Serial.print("Feuchtigkeitswert: ");
Serial.println(messwert_Feucht);
Serial.print(vari);
Serial.println("%");
delay(1000);
Da kommt es drauf an, was für ein Relais du verwendest.
Es gibt welche (Module) , die schalten mit LOW ein.
Schaltet bei High ein
Zeig doch mal einen Link zum Relais.
Und du solltest besser eine Hysteresis einbauen.
Z.B.
if (messwert_Feucht > 260 ) {
digitalWrite(Relais_Pumpe, HIGH); // Pumpe ein, wenn Feuchtigkeit zu niedrig
} if (messwert_Feucht < 200 )
{
digitalWrite(Relais_Pumpe, LOW); // Pumpe aus, wenn Feuchtigkeit ausreichend
}
Und für deinen Bedürfnisse anpassen.
Danke, habe es gerade zum laufen gebracht.
Prima, dann zeig hier bitte dein Ergebnis.
Eine Drahtverbindung war ebenfalls nicht gut, vermutlich hat es deshalb nicht funktioniert beim ersten Versuch. Ich verstehe dafür die millis funktion nicht ganz, ich will das der wert alle 10min ausgelesen wird und wenn der wert dann unter dem wert ist soll die pumpe für 10 sekunden laufen. dann wieder 10min warten bis zum nächsten wert wenn dieser gut ist lauft die pumpe nicht und wenn er nicht gut ist läuft sie wieder.
int Relais_Pumpe = 13;
int Bodenfeuchtigkeitssensor = A0; // Feuchtigkeitssensor Pin
int messwert_Feucht =0; // Feuchtigkeitssensor
int vari;// Variable um in Wert in Prozent anzugeben
int letzterStatus = 0;
void setup() {
Serial.begin(9600);
pinMode(Relais_Pumpe,OUTPUT);
pinMode(Bodenfeuchtigkeitssensor,INPUT);
}
void loop() {
messwert_Feucht = analogRead(Bodenfeuchtigkeitssensor);
vari=map(messwert_Feucht,15,500,100,0);
if (messwert_Feucht > 260 ) {
digitalWrite(Relais_Pumpe, HIGH); // Pumpe ein, wenn Feuchtigkeit zu niedrig
} if (messwert_Feucht < 200)
{
digitalWrite(Relais_Pumpe, LOW); // Pumpe aus, wenn Feuchtigkeit ausreichend
}
Serial.print("Feuchtigkeitswert: ");
Serial.println(messwert_Feucht);
Serial.print(vari);
Serial.println("%");
delay(1000);
}
Das mit millis ist nicht so kompliziert.
Du musst nur zu Anfang den Stand von millis merken und wenn die 10 min. um sind, deine Aktion ausführen.
Du kannst es dir auch mit "Interval" etwas leichter machen.
Schau mal Hier rein und lies es durch.