Bewässerungsanlage mit Arduino und Raspi

Hi,
wir haben über 180 Walnuss bäume in 70 Hektar Land und ich möchte ein Bewässerungsanlage bauen.
Auf Raspi soll ein zentral Logik Server und Datenbank laufen und mit ein paar wemos d1 mini mit Feuchtigkeitssensor Daten auf einer Datenbank senden und UNO schaltet halt die Ventile je nach Bedarf.
Ich möchte von raspi aus ein Befehl an UNO senden, der wiederum die pumpe und jeweiligen Ventil schaltet.
Die Kommunikation möchte ich auf LAN und WLAN laufenlassen aber wie.
Sensor Daten über MQTT(wemos) aber die befehle (uno)???
Danke!

Gelb = Lan

tuy007sal:
Die Kommunikation möchte ich auf LAN und WLAN laufenlassen aber wie.

In der IDE gibt es die Ethernet-Lib. Da sind Beispiele zu.
Aber: Ich empfehle nimm ein anderes Shield.
Das ENJ-Shield hat (fast) keine eigene Logik und der Arduino muss alles selbst machen...
Besorge Dir entweder das Ethernetshield W5100 als Aufsteckbares Modul (da ist ein SD-Karten-Slot mit bei) oder ein W5500 als Einzelmodul.

Wenn Du auf dem Raspi eine mySQL laufen hast, kannst Du das entweder mittels Webserver und php auf dem Raspi machen oder Du benutzt den MySQL-Connector. GitHub - ChuckBell/MySQL_Connector_Arduino: Database connector library for using MySQL with your Arduino projects.
Ich persönlich ziehe den vor, brauch ich nur einen Code pflegen und benötige keinen Webserver :wink:

Bei den Relaisboards bitte unbedingt beachten, das die vielen Dinger die es gibt zu 99% nicht für 220V geeignet sind - obwohl es in der Verkaufsanzeige steht...

Hallo,

ich würde den UNO und das Ethernet weglassen und auch durch einen ESP ersetzen. Vorteil sehe darin gleiche Technik und ein eventuell lokales Display geht auch. das Display kann man natürlich auch durch einen Webserver ersetzen. z.B manuelle Steuerung zum Testen.

Wenn Du ebenso viele Ventile Hast wie Messstellen , oder sich das in Gruppen zusammenfassen lässt, könnte ich mit auch vorstellen das die D1 auch selbsttändig das Ventil lokal schalten halt nur Meldung machen. Die bekommen einen Sollwert zur erforderlichen Feuchte für Ihr Gebiet und sind dann unabhängig. Läuft dann eigentlich auch ohne Wlan. Allerdings die Stromversorgung der Dinger könnte der Knackpunkt bei dem Konzept werden. Solar/Akubetrieb .

Heinz

Alle 60 Meter steht ein Baum? (180 Bäume auf 70 Hektar).
Wieviele Meßstellen und Ventile hast Du denn?
Grüße Uwe

uwefed:
Alle 60 Meter steht ein Baum? (180 Bäume auf 70 Hektar).
Wieviele Meßstellen und Ventile hast Du denn?
Grüße Uwe

Wir haben insgesamt nur für Walnüsse 3 abschnitte je abschnitt, gibt es 4–5 reihen.
2-3 abschnitte haben wir noch für Rasen und Beete. Insgesamt werde ich 6 Ventile (abschnitte) haben.
Für jeden reihen möchte ich 3 Feuchtigkeitssensor am Anfang, Mitte und ende das jeweiligen reihe.
So möchte ich mit Laravel ein Interface codieren, wo Sensor Daten und Meldung angezeigt wird. Neben Feuchtigkeitssensor wird noch Wasser druck geben, weil die Gegebenheiten immer wider die Tropfschläuche aus der Halterung reist. Weil die Tropfschläuche ein widerstand, haben kann man ja logisch wissen ist er noch dran oder nicht , so kann ich eine Meldung per Mail schicken. Wetter Station und Sensor Technik sollen auf mehrere wemos laufen. Arduino soll als nur Ventil Steuerung dienen. Raspi ist halt die Logik da hinter. In c++ oder Python möchte ich es steuern. Sensor Kommunikation würde über MQTT laufen. Auf UNO gibt es ein enc28j60 Board aber die Kommunikation zwischen raspi uno (Ventil Steuerung) weiß ich nicht wie ich es am besten Löse.
Danke Uwe!

Lass die Finger von enc28j60. Der hat quasi keine Intelligenz und alles muss vom Prozessor erledigt werden. Nimm lieber WS5100.

Gruß Tommy

Tommy56:
Lass die Finger von enc28j60. Der hat quasi keine Intelligenz und alles muss vom Prozessor erledigt werden. Nimm lieber WS5100.

Gruß Tommy

Hi Tommy,
wie du es gesagt hast, ist WS5100 besser aber wie kann ich von raspi aus an und aus befehle schicken.
Welche da von wehr einfacher http tcpip usw. .

tuy007sal:
ist WS5100 besser aber wie kann ich von raspi aus an und aus befehle schicken.

Der W5500 ist besser...

Der Raspi kann eine Website auf dem Arduino aufrufen
http://192.168.0.1/an
http://192.168.0.1/aus
Das geht auch mit ganz vuielen An aus.
Du kannst auch in der MySQL-DB ein Objekt für alle Pumpen anlegen und dort reinschreiben welche an und welche aus gehen soll.
Ich würde das erstmal autark auf dem Arduino ganz normal ohne jegliche Möglichkeit von aussen bauen. Damit hast Du eione Grundlage und ein Notfallprogramm, wenn das Netz weg ist etc.

Erst dann kannst Du Dir Gedanken machen, ob Du Schaltbefehle pollen willst oder ob Du darauf wartest, das wer sich meldet.
Und dann erst geht es daran das abzubilden.

my_xy_projekt:
Der W5500 ist besser...

Der Raspi kann eine Website auf dem Arduino aufrufen
http://192.168.0.1/an
http://192.168.0.1/aus
Das geht auch mit ganz vuielen An aus.
Du kannst auch in der MySQL-DB ein Objekt für alle Pumpen anlegen und dort reinschreiben welche an und welche aus gehen soll.
Ich würde das erstmal autark auf dem Arduino ganz normal ohne jegliche Möglichkeit von aussen bauen. Damit hast Du eione Grundlage und ein Notfallprogramm, wenn das Netz weg ist etc.

Erst dann kannst Du Dir Gedanken machen, ob Du Schaltbefehle pollen willst oder ob Du darauf wartest, das wer sich meldet.
Und dann erst geht es daran das abzubilden.

das habe ich schon auf uno laufen. Könnte man von Arduino aus Daten abfrage auf Mysql machen. Wen ja dann kann ich ja durch die Software was ich auf raspi läuft werte von Mysql ändern (0 an 1 aus).

#include <UIPEthernet.h> // Used for Ethernet

#define PIN_LED 2
#define PIN_RELAY_0 A5
#define PIN_RELAY_1 A4

// **** ETHERNET SETTING ****

// Ethernet MAC address - must be unique on your network
byte mac[] = { 0x41, 0x44, 0x41, 0x43, 0x48, 0x41 };

//Ethernet interface IP address (unique in your network)
IPAddress ip(192, 168, 0, 101);

//Ethernet interface IP port (80 = http)
EthernetServer server(80);

EthernetClient client;
String str = "";

void setup() {
Serial.begin(115200);
Serial.print("START");
pinMode(PIN_RELAY_0, OUTPUT);
pinMode(PIN_RELAY_1, OUTPUT);
SW(0, LOW); SW(1, LOW);

// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("IP Address: ");
Serial.println(Ethernet.localIP());
Serial.println();
}

void loop() {
client = server.available();
if( client ){
Serial.println("BEGIN-------------->\n");
boolean currentLineIsBlank = true;
String line = "";
bool firstLine = true;
while (client.connected()){
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    if (c == '\n' && currentLineIsBlank) {
      String html = "{";
      for (int i=0; i<2; i++){
        if ( SW_state(i) ){
          html += "\"sw_"+String(i)+"\":1 ";
        } else {
          html += "\"sw_"+String(i)+"\":0 ";
        }
        if( i<1 ) html += ",";
      }
      html += "}";
      client.println(html);
      break;
    }
    if (c == '\n') {
      currentLineIsBlank = true;
      if( firstLine ) {
        firstLine = false;
        Serial.println("-------------------------------" + line);
        if( line.indexOf( "sw_on=0" ) >= 0 ){
          SW(0, HIGH);
        } else if( line.indexOf( "sw_on=1" ) >= 0 ){
          SW(1, HIGH);
        } else if( line.indexOf( "sw_off=0" ) >= 0 ) {
          SW(0, LOW);
        } else if( line.indexOf( "sw_off=1" ) >= 0 ){
          SW(1, LOW);
        }
      }
    } else if (c != '\r') {
      currentLineIsBlank = false;
      if( firstLine ) {
        line = line + c;
      }
    }
  }   
}
delay(10);
client.stop();
Serial.println("END-------------->\n"); 
}
}

bool SW_state(byte num){
bool val;
switch(num){
case 0: val = digitalRead(PIN_RELAY_0);
break;
case 1: val = digitalRead(PIN_RELAY_1);
break;
}
return !val;
}

void SW(byte num, bool val){
val = !val;
switch(num){
case 0: digitalWrite(PIN_RELAY_0, val);
break;
case 1: digitalWrite(PIN_RELAY_1, val);
break;
}
}

tuy007sal:
das habe ich schon auf uno laufen. Könnte man von Arduino aus Daten abfrage auf Mysql machen. Wen ja dann kann ich ja durch die Software was ich auf raspi läuft werte von Mysql ändern (0 an 1 aus).

Ach schick...
Hat sich ja schon wer Gedanken gemacht :wink:

Also wenn Du das mit der Website auf dem UNO hinbekommen hast, dann geht auch die MySQL_Abfrage.
Erst 'ne Tabelle anlegen, die stur nur die Pumpe und den Zustand (an/aus) abgibt.
Dann erstmal nur ein SELECT gebaut, das Du den Wert für die Pumpe aus der Db zurückbekommst.
Den Rest dann darauf aufbauend - entweder nur mit Kalender oder parallell mit Zustandsabfrage der Sensorik.

my_xy_projekt:
Ach schick...
Hat sich ja schon wer Gedanken gemacht :wink:

Also wenn Du das mit der Website auf dem UNO hinbekommen hast, dann geht auch die MySQL_Abfrage.
Erst 'ne Tabelle anlegen, die stur nur die Pumpe und den Zustand (an/aus) abgibt.
Dann erstmal nur ein SELECT gebaut, das Du den Wert für die Pumpe aus der Db zurückbekommst.
Den Rest dann darauf aufbauend - entweder nur mit Kalender oder parallell mit Zustandsabfrage der Sensorik.

Vielen Dank für deine Hilfe tut mir leid, wenn ich mich bisschen blöd angestellt habe. So ist es viel sinnvoller. Würde das für den ersten Test mit enc laufen?

tuy007sal:
Vielen Dank für deine Hilfe tut mir leid, wenn ich mich bisschen blöd angestellt habe. So ist es viel sinnvoller. Würde das für den ersten Test mit enc laufen?

Nicht Leid! Und nein - alles gut! Du hast Dir schon was bei gedacht - das passt...
Also mit enc UND MySQL-Connector auf'm Uno könnte eng werden.
Zum testen vielleicht noch - Achte auf die Ausgaben, wenn der Speicher zu klein wird...
In jedem Fall besorge Dir ein besseres Netzwerk-Modul.... in ausreichender Menge (also mehr als eines) :wink:

my_xy_projekt:
In jedem Fall besorge Dir ein besseres Netzwerk-Modul.... in ausreichender Menge (also mehr als eines) ;

Wer w5100 richtige Wahl dafür.

Man möge mich korrigieren, wenn ich falsch liege. Für meine Erkenntnis ist W5100 das bessere Client-Modul mit max. gleichzeitigen 4 Connections, das W5500 eher das Servermodul mit 8 gleichzeitigen Connections und höherem Speicherverbrauch.

Gruß Tommy

Ich gebe auf. >:(
Weiß nicht, ob es an enc oder uno liegt aber speicher, ist voll.
Sollte ich es lieber auf w5100 oder wemos?
Ich hab 2 Library aus probiert:
MySQL-Connector
MySQL-MariaDB-Generic

mit MySQL-Connector hatte ich kein Problem beim Hochladen.
Aber ich bekomme immer Connection failed Meldung. Mysql läuft wegen Test Zwecken auf mein PC (xampp).

#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <SPI.h>
#include "DHT.h"
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server_addr(192,168,x,xxxx);  //IP of the MySQL *server* here
char user[] = "root";              // MySQL user login username
char password[] = "pwdpwd";        // MySQL user login password

EthernetClient client;
MySQL_Connection conn((Client *)&client);

void setup() {
  Serial.begin(115200);
  while (!Serial); // wait for serial port to connect
  Ethernet.begin(mac_addr);
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
    // You would add your code here to run a query once on startup.
  }
  else
    Serial.println("Connection failed.");
  conn.close();
}

void loop() {
}

Mit MySQL-MariaDB-Generic reicht der speicher nicht.

#include "defines.h"
#include <MySQL_Generic_Ethernet.h>

// Select the static Local IP address according to your local network
IPAddress ip(192, 168, x, xxx);

IPAddress server_addr(192,168,x,xxx);
uint16_t server_port = 3306;    //3306;

char user[]     = "root";              // MySQL user login username
char password[] = "pwdpwd";          // MySQL user login password

MySQL_Connection conn((Client *)&client);

void setup()
{
  Serial.begin(115200);
  while (!Serial);

  Serial.println("\nStarting Connect on " + String(BOARD_NAME) + ", with " + String(SHIELD_TYPE));

  MYSQL_LOGERROR(F("========================================="));
  MYSQL_LOGERROR(F("Default SPI pinout:"));
  MYSQL_LOGERROR1(F("MOSI:"), MOSI);
  MYSQL_LOGERROR1(F("MISO:"), MISO);
  MYSQL_LOGERROR1(F("SCK:"),  SCK);
  MYSQL_LOGERROR1(F("SS:"),   SS);
  MYSQL_LOGERROR(F("========================================="));

#if defined(ESP8266)
  // For ESP8266, change for other boards if necessary
  #ifndef USE_THIS_SS_PIN
    #define USE_THIS_SS_PIN   D2    // For ESP8266
  #endif
  
    MYSQL_LOGERROR1(F("ESP8266 setCsPin:"), USE_THIS_SS_PIN);
  
  #if ( USE_ETHERNET || USE_ETHERNET_LARGE || USE_ETHERNET2 || USE_ETHERNET_ENC )
    // For ESP8266
    // Pin                D0(GPIO16)    D1(GPIO5)    D2(GPIO4)    D3(GPIO0)    D4(GPIO2)    D8
    // Ethernet           0                 X            X            X            X        0
    // Ethernet2          X                 X            X            X            X        0
    // Ethernet3          X                 X            X            X            X        0
    // EthernetLarge      X                 X            X            X            X        0
    // Ethernet_ESP8266   0                 0            0            0            0        0
    // D2 is safe to used for Ethernet, Ethernet2, Ethernet3, EthernetLarge libs
    // Must use library patch for Ethernet, EthernetLarge libraries
    Ethernet.init (USE_THIS_SS_PIN);
  
  #elif USE_ETHERNET3
    // Use  MAX_SOCK_NUM = 4 for 4K, 2 for 8K, 1 for 16K RX/TX buffer
    #ifndef ETHERNET3_MAX_SOCK_NUM
      #define ETHERNET3_MAX_SOCK_NUM      4
    #endif
  
    Ethernet.setCsPin (USE_THIS_SS_PIN);
    Ethernet.init (ETHERNET3_MAX_SOCK_NUM);
  
  #endif  //( USE_ETHERNET || USE_ETHERNET2 || USE_ETHERNET_LARGE || USE_ETHERNET_ENC )

#elif defined(ESP32)

  // You can use Ethernet.init(pin) to configure the CS pin
  //Ethernet.init(10);  // Most Arduino shields
  //Ethernet.init(5);   // MKR ETH shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet

  #ifndef USE_THIS_SS_PIN
    #define USE_THIS_SS_PIN   22    // For ESP32
  #endif

  MYSQL_LOGERROR1(F("ESP32 setCsPin:"), USE_THIS_SS_PIN);

  // For other boards, to change if necessary
  #if ( USE_ETHERNET || USE_ETHERNET_LARGE || USE_ETHERNET2 || USE_ETHERNET_ENC )
    // Must use library patch for Ethernet, EthernetLarge libraries
    // ESP32 => GPIO2,4,5,13,15,21,22 OK with Ethernet, Ethernet2, EthernetLarge
    // ESP32 => GPIO2,4,5,15,21,22 OK with Ethernet3
  
    //Ethernet.setCsPin (USE_THIS_SS_PIN);
    Ethernet.init (USE_THIS_SS_PIN);

  #elif USE_ETHERNET3
    // Use  MAX_SOCK_NUM = 4 for 4K, 2 for 8K, 1 for 16K RX/TX buffer
    #ifndef ETHERNET3_MAX_SOCK_NUM
      #define ETHERNET3_MAX_SOCK_NUM      4
    #endif
  
    Ethernet.setCsPin (USE_THIS_SS_PIN);
    Ethernet.init (ETHERNET3_MAX_SOCK_NUM);

  #endif  //( USE_ETHERNET || USE_ETHERNET2 || USE_ETHERNET_LARGE  || USE_ETHERNET_ENC )

#else   //defined(ESP8266)
  // unknown board, do nothing, use default SS = 10
  #ifndef USE_THIS_SS_PIN
    #define USE_THIS_SS_PIN   10    // For other boards
  #endif

  MYSQL_LOGERROR3(F("Board :"), BOARD_NAME, F(", setCsPin:"), USE_THIS_SS_PIN);

  // For other boards, to change if necessary
  #if ( USE_ETHERNET || USE_ETHERNET_LARGE || USE_ETHERNET2 || USE_ETHERNET_ENC )
    // Must use library patch for Ethernet, Ethernet2, EthernetLarge libraries
  
    Ethernet.init (USE_THIS_SS_PIN);

  #elif USE_ETHERNET3
    // Use  MAX_SOCK_NUM = 4 for 4K, 2 for 8K, 1 for 16K RX/TX buffer
    #ifndef ETHERNET3_MAX_SOCK_NUM
      #define ETHERNET3_MAX_SOCK_NUM      4
    #endif
  
    Ethernet.setCsPin (USE_THIS_SS_PIN);
    Ethernet.init (ETHERNET3_MAX_SOCK_NUM);
  
  #endif  //( USE_ETHERNET || USE_ETHERNET2 || USE_ETHERNET_LARGE || USE_ETHERNET_ENC )

#endif    //defined(ESP8266)

  // start the ethernet connection and the server:
  // Use DHCP dynamic IP and random mac
  uint16_t index = millis() % NUMBER_OF_MAC;
  // Use Static IP
  //Ethernet.begin(mac[index], ip);
  Ethernet.begin(mac[index]);

  // Just info to know how to connect correctly
  MYSQL_LOGERROR(F("========================================="));
  MYSQL_LOGERROR(F("Currently Used SPI pinout:"));
  MYSQL_LOGERROR1(F("MOSI:"), MOSI);
  MYSQL_LOGERROR1(F("MISO:"), MISO);
  MYSQL_LOGERROR1(F("SCK:"),  SCK);
  MYSQL_LOGERROR1(F("SS:"),   SS);
  MYSQL_LOGERROR(F("========================================="));

  Serial.print("Using mac index = ");
  Serial.println(index);

  Serial.print("Connected! IP address: ");
  Serial.println(Ethernet.localIP());

  Serial.print("Connecting to SQL Server @ ");
  Serial.print(server_addr);
  Serial.println(String(", Port = ") + server_port);
  Serial.println(String("User = ") + user + String(", PW = ") + password);
}

void loop()
{
  Serial.println("Connecting...");
  
  //if (conn.connect(server_addr, server_port, user, password))
  if (conn.connectNonBlocking(server_addr, server_port, user, password) != RESULT_FAIL)
  {
    Serial.println("Closing connection...");
    conn.close();                     // close the connection
  } 
  else 
  {
    Serial.println("\nConnect failed. Trying again on next iteration.");
  }

  Serial.println("\nSleeping...");
  Serial.println("================================================");
 
  delay(60000);
}

tuy007sal:
Ich gebe auf. >:(

NEIN!

Ich schau mal drauf...

my_xy_projekt:
NEIN!

Ich schau mal drauf...

Mit aufgeben meinte ich mit enc

Danke :wink:

my_xy_projekt:
Ich schau mal drauf...

Soo..
Also hier müssen richtige echte Daten rein:

IPAddress server_addr(192,168,x,xxxx);  //IP of the MySQL *server* here
char user[] = "root";              // MySQL user login username
char password[] = "pwdpwd";        // MySQL user login password

Nein, ich will sie nicht wissen und bitte auch nicht hier posten... Nur zukünftig im Kommentar vermerken, das da vollständige und richtige Daten drin sind.

Dann fällt mir auf, das Du zwar ein

  Ethernet.begin(mac_addr);

drin hast, Dir aber nicht ausgeben lässt, ob Du eine IP-Adresse etc. bekommen hast.
Das gehört zurAnalyse zwingend dazu.

Wenn das funktioniert, dann musst Du sicherstellen, das die ip-Adresse des Arduino auch Rechte auf dem MySQL-Server hat. wenigstens erstmal lesen...

my_xy_projekt:
Soo..
Also hier müssen richtige echte Daten rein:

IPAddress server_addr(192,168,x,xxxx);  //IP of the MySQL *server* here

char user[] = "root";              // MySQL user login username
char password[] = "pwdpwd";        // MySQL user login password



Nein, ich will sie nicht wissen und bitte auch nicht hier posten... Nur zukünftig im Kommentar vermerken, das da vollständige und richtige Daten drin sind.

Dann fällt mir auf, das Du zwar ein 


Ethernet.begin(mac_addr);



drin hast, Dir aber nicht ausgeben lässt, ob Du eine IP-Adresse etc. bekommen hast.
Das gehört zurAnalyse zwingend dazu.

Wenn das funktioniert, dann musst Du sicherstellen, das die ip-Adresse des Arduino auch Rechte auf dem MySQL-Server hat. wenigstens erstmal lesen...

die Daten habe ich einfach so geschrieben weil ich un gern meine Daten geben möchte.
Die Sache mit der rechte. Ich probiere es direkt auf raspi hoffe das dort besser funktioniert, weil ich mit einem paar Web Anwendungen sowieso darauf zugreifen.
und nochmals danke für alles :slight_smile:

my_xy_projekt:
Dann fällt mir auf, das Du zwar ein

  Ethernet.begin(mac_addr);

drin hast, Dir aber nicht ausgeben lässt, ob Du eine IP-Adresse etc. bekommen hast.
Das gehört zurAnalyse zwingend dazu.

Also ich habe es nicht gemerkt ich dachte, wenn es Beispiel code ist er Fehler los. war in Library dabei