Go Down

Topic: Schwierigkeiten mit Ethernet Shield (Read 387 times) previous topic - next topic

Straggle00

Hallo zusammen.
Habe bei der Programmierung etwas Schwierigkeiten mit dem Ethernet Shield.

Zur Hardware:
Arduino Mega 2560
Ethernet Shield mit microSD Karte
DHT22 Sensor

Zur gedachten Funktion:
Die Sensordaten sollen alle Zeit X abgefragt werden.
Über den Installierten WebServer sollen die Daten aufgerufen werden.
Über Zeit Y sollen die Sensordaten auf die SDKarte gespeichert werden, damit zu einem späteren Zeitpunkt ein Diagramm im Excel erzeugt werden kann.

Das Problem:
Solange die Daten über den Browser nicht angefragt werden speichert das Shield die Daten auf der SDKarte. Sobald der Browser aufgerufen wird findet deer Arduino die SDKarte nicht mehr. Nur ( Nur durch Kaltstart wieder zu beheben.) Ebenfalls wird beim Aufruf des Webservers im Browser der ganze Bildschirm mit Code vollgeladen.
Wenn ich das Programm in 2 Programme splitte (1. SDKarten aufzeichnung, 2. WebServer) sind diese einzeln ohne Probleme lauffähig.


Meine Frage nun:
Kann das Ethernet Shield nicht die SDKarte und den WebServer bedienen, oder ist mein Programmcode fehlerhaft?

Zu Code:


Code: [Select]

#include <SimpleDHT.h>
#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>

int pinDHT22 = 5;
SimpleDHT22 dht22(pinDHT22);
bool check=false;
bool check2=true;
String temp="";
String humi="";

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10,10,0,4 };
EthernetServer server(80);

void setup() {
  Serial.begin(9600);while (!Serial) {;}
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop() {
   
    Serial.println("Schleife 0");
    delay(2500); 
    byte temperature = 0;
    byte humidity = 0;
    int err = SimpleDHTErrSuccess;
    if ((err = dht22.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess)
    {
      Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(2500);
      return;
    }
    Serial.print("SD init");
    if (!SD.begin(53))
    {
      Serial.println("Karte nicht vorhanden.");
    }
    Serial.println("Karte bereit.");
    String dataString = "";
    String sensor = String(temperature)+";"+String(humidity)+";";
    temp = String(temperature);
    humi = String(humidity);
    dataString += String(sensor);
 if (check2==true) {
  File dataFile = SD.open("datenl.csv", FILE_WRITE);
  check=false;
  if (dataFile)
    {
      dataFile.println(dataString);
      dataFile.close();
      check=true;
      Serial.println(dataString);
       delay(10000);
    }
  else
    {
      Serial.println("Fehler beim Datei öffnen");
    }
 }
   EthernetClient client = server.available();
  if (client){
    check2=false;
    Serial.println("Schleife 1");
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("Connection: close"); 
    client.println("Refresh: 5");
    client.println();
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.print(" Temperatur: ");
    client.print(String(temp));
    client.print(" C");
    client.print(" Feuchte: ");
    client.print(String(humi));
    client.print(" %");
    client.println("</html>");
    delay(2500);
  }
  delay(10);
  client.stop();
  check2=true;
}


Mitschnitt Serieller Monitor:
SD initKarte bereit.
24;56;
Schleife 0
SD initKarte bereit.
24;56;
Schleife 1
Schleife 0
SD initKarte bereit.
24;56;
Schleife 1
Schleife 0
SD initKarte nicht vorhanden.
Karte bereit.
Fehler beim Datei öffnen
Schleife 0
SD initKarte nicht vorhanden.
Karte bereit.
Fehler beim Datei öffnen
Schleife 0
SD initKarte nicht vorhanden.




Bild im Browser:
Temperatur: 24 C Feuchte: 56 %Hä\@ ‚Ίu ADÜZ¯8a|'; El6‡¢:éÙÒ 0pá±³·7ĚĮ¤(H\ + :¢6"X! Pž®Sèõ§6@lbP(‰ 'c×Ö~àð‰kƒjÕf|Vä  zªùË>á Ã- NBŠMBÞý4µLUÐYJ› ¶´¸à®è@_ar~è J ®ƒ¸¶‡-FSÂs&¦vÖ]¹)B4À ž+÷âóÅ®jN÷' ýi¦ÊBµ€‚›ŸÐD¸îÝmíÚs-¼§|/„6þ±^¡à8Øv¢?døZ÷à'F¡8%Ë ú¬¾³-L+Þ[pŽ-Þ§0Æña°Â;q?-î MÍzœ•üðì=×<¬E¨ÀÈty|ƒ% À£íA˜-ÿZÉÐ\t"ŽþDߨÖÂ~a8žTnûëïžeÝÜî7\k³MX(züëáHxÛòd'Ho--L,…KÖ¶Fè¦ 'ˆ½ö-9+m]R8¶¼C…©á‰ÕÂꢥ´ATƒ'É¿(â HZ%KÞÏÜB·F]‰HŠèa󇁴ÇÏ286­âÓðèO»OyAodˆ ¼›0<‚,:ƒW¢¯4nÁqF>"é«--áfè±à.ÃÂ//Õ½ŽÕëhº''Ÿü̺@ôÑ‰®~k):e ÈhHœ-H-t$O‰áhwíáTÖ·,uOƼÑttZD½,·Q&´¤ab±ÝR _A]œpIØU4y˜ÈêÓCuvY~ÁËJ¼þµxÂU> ¨€Lê¼Ä&‹¹\³,ZÌ"&ånëüšóçˆ-t|÷¬U.ZiÖëb°Ï"Lp/3„s©ðÌ¡a¤Pf»Öñ9½*‚G.|Û$ÿQ"§êá'4}ôtYË`†>HÁí`ÿ.™q%ЍØÃÏRnA£Š%œoOuwPý v¢)bŠQªI4j°£Ó¢x¼hüVO©{¾òƒ‰læ¹"dD›g(ýa¤ã eïæÔû»"¨4jÂ-è"Ž".GLU--˜4>»Œ\3…ƐFͬ'±vÅZïO‰(é6èXE&Q6™#©0T©› Éù_„Îè\ˆ\99ÌÅËIü鲌-Ð@L¿l:µP‡ZÕä}­ê¾×VXÖf¢3uö™UqÚ3V=mð2ôÙi£ìI¬ð2¬eCtÆÕ¢¸®e…îçÉ;ÐÔk¸·TUÖÆ Ž&‹€'é9(·R«µã<„6¨©W¡Ü•.ExŒ"Xä>ŠaÔ"ú›ŽÎßñ2õ¯a]dp=çùnZ…‡Ò|H-Õ'ïÏ7ø‡GDKàÆ ³Úê¼=*¢-Ö¬‹þO $|ý¤vZn÷ uĘÆ2'ëß* Wb`Ízn‰-Øùèä0Pƶ'­›ÕýÀ`Q Ê <²(lä2‹&]KAÍ.¯k6éÁÝwrì)í[FlH …âÓŽˆÃï©þ ¼äù­Aiñò‰à'…a=dU¬TpDòpÁã˜Ó&ã¨"â!ÈÖE[ÃâKO`6y?ôÞ®J¥ëÞÊžK£ 'äh¸LGe$æL~ É"°K v©êÄôPÇ«ìJƒ3"ÜÈߣ´9( îö½·9ž„'yOÇ6 ݐ8$91 É";Ÿ€®ãR¬êHTTP/1.1 200 OK Content-Type: text/html Connection: close Refresh: 5 Temperatur: 24 C Feuchte: 56 %Hä\@ ‚Ίu ADÜZ¯8a|'; El6‡¢:éÙÒ 0pá±³·7ĚĮ¤(H\ + :¢6"X! Pž®Sèõ§6@lbP(‰ 'c×Ö~àð‰kƒjÕf|Vä  zªùË>á Ã- NBŠMBÞý4µLUÐYJ› ¶´¸à®è@_ar~è J ®ƒ¸¶‡-FSÂs&¦vÖ]¹)B4À ž+÷âóÅ®jN÷' ýi¦ÊBµ€‚›ŸÐD¸îÝmíÚs-¼§|/„6þ±^¡à8Øv¢?døZ÷à'F¡8%Ë ú¬¾³-L+Þ[pŽ-Þ§0Æña°Â;q?-î MÍzœ•üðì=×<¬E¨ÀÈty|ƒ% À£íA˜-ÿZÉÐ\t"ŽþDߨÖÂ~a8žTnûëïžeÝÜî7\k³MX(züëáHxÛòd'Ho--L,…KÖ¶Fè¦ 'ˆ½ö-9+m]R8¶¼C…©á‰ÕÂꢥ´ATƒ'É¿(â HZ%KÞÏÜB·F]‰HŠèa󇁴ÇÏ286­âÓðèO»OyAodˆ ¼›0<‚,:ƒW¢¯4nÁqF>"é«--áfè±à.ÃÂ//Õ½ŽÕëhº''Ÿü̺@ôÑ‰®~k):e ÈhHœ-H-t$O‰áhwíáTÖ·,uOƼÑttZD½,·Q&´¤ab±ÝR _A]œpIØU4y˜ÈêÓCuvY~ÁËJ¼þµxÂU> ¨€Lê¼Ä&‹¹\³,ZÌ"&ånëüšóçˆ-t|÷¬U.ZiÖëb°Ï"Lp/3„s©ðÌ¡a¤Pf»Öñ9½*‚G.|Û$ÿQ"§êá'4}ôtYË`†>HÁí`ÿ.™q%ЍØÃÏRnA£Š%œoOuwPý v¢)bŠQªI4j°£Ó¢x¼hüVO©{¾òƒ‰læ¹"dD›g(ýa¤ã eïæÔû»"¨4jÂ-è"Ž".GLU--˜4>»Œ\3…ƐFͬ'±vÅZïO‰(é6èXE&Q6™#©0T©› Éù_„Îè\ˆ\99ÌÅËIü鲌-Ð@L¿l:µP‡ZÕä}­ê¾×VXÖf¢3uö™UqÚ3V=mð2ôÙi£ìI¬ð2¬eCtÆÕ¢¸®e…îçÉ;ÐÔk¸·TUÖÆ Ž&‹€'é

Kann mir da jemand sagen was ich falsch mache?
Bin über jede Hilfe dankbar.

HotSystems

Welches Ethernetshield ?
Bitte Hyperlink posten.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Scherheinz

Wundert mich das es überhaupt so funktioniert. Du hast Pausen drin von über 17 Sekunden, wie funktioniert da überhaupt der Browser Zugriff?
Hier könnte ihre Werbung stehen


Tommy56

Das ist kein Ethernet-Schield 2

Ich sehe das Problem aber immer noch in der Konfiguration Deines lokalen Netzes, wozu Du Dich sehr bedeckt hälst.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Scherheinz

Hier könnte ihre Werbung stehen

HotSystems

Mein Tipp:
Teste jedes Modul/Funktion einzeln, um zu erkennen, wo der Fehler entsteht.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Straggle00

Die Programme hatte ich erst einzeln.

DHT22 mit WebServer:

Code: [Select]

#include <SimpleDHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
 
int pinDHT22 = 5;
SimpleDHT22 dht22(pinDHT22);

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10,10,0,4 };
EthernetServer server(80);
 
void setup()
{
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
Ethernet.begin(mac, ip);
server.begin();
}
 
void loop(){
delay(500);
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
  if ((err = dht22.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(2500);
    return;
  }
EthernetClient client = server.available();
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");  
client.println("Refresh: 5");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print(" Temperatur: ");
client.print(float(temperature));
client.print(" C");
client.print(" Feuchte: ");
client.print(float(humidity));
client.print(" %");
client.println("</html>");
}
delay(1);
client.stop();
}


und DHT22 mit SDKarten Aufzeichnung:

Code: [Select]

#include <SimpleDHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
 
int pinDHT22 = 5;
SimpleDHT22 dht22(pinDHT22);

void setup()
{
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  Serial.print("Initializing SD card...");
  
  if (!SD.begin(53)) {
    Serial.println("SD Karte nicht vorhanden");
    while (1);
  }
  Serial.println("SD Karte initialisiert.");

}
 
void loop(){
delay(2500);
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
  if ((err = dht22.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(2500);
    return;
  }
String dataString = "";
for (int werte = 1; werte < 2; werte++) {
    String sensor = String(temperature)+String(humidity);
    dataString += String(sensor);
    if (werte < 1) {
      dataString += ";";
    }
  }
  File dataFile = SD.open("datenl.csv", FILE_WRITE);

  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    Serial.println(dataString);
  }
  else {
    Serial.println("kann Datei nicht öffnen.");
  }
}


Die einzelnen Programme haben auch Funktion.

HotSystems

Dann setze die SD in eine eigene Funktion und rufe diese bei Bedarf aus der Loop auf.
Das wird übersichtlicher und besser zu debuggen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Straggle00

Danke, daran hab ich noch gar nicht gedacht. Werde mich dann mal mit Funktionen Dekalration vertraut machen. ;)

Scherheinz

Und mach mal testweise das "server.begin();" an den Anfang von der Server Funktion....
Hier könnte ihre Werbung stehen

HotSystems

Danke, daran hab ich noch gar nicht gedacht. Werde mich dann mal mit Funktionen Dekalration vertraut machen. ;)
Gerne, ich bin sicher es hilft.
Zumindest sind Fehler besser auffindbar.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Straggle00

So ein letztes mal für heute. Habe das Programm dementsprechend angepasst.

Neuer Code:
Code: [Select]

#include <SimpleDHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <time.h>
 
int pinDHT22 = 5;
SimpleDHT22 dht22(pinDHT22);

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10,10,0,4 };
EthernetServer server(80);

byte temperature = 0;
byte humidity = 0;
String temp="";
String humi="";

  void setup()
    {
      Serial.begin(9600);
      while (!Serial) {;}
      Ethernet.begin(mac, ip);
     
    }
 


  void Sensordaten(String &temp, String &humi)
    {
    delay(500);
    int err = SimpleDHTErrSuccess;
      if ((err = dht22.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess)
      {
        Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(2500);
        return;
      }
      temp = temperature;
      humi = humidity;
    }

  void Speichern(String &temp, String &humi)
    {
      Serial.print("Init SDKarte..");
      if (!SD.begin(53))
        {
          Serial.println("SD Karte nicht vorhanden");
          while (1);
        }
      Serial.println("SD Karte initialisiert.");
      String dataString = "";
      String sensor = String(temp)+";"+String(humi)+";";
      dataString += String(sensor);
      File dataFile = SD.open("datenl.csv", FILE_WRITE);
      if (dataFile)
        {
          dataFile.println(dataString);
          dataFile.close();
          Serial.println(dataString);
        }
      else
        {
          Serial.println("kann Datei nicht öffnen.");
        }
    }

  void Webserver(String &temp, String &humi)
    {
      server.begin();
        EthernetClient client = server.available();
          if (client)
            {
             
                 
                          client.println("HTTP/1.1 200 OK");
                          client.println("Content-Type: text/html");
                          client.println("Connection: close"); 
                          client.println("Refresh: 5");
                          client.println();
                          client.println("<!DOCTYPE HTML>");
                          client.println("<html>");
                          client.print(" Temperatur: ");
                          client.print(String(temp));
                          client.print(" C<br />");
                          client.print(" Feuchte: ");
                          client.print(String(humi));
                          client.print(" %");
                          client.println("</html>");
                          delay(1);
                          client.stop();
              }
        }
 
 
  void loop()
    {
      Sensordaten(temp,humi);
      Serial.println("Sensor: "+String(temp)+String(humi));
      Speichern(temp,humi);
      Serial.println("Speichern: "+String(temp)+String(humi));
      Webserver(temp,humi);
      Serial.println("www: "+String(temp)+String(humi));
      delay(500);
    }


Wenn ich entweder den Funktionsaufruf Speichern, oder Webserver aus dem loop auskommentiere läuft das Programm stabil.
Die SD Karte bleibt jetzt eingehängt durch die deklarierte Methode, nur der Browser zickt noch, da ich manchmal eine korrekte Anzeige, oft die oben bereits geposteten Hyroglyphen und manchmal eine beschnittene Darstellung.

Hat mir jemand noch einen Vorschlag? :smiley-eek: 

Straggle00

Habe das Problem jetzt anders gelöst.
Schicke mir deie Sensordaten alle 30 Sek. via MQTT an meinen Raspi. Da kann ich ja die Daten anderweitig verwursteln.

Fall einer Interesse am Code hat:

Code: [Select]

#include <TroykaDHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

DHT dht(5, DHT22);

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 10, 0, 4);
IPAddress server(10, 10, 0, 5);

String temp = "";
String humi = "";
unsigned long lastSend;

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

EthernetClient ethClient;
PubSubClient client(ethClient);

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("arduinoClient")) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  dht.begin();
  client.setServer(server, 1883);
  client.setCallback(callback);
  delay(1500);
}

void Sensordaten(String &temp, String &humi)
{
  delay(2000);
  dht.read();
  switch (dht.getState()) {
    case DHT_OK:
      Serial.print(dht.getTemperatureC());
      Serial.print(dht.getHumidity());
      break;
    case DHT_ERROR_CHECKSUM:
      Serial.println("Checksum error");
      break;
    case DHT_ERROR_TIMEOUT:
      Serial.println("Time out error");
      break;
    case DHT_ERROR_NO_REPLY:
      Serial.println("Sensor not connected");
      break;
  }
  temp = (dht.getTemperatureC());
  humi = (dht.getHumidity());

  String payload = "{";
  payload += "\"Temperatur\":"; payload += temp; payload += ",";
  payload += "\"Feuchte\":"; payload += humi;
  payload += "}";

  char attributes[100];
  payload.toCharArray( attributes, 100 );
  client.publish( "Mega2560", attributes );
  Serial.println( attributes );
}

void loop()
{
  if ( !client.connected() ) {
    reconnect();
  }
  if ( millis() - lastSend > 30000 ) {
    lastSend = millis();
    Sensordaten(temp, humi);
  }
  Serial.println(" Temp: " + String(temp) + ";" + " Feuchte: " + String(humi) + ";");
  client.loop();
  delay(2500);
}


Trotzdem, Danke an alle für die schnelle Unterstützung.  ;)

Go Up