Pflanzenbewässerung

Hi ich habe heute mein erstes Projekt angefangen und dem entsprechend wenig Ahnung.. sorry
Ich möchte in Pflanzenbewässerungssystem bauen habe dafür
4x Bodensensoren Capacitice Soil Moisture Sensor v1.2
4x Pumpen
4er Relais
und einen Arduino UNO
das habe ich (bis auf den Arduino) im Set gekauft, der lieferte mir auch den „passenden“ Code mit:

intIN1=2;
intIN2=3;
intIN3=4;
intIN4=5;

intPin1=A0;
intPin2=A1;
intPin3=A2;
intPin4=A3;

floatvalue1=0;
floatvalue2=0;
floatvalue3=0;
floatvalue4=0;
voidsetup(){
 Serial.begin(9600);
 pinMode(IN1,OUTPUT);
 pinMode(IN2,OUTPUT);
 pinMode(IN3,OUTPUT);
 pinMode(IN4,OUTPUT);
 
 pinMode(Pin1,INPUT);
 pinMode(Pin2,INPUT);
 pinMode(Pin3,INPUT);
 pinMode(Pin4,INPUT);
 
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,HIGH);
 digitalWrite(IN3,HIGH);
 digitalWrite(IN4,HIGH);
 delay(500);
}
voidloop(){
 
 Serial.print("MOISTURELEVEL:");
 value1=analogRead(Pin1);
 Serial.println(value1);
 if(value1>550)
 {
   digitalWrite(IN1,LOW);
 }
 else
 {
   digitalWrite(IN1,HIGH);
  }
 Serial.print("MOISTURE LEVEL:");
 value2=analogRead(Pin2);
 Serial.println(value2);
 if(value2>550)
 {
   digitalWrite(IN2,LOW);
 }
 else
 {
   digitalWrite(IN2,HIGH);
 }
 
 Serial.print("MOISTURE LEVEL:");
 value3 = analogRead(Pin3);
 Serial.println(value3);
 if(value3>550)
 {
   digitalWrite(IN3,LOW);
 }
 else
 {
   digitalWrite(IN3,HIGH);
 }
 
 Serial.print("MOISTURE LEVEL:");
 value4=analogRead(Pin4);
 Serial.println(value4);
 if(value4>550)
 {
   digitalWrite(IN4,LOW);
 }
 else
 {
   digitalWrite(IN4,HIGH);
 }
 Serial.println();
 delay(1000);
}


Leider funktioniert er so nicht, ich habe mich daran versucht nun sieht er so aus 

void setup() {
 Serial.begin(9600);
 pinMode(IN1,OUTPUT);
 pinMode(IN2,OUTPUT);
 pinMode(IN3,OUTPUT);
 pinMode(IN4,OUTPUT);
 
 pinMode(Pin1,INPUT);
 pinMode(Pin2,INPUT);
 pinMode(Pin3,INPUT);
 pinMode(Pin4,INPUT);
 
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,HIGH);
 digitalWrite(IN3,HIGH);
 digitalWrite(IN4,HIGH);
 delay(500);
 
}
void loop(){
 Serial.print("MOISTURELEVEL:");
 value1=analogRead(Pin1);
 Serial.println(value1);
 if(value1>550)
 {
   digitalWrite(IN1,LOW);
 }
 else
 {
   digitalWrite(IN1,HIGH);
  }
 Serial.print("MOISTURE LEVEL:");
 value2=analogRead(Pin2);
 Serial.println(value2);
 if(value2>550)
 {
   digitalWrite(IN2,LOW);
 }
 else
 {
   digitalWrite(IN2,HIGH);
 }
 
 Serial.print("MOISTURE LEVEL:");
 value3 = analogRead(Pin3);
 Serial.println(value3);
 if(value3>550)
 {
   digitalWrite(IN3,LOW);
 }
 else
 {
   digitalWrite(IN3,HIGH);
 }
 
 Serial.print("MOISTURE LEVEL:");
 value4=analogRead(Pin4);
 Serial.println(value4);
 if(value4>550)
 {
   digitalWrite(IN4,LOW);
 }
 else
 {
   digitalWrite(IN4,HIGH);
 }
 Serial.println();
 delay(1000);
}

und ich bekomme die Fehlermeldung: exit status 1
'IN1' was not declared in this scope

Ich hoffe es kan mir jemand helfen und erklären wo das Problem liegt

Ich bin zwar auch noch ein blutiger Anfänger aber einen Tipp habe ich für dich: Fang erst mal damit an eine LED blinken zu lassen und verstehe die aller einfachsten Programmabläufe.

Dein vorhaben ist nicht schwer und du bekommst es sicher mit etwas Geduld und Übung hin.

Viele Grüße

So lässt sich der Code zumindest schon mal kompilieren, keine Ahnung ob er auch funktioniert, habe die Komponenten von dir nicht da und bin wie gesagt auch ein Anfänger.

int IN1 = 2;
int IN2 = 3;
int IN3 = 4;
int IN4 = 5;

int Pin1 = A0;
int Pin2 = A1;
int Pin3 = A2;
int Pin4 = A3;

float value1 =0;
float value2 =0;
float value3 =0;
float value4 =0;

void setup(){

  Serial.begin(9600);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
 
  pinMode(Pin1,INPUT);
  pinMode(Pin2,INPUT);
  pinMode(Pin3,INPUT);
  pinMode(Pin4,INPUT);
 
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,HIGH);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,HIGH);
  delay(500);
  
}

void loop(){
 
  Serial.print("MOISTURELEVEL:");
  value1=analogRead(Pin1);
  Serial.println(value1);
  if(value1>550)
  {
    digitalWrite(IN1,LOW);
  }
  else
  {
    digitalWrite(IN1,HIGH);
   }
  Serial.print("MOISTURE LEVEL:");
  value2=analogRead(Pin2);
  Serial.println(value2);
  if(value2>550)
  {
    digitalWrite(IN2,LOW);
  }
  else
  {
    digitalWrite(IN2,HIGH);
  }
 
  Serial.print("MOISTURE LEVEL:");
  value3 = analogRead(Pin3);
  Serial.println(value3);
  if(value3>550)
  {
    digitalWrite(IN3,LOW);
  }
  else
  {
    digitalWrite(IN3,HIGH);
  }
 
  Serial.print("MOISTURE LEVEL:");
  value4=analogRead(Pin4);
  Serial.println(value4);
  if(value4>550)
  {
    digitalWrite(IN4,LOW);
  }
  else
  {
    digitalWrite(IN4,HIGH);
  }
  Serial.println();
  delay(1000);
}

Hi

Bei Dir fehlen ~10 Leerzeichen
intIN4=5;
ist was ganz Anderes, als
int IN4=5;

Auch voidsetup(){ und void setup(){ unterscheiden Sich ein klein Wenig von einander.
Der Kram kompiliert sogar ohne Wahrnungen - wenn's auch kein schöner Code ist!

Du hast 4 identische Gegebenheiten - und dafür dann 4 Mal den exakt gleichen Code im Sketch - Das wäre prädestiniert für eine Zusammenfassung!

Nun gut - ich habe Mal ein/zwei Leerzeichen hinzugefügt und hier und Da die Klammern umgesetzt, damit der Kram zumindest halbwegs ansprechend aussieht:

//Forensketch https://forum.arduino.cc/index.php?topic=682420.0
//Ausgänge der 4 Feuchtigkeitsregelungen
const int IN1 = 2; //eine ewtas ungewöhnliche Bezeichnung für einen AUSgang
const int IN2 = 3;
const int IN3 = 4;
const int IN4 = 5;

//Eingänge der 4 Regelungen
const int Pin1 = A0;
const int Pin2 = A1;
const int Pin3 = A2;
const int Pin4 = A3;

//Platz für die eingelesene Feuchtigkeit
float value1 = 0;
float value2 = 0;
float value3 = 0;
float value4 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  pinMode(Pin1, INPUT);
  pinMode(Pin2, INPUT);
  pinMode(Pin3, INPUT);
  pinMode(Pin4, INPUT);

  digitalWrite(IN1, HIGH);  //die Relais scheinen LOW-aktiv zu sein?
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, HIGH);
  delay(500);
}

void loop() {
//Ausgabe des Feuchte-Wertes und Einschalten der Ausgang bei Wert>550
//Das passiert für alle 4 Sensoren/Ausgänge identisch - einzig der
//Pin zum Sensor und zum Relais ist jeweils unterschiedlich
  Serial.print("MOISTURELEVEL:");
  value1 = analogRead(Pin1);
  Serial.println(value1);
  if (value1 > 550) {
    digitalWrite(IN1, LOW);
  } else {
    digitalWrite(IN1, HIGH);
  }

  Serial.print("MOISTURE LEVEL:");
  value2 = analogRead(Pin2);
  Serial.println(value2);
  if (value2 > 550) {
    digitalWrite(IN2, LOW);
  } else {
    digitalWrite(IN2, HIGH);
  }

  Serial.print("MOISTURE LEVEL:");
  value3 = analogRead(Pin3);
  Serial.println(value3);
  if (value3 > 550) {
    digitalWrite(IN3, LOW);
  } else {
    digitalWrite(IN3, HIGH);
  }

  Serial.print("MOISTURE LEVEL:");
  value4 = analogRead(Pin4);
  Serial.println(value4);
  if (value4 > 550) {
    digitalWrite(IN4, LOW);
  } else {
    digitalWrite(IN4, HIGH);
  }
  Serial.println();

  delay(1000);
}
/*
Der Sketch verwendet 4132 Bytes (12%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 246 Bytes (12%) des dynamischen Speichers, 1802 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
 */

MfG

PS: Wenn Du Interesse daran hast, den Code in hübsch aufzubereiten - wir wären hier!
Edit 3 ... siehe #4

Edit
Der Code entspricht wohl Dem von frankwg - ist nur schöner eingerückt und ein paar const hatte ich auch über :wink:
Die Feuchte-Schwelle ist für alle 4 Sensoren auf 550 fest im Code verdrahtet - von der Logik her sollte Das So aber durchaus schon 'tun'.

Edit 2
Noch Mal kompiliert - ja, 'tut' - Größe eingefügt

bei deinem code bekomme ich auch eine Fehlermeldung

exit status 1
'IN1' was not declared in this scope

du meinst also das man den code besser schreiben könnte? wie sähe das denn aus dass ich mal ein vergleich hab ... wie gesagt ich mach das zum ersten mal und will auch wissen was ich tu :slight_smile:

Hi

Eigentlich solltest Du selber erst Mal versuchen, etwas halbwegs Brauchbares zusammen zu bekommen.
Da ich aber vorhin ‘nichts Besseres zu tun hatte’, habe ich Mal gebastelt:

//Forensketch https://forum.arduino.cc/index.php?topic=682420.0

//Bei welchem Pin-Zustand ist das Relais angesteuert?
const bool _AN = LOW;
const bool _AUS = !_AN;

//Pause zwischen den Messungen - ACHTUNG: erst nach der Pause wird
//das Wasser auch wieder abgestellt !!
const uint16_t wartezeit = 1000; //max 65535 = 65,5 Sekunden

//Struktur, um die zusammen gehörenden 'Dinge' zusammen zu haben
typedef struct {
  const byte outpin;
  const byte inpin;
  uint16_t schwellwert;
} FEUCHTE;

//Erstellen der einzelnen Mess-Kreise
FEUCHTE kreis[] = {
  //OUT-Pin, IN-Pin, Schwellwert
  {2, A0, 550},
  {3, A1, 550},
  {4, A2, 550},
  {5, A3, 550},
};

//Ermitteln der Anzahl angelegten Kreise
const byte anzahl = sizeof(kreis) / sizeof(kreis[0]);

void setup() {
  Serial.begin(9600);
  for (byte b = 0; b < anzahl; b++) {
    pinMode(kreis[b].outpin, OUTPUT);
    digitalWrite(kreis[b].outpin, _AUS);
    //für die IN brauchen wir kein pinMode, da Das das analogRead selber macht
  }
}

void loop() {
  //Ausgabe des Feuchte-Wertes und Einschalten der Ausgang bei Wert>Schwellwert
  //wann wurde das letzte Mal geprüft?
  static uint32_t lastmillis = millis();

  if (millis() - lastmillis > wartezeit) {
    //wenn die Wartezeit vorbei ist, dann alle Sensoren prüfen
    //und die Ausgänge entsprechend schalten
    // b ist nur eine Zähl-Variable, könnte auch 'x' nehmen ...
    for (byte b = 0; b < anzahl; b++) {
      Serial.print("Sensor ");  //Sensor 3
      Serial.println(b);        //MOISTURE LEVEL:334
      Serial.print("MOISTURE LEVEL:");
      uint16_t feuchtigkeit = analogRead(kreis[b].inpin);
      Serial.println(feuchtigkeit);
      digitalWrite(kreis[b].outpin, feuchtigkeit > kreis[b].schwellwert ? _AN : _AUS);
    }
    lastmillis += wartezeit;
  }
}
/* auf Uno/Nano
Der Sketch verwendet 2356 Bytes (7%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 240 Bytes (11%) des dynamischen Speichers, 1808 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
 */

Meine beiden Sketche kompilieren ohne Warnungen - oder meinst Du mich gar nicht?

MfG

… ungetestet, kompiliert aber, wie gesagt, ohne Warnungen o.Ä.

Edit
Auch der Sketch von frankwg kompiliert fehlerfrei (und ohne Warnungen) - auf was beziehst Du Dich?

ritterhugibert:
du meinst also das man den code besser schreiben könnte? wie sähe das denn aus dass ich mal ein vergleich hab ... wie gesagt ich mach das zum ersten mal und will auch wissen was ich tu :slight_smile:

Da ich (nicht nur hier und nicht nur von Anfängern) immer wieder ziemlich üblen Code zu sehen bekomme, habe ich mich mal zum Thema „schöner Code“ ausgelassen. Guck hier. Auf meinen anderen Seiten habe ich versucht, mich selbst daran zu halten - da ist hoffentlich auch zu erkennen, was ich meine.

Gerade als Anfänger macht man sich einen echten Gefallen, ein paar Code-Gestaltungsdinge zu beachten. Spätestens bei der Fehlersuche wirst Du merken, dass das mit der Schönheit nicht nur Künschtlergefasel ist.

Gruß

Gregor

@postmaster-ino
Ja ich meinte dich … Arduino IDE zeigt mir bei deine Code´s fehler an …
Ich hab mal ein screenshot gemacht

ritterhugibert:
@postmaster-ino
Ja ich meinte dich ... Arduino IDE zeigt mir bei deine Code´s fehler an ....
Ich hab mal ein screenshot gemacht

Auch Fehlermeldungen kannst du hier einstellen.

Die sind dann für ALLE besser lesbar.

Hi

Das ist aber keiner meiner Sketche - die Klammersetzung um das ELSE herum ist bei mir anders.

Sowohl der Sketch von frankwg wie meine Beiden (wobei der Erste Dem von frankwg entsprechen sollte) kompilieren alle Drei ohne Murren.
Wenn Du wider Erwarten trotzdem Probleme damit hast, brauchen wir Deinen Sketch - Meine zeigen, zumindest bei mir, keine Fehler/Warnungen.

MfG

Ich habe jetzt ein wenig experimentiert und komme nicht weiter.

Ich habe jetzt das Programm von postmaster genommen was er oben geschrieben hatte, vielen dank dafür

Die Relais schalten erst nach 30 Sekunden ab. Bis dahin läuft mir der Blumentopf doch schon über :wink:

Hi

Das hatte ich aber bereits erwähnt, daß die Abschaltung auch erst bei der nächsten Messung statt finden wird - frühestens!
Wenn kein Sensor angeschlossen ist, empfängt der Pin Radio (wirklich - nur Du kannst den Sender nicht auswählen) - man nennt Das auch 'Hausnummern' - oder eben Müll.

Naja - das Schalten mehrerer Relais von einem Sensor aus ist ja kein Problem - einfach den Sensor in dem eingestellten Kreis mehrfach vergeben - man kann hier auch die Schwelle individuell eintragen.
Ein Relais von mehreren Sensoren dagegen wird schwierig, da 'der Letzte gewinnt' - und wenn Der einschaltet, läuft die Pumpe halt die nächsten zwei Jahre ... hoffentlich sind Schwimmärmchen in ausreichender Anzahl vorhanden!

Bei allen 4 Sensoren angeschlossen sieht Das doch recht gleichmäßig aus - in welchem Bereich Dein Messwert liegt, hängt halt auch von dem Sensor selber ab - deshalb ist die Schaltschwelle ja einzeln einstellbar, daß man Da drauf reagieren kann im Programm.

Wenn die Pumpe maximal alle x Sekunden für y Sekunden laufen können darf, musst Du Das noch integrieren.
Oder öfter messen.

MfG

Aber ist es denn nicht möglich einen delay von 6 sek einzugeben … bei anderen funktioniert es doch auch gut die haben nur ein Sensor und Pumpe

ritterhugibert:
Aber ist es denn nicht möglich einen delay von 6 sek einzugeben … bei anderen funktioniert es doch auch gut die haben nur ein Sensor und Pumpe

Die Frage ist nicht ob es möglich ist, sondern ob Du es lernen willst.

Ich habe in einem sehr langen Thread mal eine Pflanzenbewässerung begleitet und dem OP einige Aufgaben gegeben um ihn zu animieren das Ergebnis selbst zu erarbeiten. Ist ein schönes Projekt gewesen und hat mir auch über die lange Zeit viel Spass gemacht.

Schau einfach mal rein.

Da ist auch IMHO mindestens ein gut kommentierter Code bei.
Fang bei #14 an zu lesen.

Sorry das hilf mit gar nicht, wie gesagt ich hab vorher nie einen Code gesehen und will das auch nur fertig bringen um mich anschließend einem leichterem Projekt zu widmen das ich mich da ein arbeiten kann.

Ich möchte eigentlich nur das dass Relais nach 6 sek zu macht dann 30 sek wartet und dann noch mal nach misst. Das ist für mich als Anfänger ohne hilf kaum zu bewerkstelligen wenn man keine Ahnung hat

ritterhugibert:
Sorry das hilf mit gar nicht, wie gesagt ich hab vorher nie einen Code gesehen und will das auch nur fertig bringen um mich anschließend einem leichterem Projekt zu widmen das ich mich da ein arbeiten kann.

Mach's doch andersrum: Arbeite Dich zuerst ein. Dann kannst Du das mit der Bewässerung prima selbst hinbekommen. Bis dahin läuft das mit dem Terrarium halt so wie bisher.

Gruß

Gregor

ritterhugibert:
Sorry das hilf mit gar nicht, wie gesagt ich hab vorher nie einen Code gesehen und will das auch nur fertig bringen um mich anschließend einem leichterem Projekt zu widmen das ich mich da ein arbeiten kann.

Doch das hilft Dir.
Du kannst auf Seite 7 gehen und den fertigen Sketch nehmen.
Da steht drin, wie das mit der Zeit läuft. Wie Du dahin kommst steht nicht drin. Dazu musst Du schon lesen - und der Thread demonstriert das sehr gut, was man mit einem "ich will eigentlich nur" übersieht.

Deine Entscheidung.

In dem Thread den du meinst geht es doch im was völlig anderes ich möchte nur das meine pumpen keine 30 sekunden- laufen weil das viel zu lange ist, und wenn du mir nicht helfen kannst oder willst wie man das macht dann misch dich bitte nicht ein, das ist Typisch online Forum alle wisse es besser aber keiner hilft.

... und Du heulst auf einem recht hohem Niveau ... ebenfalls typisch für Foren - Alles haben wollen, aber ja Nichts selber machen ...

Was ist so kompliziert daran, sich die UHRZEIT zu merken, wenn die Pumpe ANgeschaltet wird?
WAS ist weiter so kompliziert daran, diese gemerkte Uhrzeit von der aktuellen Uhrzeit abzuziehen?
Achtung: Die nennt sich im Arduino millis();
Was ist so schwer daran, die Differenz der beiden Zeiten mit der maximalen Laufzeit zu vergleichen, Die man sich wünscht?
Ach ja ... wenn die maximale Laufzeit überschritten (oder erreicht) ist, Pumpe abschalten ... nur, daß Du auch Da nicht noch ein Problem findest.

MfG

PS: Wenn DAS nicht geholfen hat, solltest Du echt wieder mit Lego spielen ... oder lustige Striche auf die Straße malen ...

ritterhugibert:
In dem Thread den du meinst geht es doch im was völlig anderes ich möchte nur das meine pumpen keine 30 sekunden- laufen

Nein nichts anderes. Wenn es Dir nicht möglich ist von 30 sekunden auf Deine gewollte Zeit zu transformieren und ggfls zu fragen wie das geht, dann tut es mir leid. Du hättest den Thread lesen können - dann wärest Du ganz schnell darauf gekommen, wie das geht. Joggel67 hat das geschafft - und ja es war mühsam. Und ich habe es sehr gerne getan.

Von daher nehme ich den Rest deiner mich betreffenden unverschämten Aussage zur Kenntnis.

postmaster-ino:
… und Du heulst auf einem recht hohem Niveau … ebenfalls typisch für Foren - Alles haben wollen, aber ja Nichts selber machen …

Was ist so kompliziert daran, sich die UHRZEIT zu merken, wenn die Pumpe ANgeschaltet wird?
WAS ist weiter so kompliziert daran, diese gemerkte Uhrzeit von der aktuellen Uhrzeit abzuziehen?
Achtung: Die nennt sich im Arduino millis();
Was ist so schwer daran, die Differenz der beiden Zeiten mit der maximalen Laufzeit zu vergleichen, Die man sich wünscht?
Ach ja … wenn die maximale Laufzeit überschritten (oder erreicht) ist, Pumpe abschalten … nur, daß Du auch Da nicht noch ein Problem findest.

MfG

PS: Wenn DAS nicht geholfen hat, solltest Du echt wieder mit Lego spielen … oder lustige Striche auf die Straße malen …

Das hätte man auch anständig kommunizieren können das du das wissen musst man kann aber auch den herablassenden Lehrer raus hängen lassen