Probleme bei Upload des Ethernetshild

Hallo,
ich habe mal wieder ein Problem. Ausgegeben wird hier das Messergebnis eines Ultraschallsensor.
Und zwar wird nach der Initialisierung des Ethernets auch das Messergebnis ausgegeben aber nicht weiter zum Server geschickt!?!
Ich drehe mich schon Stundenlang im Kreis.

#include <SPI.h>
#include <Ethernet.h>         	// library for ethernet functions


//ETHERNET-SETTINGS
byte mac[] 	= { 0x90, 0x00, 0x4E, 0x58, 0xA1, 0x28 };	// MAC-Adresse des Arduino
byte ip[]  	= { 192, 168, 178, 33 };                 	// IP-Adresse des Arduino
byte gateway[] = { 192, 168, 178, 1 };                	// Gateway
byte subnet[]  = { 255, 255, 255, 0 };                	// SubNet
//byte server[]  = {81, 169, 145, 157 };                 	// IP-Adresse ursprungwetter.de bei Strato

EthernetClient client;
char host[]	= "ederseewetter.de";                  	// Domain
char url[] 	= "/ultraarduinodb.php";     	// Pfad zur PHP-Datei
char key[] 	= "********";                 	// Kennwort aus PHP-Datei
char serverName[] = "www.ederseewetter.de";
char c;                                                 	// Variable für Rückgabe des Servers
long Interval  = 1;                                    	// Upload-Interval in Minuten

int trigger=9;
int echo=10;



void setup() {
delay(1000);  
Serial.begin (9600);



Serial.println("Ethernet initialisieren...");
Ethernet.begin(mac, ip);
Interval = Interval * 1000 * 60;                        	// Das in Minuten angegebene Interval in Millisekunden umrechnen
delay(1000);                                            	// warten, bis Ethernet gestartet
}

void loop() {
long dauer, entfernung;
pinMode(trigger, OUTPUT);  
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
pinMode(echo, INPUT);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) / 29.1;


Serial.print(entfernung);
Serial.println(" cm");



delay(5000);
Daten_senden(entfernung);                             	// Temperaturdaten an Server übertragen
delay(5000);

byte maxReads = 10; //Seconds
  while ((maxReads-- > 0) && client.connected())          	// Antwort des Servers lesen
  {
	delay(1000);
	while (client.available())
	{
  	char response = client.read();
  	Serial.print(response);
	}
  }
  client.stop();
  Serial.println("Done.");
  client.flush();

  delay(Interval);
}
/******************************
                          	*
  Daten an Server schickenn   *
                          	*
*******************************/
void Daten_senden(float entfernung)
{
  if (client.connect(serverName, 80)) // Verbindung zum Server aufbauen
  {
	Serial.println("Verbunden, Sende Daten...");
	client.print("GET " + String(url));
	Serial.println("GET " + String(url));
	client.print("?entfernung=");
	Serial.print("?entfernung=");
	client.print(entfernung);
	Serial.println(entfernung);
	client.print("&key=" + String(key));
	Serial.print("&key=" + String(key));
	client.println(" HTTP/1.1");
	Serial.println(" HTTP/1.1");
	client.print("Host: " + String(host));
	Serial.print("Host: " + String(host));
	client.println();
	Serial.println();
	client.println("User-Agent: Arduino");
	Serial.println("User-Agent: Arduino");
	client.println("Connection: close");
	Serial.println("Connection: close");
	client.println();
	Serial.println();
  }
  else
  {
	Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****");
  }
}

Thrillhouse:
Ich drehe mich schon Stundenlang im Kreis.

Falls Du dabei in den nächsten Stunden die Fehlermeldung oder Antwort des Servers findest, die der serielle Monitor anzeigt, teile sie uns bitte im Wortlaut mit, so wie sie im seriellen Monitor bei Dir angezeigt wird!

Ich hab hier den Sketch von meinem Kollegen. Wir tüfteln beide an dem Problem.
Sein Sketch funktioniert soweit, das alles hochgeladen wird aber die Berechnung der Entfernung nicht geht bzw. immer “0” ist.
Diesen Sketch habe ich umgeschriebn…die Berechnung funktioniert aber es wird nix hochgeladen. Keine Fehlermeldung…im SerialMonitor bleibt er einfach hängen:

Ethernet initialisieren...
14 cm

Hier der Sketch wo der Upload geht:

#include <SPI.h>
#include <Ethernet.h>         	// library for ethernet functions


//ETHERNET-SETTINGS
byte mac[] 	= { 0x90, 0x00, 0x4E, 0x58, 0xA1, 0x28 };	// MAC-Adresse des Arduino
byte ip[]  	= { 192, 168, 178, 33 };                 	// IP-Adresse des Arduino
byte gateway[] = { 192, 168, 178, 1 };                	// Gateway
byte subnet[]  = { 255, 255, 255, 0 };                	// SubNet
//byte server[]  = {81, 169, 145, 157 };                 	// IP-Adresse ursprungwetter.de bei Strato

EthernetClient client;
char host[]	= "ederseewetter.de";                  	// Domain
char url[] 	= "/ultraarduinodb.php";     	// Pfad zur PHP-Datei
char key[] 	= "********";                 	// Kennwort aus PHP-Datei
char serverName[] = "www.ederseewetter.de";
char c;                                                 	// Variable für Rückgabe des Servers
long Interval  = 1;                                    	// Upload-Interval in Minuten

int trigger=9;
int echo=10;
long dauer=0;
long entfernung=0;

void setup() {
delay(1000);  
Serial.begin (9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);


Serial.println("Ethernet initialisieren...");
Ethernet.begin(mac, ip);
Interval = Interval * 1000 * 60;                        	// Das in Minuten angegebene Interval in Millisekunden umrechnen
delay(1000);                                            	// warten, bis Ethernet gestartet
}

void loop() {
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) / 29.1;
if (entfernung >= 500 || entfernung <= 0)
{
Serial.println("Kein Messwert");
}
else
{
Serial.print(entfernung);
Serial.println(" cm");

}

delay(5000);
Daten_senden(entfernung);                             	// Temperaturdaten an Server übertragen
delay(5000);

byte maxReads = 10; //Seconds
  while ((maxReads-- > 0) && client.connected())          	// Antwort des Servers lesen
  {
	delay(1000);
	while (client.available())
	{
  	char response = client.read();
  	Serial.print(response);
	}
  }
  client.stop();
  Serial.println("Done.");
  client.flush();

  delay(Interval);
}
/******************************
                          	*
  Daten an Server schickenn   *
                          	*
*******************************/
void Daten_senden(float entfernung)
{
  if (client.connect(serverName, 80)) // Verbindung zum Server aufbauen
  {
	Serial.println("Verbunden, Sende Daten...");
	client.print("GET " + String(url));
	Serial.println("GET " + String(url));
	client.print("?entfernung=");
	Serial.print("?entfernung=");
	client.print(entfernung);
	Serial.println(entfernung);
	client.print("&key=" + String(key));
	Serial.print("&key=" + String(key));
	client.println(" HTTP/1.1");
	Serial.println(" HTTP/1.1");
	client.print("Host: " + String(host));
	Serial.print("Host: " + String(host));
	client.println();
	Serial.println();
	client.println("User-Agent: Arduino");
	Serial.println("User-Agent: Arduino");
	client.println("Connection: close");
	Serial.println("Connection: close");
	client.println();
	Serial.println();
  }
  else
  {
	Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****");
  }
}

Thrillhouse: Keine Fehlermeldung...im SerialMonitor bleibt er einfach hängen:

Ethernet initialisieren...
14 cm

Laut Fehlermeldung macht der Sketch nicht mehr weiter, wenn er eine Verbindung ins Internet aufbauen soll.

Bist Du denn sicher, dass Du die exakt selbe Internetkonfiguration hast, also dieselbe Fritzbox wie Dein Kollege mit exakt derselben Heim-Netzwerkkonfiguration?

Hast Du andere Internet-Beispiel-Sketche mit Deinem Ethernet-Shield erfolgreich getestet? Wenn ja, welche?

Ne exakt gleich nicht aber wir Hosten beide bei Strato.
Aber an den Konfigurationen kann es nicht liegen weil sein Sketch geht auch bei mir.
Nur gibt sein Sketch Keinen Messwert aus…dieser ist immer 0
Wenn ich den Messvorgang so umschreibe das er auch einen Richtigen Wert ausgibt, dann läd er nicht mehr hoch.
Also muss irgendwas nicht im Sketch stimmen…wo in “cm” umgerechnet wird??? :~

Thrillhouse: Aber an den Konfigurationen kann es nicht liegen weil sein Sketch geht auch bei mir.

Euch fehlt echt das absolute Netzwerk-Basiswissen für den Selbstbau von Internet-Geräten als Gerätehersteller.

Dein Sketch:

byte mac[]  = { 0x90, 0x00, 0x4E, 0x58, 0xA1, 0x28 };   // MAC-Adresse des Arduino

Der Sketch Deines Kollegen:

byte mac[]  = { 0x90, 0x00, 0x4E, 0x58, 0xA1, 0x28 };   // MAC-Adresse des Arduino

Ihr dürft NIE - NIE - NIE im selben lokalen Netzwerk zwei Geräte am Netz hängen haben, die dieselbe MAC-Adresse haben.

Bei gekauften Fertiggeräten ist das vom Hersteller aus sichergestellt, dass JEDES NETZWERKGERÄT WELTWEIT EINE EINDEUTIGE MAC ADRESSE bekommen hat.

Bei Deinem Arduino bist DU der Hersteller des Geräts und mußt sicherstellen, dass zwar nicht weltweit, ABER IN DEINEM NETZWERK jede MAC-Adresse absolut EINMALIG ist und NICHT DOPPELT vorkommt!

Denke Dir für den zweiten Arduino in Deinem Netzwerk eine andere MAC-Adresse aus (letztes Byte ändern oder so)!

Und starte Deinen Router neu, es ist nicht mehr sichergestellt, dass dieser noch korrekt funktioniert, wenn Du nach dem Booten zwei Geräte mit derselben MAC-Adresse am Router angestöpselt hattest.

Wenn danach noch Probleme bestehen, melde Dich nochmal.

Nee Nee, Das ist natürlich meine MAC Adresse.....die Netzwerk Konfiguration ist schon auf meine System angepasst.

Sorry das hatte ich nicht mit dabei geschrieben :relaxed:

Thrillhouse: Nee Nee, Das ist natürlich meine MAC Adresse.....die Netzwerk Konfiguration ist schon auf meine System angepasst.

Sorry das hatte ich nicht mit dabei geschrieben :relaxed:

OK, dann gehe ich davon aus, dass Du niemals zwei Arduinos mit derselben MAC-Adresse an Deinem Router hattest. Oder wenn, dann ist der zweite abgestöpselt und der Router danach neu gestartet worden.

Wenn Du weiter keine Fehlermeldungen liefern kannst, lade ich mir mal den Sketch auf einen Arduino bei mir und schaue mir das an, was Dein Server für Fehlermeldungen liefert, wenn er welche liefert. Funktionieren sollte der Zugriff von mir aus auf Deinen Server wohl ohnehin nicht, weil das Sternchen-Passwort fehlt.

Was für ein Board verwendest Du? UNO? MEGA? Oder?

Ich hatte auch nicht vor mein Passwort hier in der Weltgeschichte zu verteilen :wink:

Ich benutze den UNO.
Es liegt nicht an meinem Server sondern an der Berechnung.
Der Sketch wird einfach nicht weiter ausgeführt nachdem ein Wert ausgegeben wurde.
Irgendetwas stört sich da

Thrillhouse: Ich benutze den UNO. ... Irgendetwas stört sich da

Auf einem UNO dürfte Dir als erstes der RAM-Speicher ausgehen, so wie Du programmierst:

    Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****");

Ein UNO hat 2KB RAM = 2048 Bytes

Alleine die 54 Bytes der String-Konstanten entsprechen bereits 54/2048 = über 2,6% des gesamten RAM-Speichers auf dem UNO.

Du mußt Dir darüber im klaren sein: - die Ethernet-Library ist eine "fette" Library, daher mußt Du RAM-Speicher sparen - wenn Du RAM-Speicher sparen mußt, dann String-Konstanten nur mit F-Makro per print ausgeben - außerdem die verschwenderischen String-Objekte (Datentyp "String") unbedingt vermeiden und Char-Arrays verwenden

So verwendest Du das F-Makro mit Textkonstanten:

    Serial.println(F(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****"));

Alle von Dir per print/println ausgegebenen "konstanten" Texte gehören dringend auf das F-Makro umgestellt, um RAM-Speicher zu sparen, wenn Du nur ein UNO-Board hast.

Nachtrag: Habe Deinen Sketch jetzt bei mir auf einen UNO geladen. Dem ersten Eindruck nach ist mangelnder RAM-Speicher nicht das Problem. Trotzdem verbindet sich der Sketch auch hier bei mir nicht mit Deinem Server. Fehlermeldung: Verbindung kann nicht hergestellt werden. Ich suche mal etwas weiter.

jurs: - außerdem die verschwenderischen String-Objekte (Datentyp "String") unbedingt vermeiden und Char-Arrays verwenden

Er hat ja schon char Arrays. Nur werden dann dann völlig unnötig und irrsinnig in String Objekte verpackt.

Besser so. Aus:

client.print("&key=" + String(key));

wird:

client.print(F("&key="))
client.print(key);

So, Fehler gefunden:

int trigger=9;
int echo=10;

Du kannst nicht den Chipselect-Pin des Ethernet-Shields (Pin-10) gleichzeitig als Echo-Pin des verwendeten Sensors verwenden!

Nimm Pin-8 und Pin-9 für den Sensor! Oder Pin-2 und Pin-3! Oder was vom Ethernet-Shield an Pins sonst NICHT BEREITS verwendet wird!

Uh ja ok...ich werde das mal überarbeiten...das mit dem Speicher war mir nicht ganz klar. Aber es geht jetzt....habe die Pin Belegung von:

int trigger=9;
int echo=10;

Auf

int trigger=5;
int echo=6;

jetzt geht alles wunderbar :astonished: 8)

Thrillhouse: jetzt geht alles wunderbar :astonished: 8)

Kleine Ursache - große Wirkung.

Mit den Pins und was Du wo anschließt, mußt Du aber wirklich aufpassen: Wenn Du einfach so Kurzschlüsse auf dem Board zusammensteckst, dann können Bauteile das auch manchmal ganz übel nehmen, und wenn es dann anfängt nach Elektrik zu stinken und die Bauteile kleine Rauchwölkchen von sich geben, können auch mal kleinere oder größere Neuanschaffungen fällig werden.

Bauteile sind NICHT immer fail-safe gegen Falschanschluss abgesichert!

Jap aber ohne Fehler lernt man schlechter :P

Da suche ich nach der Lösung meines Problems, finde tatsächlich einen Google Treffer und dann gibt's keine Lösung :cold_sweat: Ich weiß zumind. die Ursache: Problem ist Strato, wenn du die Serverantwort per UART ausgeben lässt wirst du es sehen. Da du keinen eigenen Server hast teilt Strato eine IP mit mehreren Nutzern, d.h. dein Code per IP ist sowieso falsch, aber auch wenn du den Domainnamenin connect angeben wirst, wird die Ethernet-API per DNS resolven und wieder die IP probieren.

Jemand eine Idee wie man das umgehen kann?

Problem ist Strato,

Dass Strato das Problem ist, kann ich kaum glauben.

Vermutlich ist dein Problem, das du das HTTP 1.1 nicht implementiertst.
Alle HTTP 1.1 Server erwarten zwingend den Host Header.
Ohne diesen ist ihnen die Zuordnung von IP zu Domain nicht möglich.