Automatische Bewässerung mit Arduino Uno

moin, wenn Du VOR jeder Sensorausgabe einen String aus 4x Leerzeichen ausgibst, überschreibt Dir dies die "alte" Ausgabe. Vielleicht solltest Du einfach mal Deinen Sketch hier zeigen ...

Manfred

Zwei Optionen: 1.) Formatiere deine Zahlen entweder vor oder während der Ausgabe auf eine konstante Breite. Das ist der übliche Weg bei Zahlen

2.) Merke dir wie breit die letzte Ausgabe war und fülle die Differenz mit Leerzeichen auf. Bei Zahlen nicht so gut, aber praktisch wenn man Text variabler Breite ausgibt.

Vielen lieben Dank für die Antworten! Ich schaus mir heute Abend mal genauer an..

Habe den Sketch leider hier auf der Arbeit nicht abgespeichert..

Melde mich dann später wieder - danke Euch!

Hallo, wie versprochen melde ich mich hier nochmals.

Ich habs jetzt soweit hinbekommen. Jedoch muss ich vor jeder eigentlichen Ausgabe, beide Zeile à 16 Zeichen komplett mit Leerzeichen löschen, ansonsten funktionierts irgendwie nicht. ::slight_smile:

Um jetzt nicht das ganze Forum Vollzuspamen, werde ich meine nächste Frage gleich hier reinposten, ich hoffe das ist in Ordnung.

Mein Einsteiger-Projekt ist ein automatisiertes Bewässerungssystem, welches eine (12V) Pumpe automatisch, je nach Wert der Bodenfeuchtigkeitssensoren an-oder ausschaltet.

Das funktioniert soweit alles Tiptop und ich verstehe Hardware - sowie auch Softwaretechnisch auch warum.

Nur habe ich wohl einen kleinen Logikfehler in meinem Sketch (oder in meiner Verkabelung):

Jedes Mal, wenn ich den Arduino (Uno) neu starte (oder den Sketch update), geht automatisch die Pumpe an, bis die Daten der Sensoren ausgewertet sind und der Arduino “erkennt”, dass die Erde in Ordnung ist.

Frage: Wie unterbinde ich das automatische Einschalten der Pumpe bei einem Neustart/Einschalten des Arduino ? Rein von der Logik her im Sketch, müsste er ja als erstes die Sensoren auswerten, und dann entscheiden ob die Pumpe gestartet wird oder nicht ? :fearful:

Die Pumpe wird übrigens über ein Relay eingeschaltet welches NO angeschlossen ist (Weshalb ich das einschalten der Pumpe am Anfang auch nicht verstehe…)

Vielen Dank für Eure Hilfe! Anbei noch der Sketch (Steinigt mich nicht…):

//Lcd-Library einbinden//
#include <LiquidCrystal.h>


//Werte vom Bodenfeuchtigkeitssensor://

//0~300    Zu trockene Erde, giessen.
//300~700  Erde in Ordnung, nicht giessen.
//700~950  Erde nass.


//Pumpe-Relais definieren (Digital-Pin 13)//
#define Pumpe 13

//Feuchtesensor Variablen definieren//
int feuchteSensor1 = 0;
int feuchteSensor1_val;

int feuchteSensor2 = 1;
int feuchteSensor2_val;

//Lcd initialisieren / Pins festlegen//
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


//Pins festlegen - Lcd-begin//

void setup() {
  
  pinMode (Pumpe, OUTPUT);//Pumpe-Pin
  Serial.begin (9600);//Serial-Begin
  lcd.begin(16, 2);//Lcd-begin

  
}
// Sensoren auslesen//
void loop () {


  feuchteSensor1_val = analogRead(feuchteSensor1); //Feuchtesensor-Wert 1 auslesen
  Serial.print("Lese Feuchtesensor 1 - Daten aus: ");
  Serial.println( feuchteSensor1_val );
  delay(2000);
  lcd.setCursor(0, 0);//Lcd loeschen
  lcd.print("                ");//Lcd loeschen
  lcd.setCursor(0, 1);//Lcd loeschen
  lcd.print("                ");//Lcd loeschen
  delay(100);
  lcd.setCursor(0, 0);//Sensordaten auf Lcd ausgeben
  lcd.print("Messe Erde:");
  lcd.setCursor(0, 1);
  lcd.print("Sensor 1:");
  lcd.setCursor(10, 1);
  lcd.print(feuchteSensor1_val);
  delay(3000);
  
  feuchteSensor2_val = analogRead(feuchteSensor2);//Feuchtesensor-Wert 2 auslesen
  Serial.print("Lese Feuchtesensor 2 -Daten aus: ");
  Serial.println( feuchteSensor2_val );
  delay(2000);
  lcd.setCursor(0, 0);//Lcd loeschen
  lcd.print("                ");//Lcd loeschen
  lcd.setCursor(0, 1);//Lcd loeschen
  lcd.print("                ");//Lcd loeschen
  delay(100);
  lcd.setCursor(0, 0); //Sensordaten auf Lcd ausgeben
  lcd.print("Messe Erde:");
  lcd.setCursor(0, 1);
  lcd.print("Sensor 2: ");
  lcd.setCursor(10, 1);
  lcd.print(feuchteSensor2_val);
  delay(3000);

//Pumpe anhand von Messergebnissen an / oder ausschalten//
  
  if (feuchteSensor1_val < 250 && feuchteSensor2_val < 250) //Wenn Sensor1 & Sensor2 Wert unter 300 - Starte Bewässerung!
  {
    lcd.setCursor(0, 0);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    lcd.setCursor(0, 1);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    delay(100);
    lcd.setCursor(0, 0);//Auf Lcd ausgeben
    lcd.print("Erde zu trocken:");
    lcd.setCursor (0,1);
    lcd.print("Pumpe ist an!");
    Serial.println("Erde zu trocken, starte Giessvorgang!"); 
    digitalWrite (Pumpe, LOW); //Pumpe Starten
    delay(1000);
   }
   
  if (feuchteSensor1_val > 250 && feuchteSensor2_val  > 250) //Wenn Sensor1 und Sensor2 Wert über 300 - Keine Bewässerung!
  {
    lcd.setCursor(0, 0);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    lcd.setCursor(0, 1);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    delay(100);
    lcd.setCursor(0, 0);
    lcd.print("Erde in Ordnung:");
    lcd.setCursor(0, 1);
    lcd.print("Pumpe ist aus!  ");
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!"); //Pumpe abschalten oder abgeschaltet lassen
    digitalWrite (Pumpe, HIGH);
    delay(5000);

  }
   else //alle anderen Werte (z.b ein Sensor unter 300, aber anderer Sensor über 300)
  {
    lcd.setCursor(0, 0);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    lcd.setCursor(0, 1);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    lcd.setCursor(0, 0);
    lcd.print("    ");//Lcd loeschen
    lcd.print("Erde in Ordnung:");
    lcd.setCursor(0, 1);
    lcd.print("Pumpe ist aus!  ");
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!"); //Pumpe abschalten oder abgeschaltet lassen
    digitalWrite (Pumpe, HIGH);
    delay(5000);

  }

}

define Pumpe 13

Nehme einen anderen Pin als 13. Der blinkt mit jedem Neustart.

Hier ist mal einfacher Code um eine Zahl auf konstant “width” Zeichen Breite zu formatieren. Optional rechtsbündig

void prettyPrint(long value, int width, bool rightadjust = false);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  prettyPrint(10, 3);
  prettyPrint(100, 3);
  prettyPrint(1000, 3);
  prettyPrint(10, 4);
  prettyPrint(100, 4);
  prettyPrint(1000, 4);
  prettyPrint(10, 5);
  prettyPrint(100, 5);
  prettyPrint(1000, 5);
  prettyPrint(10, 6, true);
  prettyPrint(100, 6, true);
  prettyPrint(1000, 6, true);
  prettyPrint(10, 4, true);
  prettyPrint(100, 4, true);
  prettyPrint(1000, 4, true);

  Serial.println();
  delay(2000);
}

void prettyPrint(long value, int width, bool rightadjust)
{
  long val = (value < 0) ? value * -1 : value;
  if (value < 0) width--;

  if (!rightadjust) Serial.print(value);

  unsigned long num = 10;
  for (int i = 0; i < width - 1; i++)
  {
    if (val < num) Serial.print(' ');
    num = num * 10;
  }

  if (rightadjust) Serial.print(value);

  Serial.println();   //diese Zeile bei LCDs entfernen!
}

Es gibt da auch Keulen wie sprintf(), aber das ist bei einer Zahl Overkill

Anmerkung:
Der Arduino Parser macht wieder mal Scheiße beim Erzeugen der automatischen Funktions-Prototypen und erkennt den Default Parameter nicht korrekt. Deshalb der explizite Prototyp am Anfang.

@sschultewolter: Vielen Dank...! Da hab ich wohl zu weit gesucht.. Funktioniert jetzt bestens!

@serenifly: Auch dir, vielen Dank Fürs erläutern der konstanten Breite - Auch das funktioniert jetzt super + der ganze Sketch sieht somit auch ein bisschen weniger "verbastelt" aus :-)

Danke euch !

Das geht übrigens auch mit Text so:

void prettyPrint(const char* str, int width, bool rightadjust = false);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  prettyPrint("0123456789abcdef", 16);
  prettyPrint("012345", 16);
  prettyPrint("012345", 16, true);
 
  Serial.println();
  delay(2000);
}

void prettyPrint(const char* str, int width, bool rightadjust)
{
  if (!rightadjust)
    Serial.print(str);

  int length = strlen(str);
  for (int i = 0; i < width - length; i++)
    Serial.print(' ');

  if (rightadjust)
    Serial.print(str);

  Serial.println();
}

Die Funktionen kannst du beide so mit dem gleichen Namen im Programm haben, da die unterschiedliche Parameter haben.

Das println() ganz am Ende der Funktion sollte man auf LCDs aber nicht machen. Schadet vielleicht nichts, aber LCDs können damit nichts anfangen.

Den Text zu zentrieren wäre auch denkbar. Dann muss man die Differenz zwischen width und length durch zwei Teilen und einen Teil der Leerzeichen vor dem String und den anderen Teil nachher ausgeben

Das Problem mit der vorherigen Löschen ist dass dann das Display flackert. Vor allem wenn man das schnell macht. Das ist auch bei TFTs der Fall. Generell immer direkt Altes mit Neuem überschreiben und nur die Differenz löschen.

Vielen lieben Dank für die ausführliche Erklärung @serenifly! Ich werde versuchen das ganze heute Abend zu implementieren.

Mein cc3000 Wifi-Shield ist heute auch angekommen, ich hoffe das Teil stellt mich dann nicht noch vor weitere Probleme (Ich möchte die Sensorwerte in einer kleinen Webapplikation ausgeben).

Das cc3000 scheint mir aber recht gut dokumentiert (adafruit etc.) und Php/Webtechnisch sollte es für mich kein Problem darstellen. Hoffe ich bringe das Teil Hardware / sowie Arduino-Sketchtechnisch zum laufen ;-)

Ich habe den Titel des Threads angepasst, da es nicht mehr “nur” um das Display, sondern eher generell um das ganze Projekt geht.

Mein CC3000-Wifi (Breakout) ist heute angekommen, habe das ganze gelötet und es funktioniert wunderbar.

Ich hatte in einem vorherigen Post schon gefragt, wieso der Arduino die Pumpe/das Relais bei jedem Neustart/Sketchupload anwirft und erst abstellt wenn die Sensoren die Messergebnisse liefern, wenn er doch laut Loop zuerst die Sensoren auslesen soll und erst dann entscheiden soll ob die Pumpe angeht oder nicht.

sschultewolter:
#define Pumpe 13

Nehme einen anderen Pin als 13. Der blinkt mit jedem Neustart.

Habe praktisch alle Pins durchprobiert… die Pumpe geht jedesmal an. Hat irgendwer noch eine Idee dazu ? Ein Verkabelungstechnisches Problem kann ich, glaube ich zumindest, ausschliessen.

Vielen Dank !

//Lcd-Library einbinden//
#include <LiquidCrystal.h>


//Werte vom Bodenfeuchtigkeitssensor://

//0~300    Zu trockene Erde, giessen.
//300~700  Erde in Ordnung, nicht giessen.
//700~950  Erde nass.


//Pumpe-Relais definieren (Digital-Pin 7)//
#define Pumpe 7

//Feuchtesensoren definieren//
int feuchteSensor1 = 1;
int feuchteSensor1_val;

int feuchteSensor2 = 2;
int feuchteSensor2_val;

//Lcd initialisieren / Pins festlegen//
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


//Pins festlegen - Lcd-begin//

void setup() {
  
  pinMode (Pumpe, OUTPUT);//Pumpe-Pin
  Serial.begin (9600);//Serial-Begin
  lcd.begin(16, 2);//Lcd-begin

  
}
// Sensoren auslesen//
void loop () {


  feuchteSensor1_val = analogRead(feuchteSensor1); //Feuchtesensor-Wert 1 auslesen
  Serial.print("Lese Feuchtesensor 1 - Daten aus: ");
  Serial.println( feuchteSensor1_val );
  delay(2000);
  lcd.setCursor(0, 0);//Lcd loeschen
  lcd.print("                ");//Lcd loeschen
  lcd.setCursor(0, 1);//Lcd loeschen
  lcd.print("                ");//Lcd loeschen
  delay(100);
  lcd.setCursor(0, 0);//Sensordaten auf Lcd ausgeben
  lcd.print("Messe Erde:");
  lcd.setCursor(0, 1);
  lcd.print("Sensor 1:");
  lcd.setCursor(10, 1);
  lcd.print(feuchteSensor1_val);
  delay(3000);
  
  feuchteSensor2_val = analogRead(feuchteSensor2);//Feuchtesensor-Wert 2 auslesen
  Serial.print("Lese Feuchtesensor 2 -Daten aus: ");
  Serial.println( feuchteSensor2_val );
  delay(2000);
  lcd.setCursor(0, 0);//Lcd loeschen
  lcd.print("                ");//Lcd loeschen
  lcd.setCursor(0, 1);//Lcd loeschen
  lcd.print("                ");//Lcd loeschen
  delay(100);
  lcd.setCursor(0, 0); //Sensordaten auf Lcd ausgeben
  lcd.print("Messe Erde:");
  lcd.setCursor(0, 1);
  lcd.print("Sensor 2: ");
  lcd.setCursor(10, 1);
  lcd.print(feuchteSensor2_val);
  delay(3000);

//Pumpe anhand von Messergebnissen an / oder ausschalten//
  
  if (feuchteSensor1_val < 250 && feuchteSensor2_val < 250) //Wenn Sensor1 & Sensor2 Wert unter 300 - Starte Bewässerung!
  {
    lcd.setCursor(0, 0);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    lcd.setCursor(0, 1);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    delay(100);
    lcd.setCursor(0, 0);//Auf Lcd ausgeben
    lcd.print("Erde zu trocken:");
    lcd.setCursor (0,1);
    lcd.print("Pumpe ist an!");
    Serial.println("Erde zu trocken, starte Giessvorgang!"); 
    digitalWrite (Pumpe, LOW); //Pumpe Starten
    delay(1000);
   }
   
  if (feuchteSensor1_val > 250 && feuchteSensor2_val  > 250) //Wenn Sensor1 und Sensor2 Wert über 300 - Keine Bewässerung!
  {
    lcd.setCursor(0, 0);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    lcd.setCursor(0, 1);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    delay(100);
    lcd.setCursor(0, 0);
    lcd.print("Erde in Ordnung:");
    lcd.setCursor(0, 1);
    lcd.print("Pumpe ist aus!  ");
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!"); //Pumpe abschalten oder abgeschaltet lassen
    digitalWrite (Pumpe, HIGH);
    delay(5000);

  }
   else //alle anderen Werte (z.b ein Sensor unter 300, aber anderer Sensor über 300)
  {
    lcd.setCursor(0, 0);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    lcd.setCursor(0, 1);//Lcd loeschen
    lcd.print("                ");//Lcd loeschen
    lcd.setCursor(0, 0);
    lcd.print("    ");//Lcd loeschen
    lcd.print("Erde in Ordnung:");
    lcd.setCursor(0, 1);
    lcd.print("Pumpe ist aus!  ");
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!"); //Pumpe abschalten oder abgeschaltet lassen
    digitalWrite (Pumpe, HIGH);
    delay(5000);

  }

}

Dann poste mal bitte deinen Schaltplan sowie den Auszug aus dem Sketch, was die Steuerung der Pumpe betrifft. Link zu den verbauten Artikeln (Relais) ist auch nicht verkehrt.

Wie bereits im anderen Thread, solltest du Pin 13 vermeiden, gleiches gilt für die Pins 0 und 1, die bei einer Seriellen Kommuniktation flackern ;)

Es besteht die Möglichkeit, dass die Relais über Low-active angezogen werden. Dann einfach die Pumpe an den Klemmen tauschen. COM bleibt, jedoch einmal zwischen NC und NO tauschen.

Edit:

Mach mal aus

pinMode (Pumpe, OUTPUT);//Pumpe-Pin
pinMode (Pumpe, OUTPUT);//Pumpe-Pin
digitalWrite(Pumpe, HIGH);

Weitere Anmerkungen zum Code. Schau dir blinkwithoutdelay an. So wie die Delays bei dir genutzt werden, ist das ein richtig lahmer Code ;)

Des weiteren sollten Variablenamen von const x und #define am besten nur aus Großbuchstaben bestehen. Dann weiß man, dass es sich um eine konstante handelt, die sich nicht mehr verändert.

Mach mal aus

pinMode (Pumpe, OUTPUT);//Pumpe-Pin
pinMode (Pumpe, OUTPUT);//Pumpe-Pin
digitalWrite(Pumpe, HIGH);

Weitere Anmerkungen zum Code. Schau dir blinkwithoutdelay an. So wie die Delays bei dir genutzt werden, ist das ein richtig lahmer Code ;)

Des weiteren sollten Variablenamen von const x und #define am besten nur aus Großbuchstaben bestehen. Dann weiß man, dass es sich um eine konstante handelt, die sich nicht mehr verändert.

So funktioniert das super mit der Pumpe - vielen Dank!

Ich werde alle deine Anmerkungen zum restlichen Code natürlich noch befolgen / korrigieren. Werde den Sketch dan gerne Posten!

Da ich Infolge der Inbetriebnahme des CC3000-Shields nun recht viele Digitale-Pins verloren habe, kommt bei mir jetzt die Frage auf, ob ich das LCD-Display auch so anschliessen kann:

//LiquidCrystal lcd(RS, E, D4, D5, D6, D7); LiquidCrystal lcd(7, 9, 6, 4, 1, 2)

Oder ist das Unmöglich ?

Ich bekomme jetzt (gleicher Sketch wie vorhin nur Pinbelegung bei Lcd geändert) nur 4 zusammenhangslose Zeichen dargestellt. Wenn ich den Kontrast per Potentiometer verstelle, erkenne ich, dass ebenfalls nur eine Zeile des Lcd ausgegeben wird (obere Zeile / weisse Quadrate - unten leer).

Vielen Dank nochmals!

Grüsse, Luke

theluke: //LiquidCrystal lcd(RS, E, D4, D5, D6, D7); LiquidCrystal lcd(7, 9, 6, 4, 1, 2)

Oder ist das Unmöglich ?

Hallo Luke, LCD an UNO mit LiquidCrystal.h und LiquidCrystal lcd(7, 9, 6, 4, 1, 2); funktioniert.

Fehlersuche:

  • CC3000-Shield entfernen und Test-Programm nur mit LiquidCrystal.h versuchen. OK -> Verkabelung ok.
  • CC3000-Shield montieren, dasselbe Test-Programm versuchen. OK -> Hardware LCD und CC3000-Shield ohne Konflikte.
  • Test-Programm mit CC3000-Shield Programmbibliothek.

Wenn der letzte Test fehlschlägt, spekuliert der Anfänger auf Inkompatibilität der Programmbibliotheken. Beliebt ist die parallele Nutzung von Timern. Da sind dann die Experten gefragt.

Wenn das nicht lösbar ist, eine Anregung, was ich mache: UNO (A4 - SDA; A5 - SCL) -> I2C -> ATtiny4313 -> LCD LiquidCrystal.h wird im '4313 verwendet, allerdings muss I2C mit CC3000-Shield-Bibliothek harmonieren. Oder statt I2C serielle Übertragung nutzen. Viel Erfolg!

Es gibt auch fertige I2C Adapterplatinen die man auf ein Display löten kann

Serenifly: Es gibt auch fertige I2C Adapterplatinen die man auf ein Display löten kann

Stimmt und wäre zur Reduzierung der Anschlüsse auch eine gute Wahl. Wenn aber meine [u]Spekulation[/u] zutrifft, die Programmbibliotheken von CC3000-Shield und LCD harmonieren nicht, verlagert mein Vorschlag die LCD-Bibliothek in den ATtiny4313. Denn die Bibliotheken für ATtiny4313 und TinyWireS für I2C harmonieren nach meiner Beobachtung.

Ich hab keine Ahnung von dem CC3000, da ich keinen besitze. Gerade mit der Webapplikation könntest du in Probleme mit dem Uno geraten. 8Bit AVR können zwar Daten im Netzwerk zur Verfügung stellen, aber der Speicher und der Takt sind begrenzt. Soll heißen, wenn du auch noch das Frontend auf dem Uno bereitstellst, wird es knapp. Alternativen wäre der Einstieg in die Programmierung von iApfel oder Android. Das ganze dann über Bluetooth realisieren, insofern die Reichweite ausreicht.

Auf Touchdruck oder alle x-minuten einmal alle Daten anfordern. Die Verarbeitungen etc sollte dann auf dem PC oder Smartphone stattfinden,.

Wenn man dem Threadersteller noch besser helfen möchte, brauchen wir einen kompletten Lageplan deines Arduinos, was daran wo und wie angeschlossen ist. Da lässt sich einiges machen. ua Shiftregister oder Port Expander.

agmue: Hallo Luke, LCD an UNO mit LiquidCrystal.h und LiquidCrystal lcd(7, 9, 6, 4, 1, 2); funktioniert.

Fehlersuche:

  • CC3000-Shield entfernen und Test-Programm nur mit LiquidCrystal.h versuchen. OK -> Verkabelung ok.
  • CC3000-Shield montieren, dasselbe Test-Programm versuchen. OK -> Hardware LCD und CC3000-Shield ohne Konflikte.
  • Test-Programm mit CC3000-Shield Programmbibliothek.

Danke !! Das Lcd und der CC3000 harmonieren nun wie ein altes Ehepaar :-) Hatte wohl irgendwo einen Bock in der Verkabelung - ich werde mir deinen Weg, Fehler zu analysieren / auf den Grund zu gehen, sicherlich merken!

sschultewolter: Gerade mit der Webapplikation könntest du in Probleme mit dem Uno geraten. 8Bit AVR können zwar Daten im Netzwerk zur Verfügung stellen, aber der Speicher und der Takt sind begrenzt. Soll heißen, wenn du auch noch das Frontend auf dem Uno bereitstellst, wird es knapp.

Vielen Dank für deinen Input! Ich bin mir jetzt gerade ein bisschen unsicher, was du genau mit "Frontend auf dem Uno" meinst. Ich dachte an einen "einfachen" Weg wie zum Beispiel:

Uno sendet Sensordaten an Server (Eventuell auch Dienstleister wie z.b. carriots.com oder xively.com), von da hol ichs mir dann per Api auf meine Applikation. Sollte doch ein gehbarer Weg sein, oder siehst du da schwierigkeiten ?

sschultewolter: Wenn man dem Threadersteller noch besser helfen möchte, brauchen wir einen kompletten Lageplan deines Arduinos, was daran wo und wie angeschlossen ist. Da lässt sich einiges machen. ua Shiftregister oder Port Expander.

Ich werde mich zu gegebener Zeit daran machen, das Ganze ein bisschen verständlicher aufzuzeigen. Ich habe jetzt, dank Euch allen, ziemlich viele Sachen aufzuarbeiten. Sobald ich an einem Punkt bin, an dem ich alle Eure Inputs/Ratschläge implementiert/bearbeitet habe, werde ich mich sehr gerne wieder melden.

Hab mich wohl doch ein bisschen zu früh gefreut betreffend Lcd. Komischerweise funktioniert das Lcd bestens, solange sich die Anweisungen im “void setup()” - Bereich befinden. Schriebe ich aber eine Lcd-Anweisung in den “void loop()” - Bereich, gibt das Display nur nichtssagende Zeichen oder gar nichts aus.

Ebenfalls gibt das Display nichts mehr aus wenn z.b. im “void setup()” etwas vor lcd.begin() steht.

Habe ich einen Fehler im Sketch, oder muss das (wieder) an der Verkabelung liegen ?
Habe die betreffenden Stellen durch Kommentare gekennzeichnet.

/*Werte vom Bodenfeuchtigkeitssensor:
0~300    Zu trockene Erde, giessen.
300~700  Erde in Ordnung, nicht giessen.
700~950  Erde nass.*/

//Inkludiere Lcd-Library:
#include <LiquidCrystal.h>
//Inkludiere DHT-Sensor-Library:
#include <DHT.h>

//Temparatur & Feuchtigkeitssensor Pin sowie Sensortyp definieren
#define DHTPIN A5
#define DHTTYPE DHT22
//Pin für normalen Arduino (Uno) definieren
DHT dht(DHTPIN, DHTTYPE);

//Pumpe-Relais definieren (Digital-Pin 8)//
#define PUMPE 8

//Feuchtesensoren definieren//
int feuchteSensor1 = 1;
int feuchteSensor1_val;

int feuchteSensor2 = 2;
int feuchteSensor2_val;

//Lcd Initialisieren
LiquidCrystal lcd(7, 9, 6, 4, 1, 2);

//Setup
void setup() { 
  /*Steht hier z.b. pinMode blabla vordran, funktioniert das Lcd nicht*/
  lcd.begin(16, 2);//Lcd - Zeichen und Reihen
  lcd.setCursor(0, 0);
  lcd.print("Willkommen");//Testausgabe auf Lcd
  pinMode (PUMPE, OUTPUT);//PUMPE-Pin
  digitalWrite(PUMPE, HIGH);//Anfangszustand der PUMPE
  Serial.begin (9600);//Serial-Begin
  dht.begin();
}

void loop() {
  
  /*Das hier geht nicht im loop:
  lcd.print("Testblabla");*/
  
  // Temperatur und Luftfeuchtigkeit messen
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  Serial.print("Luftfeuchtigkeit: "); 
  Serial.println(h);
  delay(2000);
  Serial.print("Temperatur: "); 
  Serial.println(t);
  delay(2000);
  
  //Erdmessung starten
  feuchteSensor1_val = analogRead(feuchteSensor1); //Feuchtesensor-Wert 1 auslesen
  Serial.print("Lese Feuchtesensor 1 - Daten aus: ");
  Serial.println(feuchteSensor1_val);
  delay(3000);
  feuchteSensor2_val = analogRead(feuchteSensor2);//Feuchtesensor-Wert 2 auslesen
  Serial.print("Lese Feuchtesensor 2 -Daten aus: ");
  Serial.println(feuchteSensor2_val);
  delay(3000);

//PUMPE anhand von Messergebnissen an / oder ausschalten//
  
  if (feuchteSensor1_val < 350 && feuchteSensor2_val < 350)//Wenn Sensor1 & Sensor2 Wert unter 350 - Starte Bewässerung!
  {
    Serial.println("Erde zu trocken, starte Giessvorgang!"); 
    digitalWrite (PUMPE, LOW); //PUMPE Starten
   }
   
  else if (feuchteSensor1_val > 350 && feuchteSensor2_val  > 350)//Wenn Sensor1 und Sensor2 Wert über 350 - Keine Bewässerung!
  {
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!");//PUMPE abschalten oder abgeschaltet lassen
    digitalWrite (PUMPE, HIGH);
    delay(5000);
  }
   else//alle anderen Werte (z.b ein Sensor unter 350, aber anderer Sensor über 350)
  {
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!");//PUMPE abschalten oder abgeschaltet lassen
    digitalWrite (PUMPE, HIGH);
    delay(5000);
  }

}

P.s: Ich möchte gerne alles zuerst zum “laufen” bringen, bevor ich mich an das “verschönern” des Sketches und an das ganze Webgedöns mache…

Hallo zusammen

Da Ihr mir bei diesem Projekt bis jetzt sehr geholfen habt, möchte ich Euch (auch wenns wahrscheinlich niemanden Interessiert;-)) den jetzigen Stand des Projektes aufzeigen.

Das System (Ich habs jetzt mal auf "Plantino" getauft) funktioniert schon recht gut. Ich sende die Daten via cc3000-Wifi-Modul an den IoT-Service www.carriots.com. Von da hole ich mir die Daten via Api (Php-cURL / Visualisations-Graphs mit Graph.js/JSON Daten) auf die Website. Ebenfalls habe ich mir aus der Website eine kleine Android - Webapp gebastelt, so bin ich quasi immer "Live" in meinem Garten, auch wenn ich am anderen Ende der Welt bin ;-)

Ich geb euch hier einfach mal den Link, falls es sich jemand anschauen möchte (Die Daten sind von dem momentanen Testaufbau in meinem Wohnzimmer/Wohnzimmerpflanze).

Testserver: www.pilot.esy.es/plantino

Das Problem in meinem letzten Post (LCD) besteht übrigens immer noch - nur falls sich das noch jemand anschauen möchte.

Vielen Dank!

Hallo, lese ich da einen bitteren Unterton? Ich verfolge das Forum seit ungefähr einem halben Jahr und erlebe eine ungeheure Kreativität. Genau diese ist aber auch problematisch, da Hilfe zu verschiedenster Hardware nachgefragt wird, manchmal recht ungeduldig. Ein Forum ist eine Gemeinschaft, die ihr Wissen teilt. Man kann aber nur teilen, was man hat. Beispielsweise habe ich mein Display so angeschlossen wie Deins, um eine Aussage "funktioniert" machen zu können. Die andere Hardware habe ich nicht, also kann ich auch nichts dazu sagen. Solltest Du auf meinen Vorschlag, den ATtiny 4313 zu nutzen, zurückkommem wollen, würde ich mein Wissen mit Dir teilen können.

"Erde ist OK!" und die Temperatur ist von 21,8° auf 21,9° C gestiegen. Danke für die Rückmeldung, möge es Deinen Pflanzen immer gut gehen!

PS.: Die brauchen auch mal Dünger ...