Stromzähler mit Ethernetshield <-- keine Verbindung??

Hallo habe folgendes Programmiert und soll mittels Xampp meinen Strom Zählen leider funktioniert das noch nicht da ich keine Verbundung zum Rechner hin bekomme dieser heißt in meinem Netztwert Server-PC. denke aber mal das liegt an der Iniotalisierung vom Board und nicht am Netzwerk :~

// Allgemein
volatile int impuls[]       = {0,0,0,0,0,0};                  // Impulsarray zum Zählen der Impulse {S0<1>,S0<2>,S0<3>)
volatile int netzspeicher[] = {0,0,0,0,0,0};                  // Zwischenspeicher der Impulse für übertragung {S0<1>,S0<2>,S0<3>)
volatile double verbauchsanzeige[] ={0,0,0,0,0,0};
volatile long zeitenspeicher[] ={0,0,0,0,0,0};

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

 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};     // Mac-Adresse zuweisen
 IPAddress ip(192,168,2,10);                        // IP Adresse Zuweisen
 byte subnet[]  = { 255, 255, 255, 0 };                 // Subnetmask Zuweisen 
 Client client(ip, 80);
 char host[] = "192.168.2.25";	                       // DOMAIN eingeben!
 char url[]  = "192.1/Strom/sql_eintrag.php";	       // Pfad zur PHP-Datei eingeben
 char key[] = "Kennwort_eingeben";	               // Kennwort aus PHP-Datei eingeben
 char c;
 EthernetClient client;


// Serial und Live 
 int intervalserial = 5000;                            // Inervall für serial Ausgabe      
 long zwischenzeitserial =0;                           // Var zur berechnung der vergangene zeit
 double ergebnis = 0;                                  // Var für Live Anzeige Watt/h   

 double Temperatur1 = 0;                              // Temperatur 1 momentan
 double Temperatur2 = 0;
 
// Netzwerk und Datenbank
 long zwischenzeitnetzwerk = 0;  
 int intervalnetzwerk = 6000;
 int zwischenimpuls = 0;                                 // Zwischen Var für Datenbank speicherung 
 
 void setup() {
 Serial.begin(9600);                                   // Serial wird auf 9600 Baud gestellt
 attachInterrupt(0, zaehleneins, FALLING);             //Interrupt wird ausgelößt bei Positiver Flanke und springt in Programm zaehlen1 0 = Digital 2
 attachInterrupt(1, zaehlenzwei, FALLING);             //Interrupt wird ausgelößt bei Positiver Flanke und springt in Programm zaehlen2 0 = Digital 3
 attachInterrupt(2, zaehlendrei, FALLING);  
 attachInterrupt(3, zaehlenvier, FALLING);  
 attachInterrupt(4, zaehlenfuenf, FALLING);  
 attachInterrupt(5, zaehlensechs, FALLING);  
 
 Ethernet.begin(mac, ip, gateway, subnet);             // Ethernet Shild soll initalisert werden.
 delay (5000);                                         // 5 Sekunden warten
 }
  
// ----------Programm Schleife---------------------------------------------------------------------------  
void loop() 
{ 
 //--- Anzeige über Serial Com Port  
 if (millis() - zwischenzeitserial > intervalserial-1) {// Wenn Systemzeit - Letzte gepeicherte Zeit größer als interval dann...
   Daten_senden_serial();
   } 
 
 //--- Ausgabe über Netzwerk  
 /*if (millis() - zwischenzeitnetzwerk > intervalnetzwerk-1) {// Wenn Systemzeit - Letzte gepeicherte Zeit größer als interval dann...
   Daten_senden();                                          // Starte Programm Daten_senden  
   }*/
}
//-- Unterprogramm zum Impulse Zählen------------------------------------------------------------------------------------------------
void zaehleneins()                              
 {
 impuls[0]++;   //setze impulse +1
 }
 
 void zaehlenzwei()                              
 {
 impuls[1]++;                                                  //setze impulse +1
 }
 
 void zaehlendrei()                              
 {
 impuls[2]++;                                                  //setze impulse +1
 }
 
 void zaehlenvier()                              
 {
 impuls[3]++;                                                  //setze impulse +1
 }
 
 void zaehlenfuenf()                              
 {
 impuls[4]++;                                                  //setze impulse +1
 }
 
 void zaehlensechs()                              
 {
 impuls[5]++;                                                  //setze impulse +1
 }

//------------------------------------------------------------------------------------------------------------------------------------





 void Daten_senden()
{
  
  Serial.println("Verbindung mit Datenbank...");
  
  if (client.connect())                                    // Wenn die Verbindung zum Server aufgebaut ist, dann...
  {
   for(int j=0;j<6;i++)
  { 
   netzspeicher[j] = Impuls[j];
   Impuls[j] = 0;
   Serial.println(".... Daten Kopiert ");
   Serial.print("Verbunden...sende Daten...");
   
   client.print("GET ");
   client.print("Server-PC/strom/eintrag.php");
   client.print("?Impulse=");
   client.print(netzspeicher[j]);
   client.print("&IdentID=0000000");
   client.print(j);
   client.println(" HTTP/1.1");
   client.print("Host: ");
   client.println(host);
   client.println();
   
   Serial.println("******* DATEN WURDEN ÜBERTRAGEN ********");
  }
}
  else
  {
    Serial.println(" ***** VERBINDUNGSAUFBAU NICHT MÖGLICH *****");
  }    







void Daten_senden_serial()
{
 zwischenzeitserial = millis();  //Letzte gespeicherte Zeit = Systemzeit
     //---- Ausgabe auf Com Port -----
     
 for (int i=0;i<6;i++)
     { 
     Serial.print("Impulse INTERRUPT " );                        // Gebe aus "Impuls= 1-6 " 
     Serial.print(i);
     Serial.print("= " );
     Serial.print(impuls[i]); 
     Serial.print(" Verbrauch = " );
     Serial.print(verbauchsanzeige[0]);
     Serial.println(" Kw/h");
     
     } 
   Serial.println("");  
 }

Kann mir einer helfen ???

leider funktioniert das noch nicht da ich keine Verbundung zum Rechner hin bekomme

Dann probier doch erstmal, ein ganz einfaches 10 Zeilen Programm ans Laufen und Verbinden zu bekommen...

Das erste was mir auffällt ist, das Du den Client wiefolgt definierst:

 Client client(ip, 80);

Dabei ist aber "ip" die IP Deines Arduino, nicht die Deines Servers, der hat seine IP in der Variable "hosts" gespeichert.
Das nächste was mir auffällt ist die URL im GET Request der Funktion "Daten_senden()".

   client.print("GET ");
   client.print("Server-PC/strom/eintrag.php");
   client.print("?Impulse=");

Ich vermute mal, das "Server-PC" nicht zur eigentichen URI gehört, sondern der Server selbst ist. Beim GET wird nur der Pfad der aufgerufenen Seite übergeben. Also von "trallala.de - This website is for sale! - Promis Resources and Information." das man im Browser verwenden würde nur der Teil "/ich/bin/ein/test.html". Der Server selbst wird über das "Host: www.trallala.de" im Request übergeben.

Weiterhin definierst Du im Kopf Deines Programms eine Variable "url[]", die Du dann aber nicht verwendest.

Btw. welche Version der IDE verwendest Du? Falls Version 1.0.X dann würde ich auf die neue Klasse "EthernetClient" umstellen. Schau Dir mal das Beispiel "WebClient" der IDE an.

Mario.

Danke für die Hilfe !

mein PC hat aber keine www Adresse sondern ist im Lan also hat die Adresse 192.168.2.25

EthernetClient client;?? ist im beispiel genau so Version 1.0.2---

char host[] = "192.168.2.25";	                        // DOMAIN eingeben!
 Client client(host, 80);

Fehler: no maching function for call client::client(char[13],int)

Super wenn das klappen könnte

com-cat:
mein PC hat aber keine www Adresse sondern ist im Lan also hat die Adresse 192.168.2.25

Braucht er auch nicht. Aber ansprechen solltest Du den schon, wenn er Daten vom Arduino empfangen soll.

com-cat:
EthernetClient client;?? ist im beispiel genau so Version 1.0.2---

char host[] = "192.168.2.25";	                        // DOMAIN eingeben!

Client client(host, 80);




Fehler: no maching function for call client::client(char[13],int)

Hmm, wenn ich in derIDE 1.0.2 unter "Datei -> Beispiele -> Ethernet -> WebClient" das Beispiel öffne, wird da nicht "Client client" sondern "EthernetClient client" verwendet.
Zusätzlich wird der Ziel-Server und der Port zu dem sich der Client verbinden soll nicht beim Erzeugen des Objektes angegeben, sondern beim Aufruf der Methode "connect()".
Siehe auch: Ethernet - Arduino Reference
Dort gibt es auch ein Beispiel.

Die Fehlermeldung bezüglich des "host" bekommst Du, weil Du die "alte" Version des Client verwendest. Dieser will beim Erzeugen des Objektes schon Ziel und Port haben und kann als Ziel nur mit einem byte[4] Array umgehen, weil er eine IP-Adresse erwartet. Das sollte aber auch bei Dir funktionieren, wenn Du statt

char host[] = "192.168.2.25";
//folgendes verwendest:
byte host[]= { 192 ,168, 2, 25};

Was mich wundert ist, das Du so ein complexes Programm geschrieben hast, ohne zwischendrin zu testen ob die einzelnen Teile überhaupt funktionieren.

Habe jetzt noch mal etwas umgebaut den Quelltest leider OHNE Erfolg :expressionless:

Keine Verbindung möglich ?

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h>

// Allgemein
volatile int impuls[]              = {0,0,0,0,0,0};                  // Impulsarray zum Zählen der Impulse {S0<1>,S0<2>,S0<3>)
volatile int netzspeicher[]        = {0,0,0,0,0,0};                  // Zwischenspeicher der Impulse für übertragung {S0<1>,S0<2>,S0<3>)
volatile double verbauchsanzeige[] = {0,0,0,0,0,0};                  // 
volatile long zeitenspeicher[]     = {0,0,0,0,0,0};                  //

 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};                  // Mac-Adresse zuweisen
 IPAddress ip(192,168,2,10);                                         // IP Adresse Arduino Zuweisen
 byte host[]= { 192 ,168, 2, 25};                                     // Server IP
 
 byte subnet[]  = { 255, 255, 255, 0 };                              // Subnetmask Zuweisen 
 byte gateway[] = { 192,168,2,2 };                                   // Gateway
 char url[]  = "/Strom/aufrufen.php";	                     // Pfad zur PHP-Datei eingeben
 char key[] = "Kennwort_eingeben";	                             // Kennwort aus PHP-Datei eingeben
 char c;
 EthernetClient client;


// Serial und Live 
 int intervalserial = 60000;                                          // Inervall für serial Ausgabe      
 long zwischenzeitserial =0;                                         // Var zur berechnung der vergangene zeit
 double ergebnis = 0;                                                // Var für Live Anzeige Watt/h   

 double Temperatur1 = 0;                                             // Temperatur 1 momentan
 double Temperatur2 = 0;                                             // Temperatur 2 momentan
 
// Netzwerk und Datenbank
 long zwischenzeitnetzwerk = 0;  
 int intervalnetzwerk = 15000;                                        // Intervall für netzwerk Ausgabe15
 int zwischenimpuls = 0;                                             // Zwischen Var für Datenbank speicherung 
 
 void setup() {
 Serial.begin(9600);                                                 // Serial wird auf 9600 Baud gestellt
 attachInterrupt(0, zaehleneins, FALLING);                           //Interrupt wird ausgelößt bei Positiver Flanke und springt in Programm zaehlen1 0 = Digital 2
 attachInterrupt(1, zaehlenzwei, FALLING);                           //Interrupt wird ausgelößt bei Positiver Flanke und springt in Programm zaehlen2 0 = Digital 3
 attachInterrupt(2, zaehlendrei, FALLING);  
 attachInterrupt(3, zaehlenvier, FALLING);  
 attachInterrupt(4, zaehlenfuenf, FALLING);  
 attachInterrupt(5, zaehlensechs, FALLING);  
 
 Ethernet.begin(mac, ip, gateway, subnet);              // Ethernet Shild soll initalisert werden.
 delay (5000);                                         // 5 Sekunden warten
 }
  
// ----------Programm Schleife---------------------------------------------------------------------------  
void loop() 
{ 
 //--- Anzeige über Serial Com Port  
/* if (millis() - zwischenzeitserial > intervalserial-1) {// Wenn Systemzeit - Letzte gepeicherte Zeit größer als interval dann...
   Daten_senden_serial();
   }*/ 
 
 //--- Ausgabe über Netzwerk  
 if (millis() - zwischenzeitnetzwerk > intervalnetzwerk-1) {// Wenn Systemzeit - Letzte gepeicherte Zeit größer als interval dann...
   Daten_senden();                                          // Starte Programm Daten_senden  
   }
}
//-- Unterprogramm zum Impulse Zählen------------------------------------------------------------------------------------------------
void zaehleneins()                              
 {
 impuls[0]++;   //setze impulse +1
 }
 
 void zaehlenzwei()                              
 {
 impuls[1]++;                                                  //setze impulse +1
 }
 
 void zaehlendrei()                              
 {
 impuls[2]++;                                                  //setze impulse +1
 }
 
 void zaehlenvier()                              
 {
 impuls[3]++;                                                  //setze impulse +1
 }
 
 void zaehlenfuenf()                              
 {
 impuls[4]++;                                                  //setze impulse +1
 }
 
 void zaehlensechs()                              
 {
 impuls[5]++;                                                  //setze impulse +1
 }

//------------------------------------------------------------------------------------------------------------------------------------





 void Daten_senden()
{
  
  Serial.println("Verbindung mit Datenbank...");
  
  if (client.connect(host, 80)) 
  {
   for(int j=0;j<6;j++)
  { 
   netzspeicher[j] = impuls[j];
   impuls[j] = 0;
   Serial.println(".... Daten Kopiert ");
   Serial.print("Verbunden...sende Daten...");
   
   client.print("GET ");
   client.print("/strom/eintrag.php");
   client.print("?Impulse=");
   client.print(netzspeicher[j]);
   client.print("&IdentID=0000000");
   client.print(j);
   client.println(" HTTP/1.1");
   client.print("Host: ");
   //client.println(host);
   client.println();
   
   Serial.println("******* DATEN WURDEN ÜBERTRAGEN ********");
  }
}
  else
  {
    Serial.println(" ***** VERBINDUNGSAUFBAU NICHT MÖGLICH *****");
  }    
}






void Daten_senden_serial()
{
 zwischenzeitserial = millis();  //Letzte gespeicherte Zeit = Systemzeit
     //---- Ausgabe auf Com Port -----
     
 for (int i=0;i<6;i++)
     { 
     Serial.print("Impulse INTERRUPT " );                        // Gebe aus "Impuls= 1-6 " 
     Serial.print(i);
     Serial.print("= " );
     Serial.print(impuls[i]); 
     Serial.print(" Verbrauch = " );
     Serial.print(verbauchsanzeige[0]);
     Serial.println(" Kw/h");
     
     } 
   Serial.println("");  
 }

Was bitte meinst DU genau mit "Keine Verbindung möglich"?
Verbindet sich der Arduino nicht mit Deinem Server?

Wenn ich mir folgenden Code in der loop() mal anschaue, passt da auch was nicht ganz.

// ----------Programm Schleife---------------------------------------------------------------------------  
void loop() 
{ 
 //--- Anzeige über Serial Com Port  
/* if (millis() - zwischenzeitserial > intervalserial-1) {// Wenn Systemzeit - Letzte gepeicherte Zeit größer als interval dann...
   Daten_senden_serial();
   }*/ 
 
 //--- Ausgabe über Netzwerk  
 if (millis() - zwischenzeitnetzwerk > intervalnetzwerk-1) {// Wenn Systemzeit - Letzte gepeicherte Zeit größer als interval dann...
   Daten_senden();                                          // Starte Programm Daten_senden  
   }
}

Nach 15 Sekunden ( millis() - 0 > 15000 ) wird das Daten_senden() in jeden Durchlauf von loop() aufgerufen, da Du nirgendwo ein "zwischenzeitnetzwerk = millis()" eingebaut hast, um das Interval auf die nächsten 15 Sekunden zu setzen.

Und noch eine Frage, welches Board setzt Du ein? Einen Arduino Mega 2560? Denn nur der hat 5 Interrupt-Leitungen.
Wenn ja, dann wäre die nächste Frage ob Dein Ethernetshield mit dem Mega richtig funktioniert, hast Du das mal an einfachen Beispielen getestet?

Nimm doch einfach des Projekt, welches der IDE ohnehin beiliget, wo 6 ADC-Werte per Web angezeigt werden. Wenn funzt, änderst du es schrittweise ab ...

qualidat:
Nimm doch einfach des Projekt, welches der IDE ohnehin beiliget, wo 6 ADC-Werte per Web angezeigt werden. Wenn funzt, änderst du es schrittweise ab ...

Das würde aber leider nichts bringen. Was com-cat gebaut / programmiert hat ist ein Web-Client und kein Web-Server. D.h. der Arduino sendet Daten an einen externen Webserver und übergibt die ermittelten Daten über die URL-Paramter an ein PHP-Script.
Das Beispief auf das Du dich beziehst ist ein Web-Server wor aktiv vom Arduino Daten per Browser abgefragt werden. Also genau die andere Kommunikationsrichtung.

Der Webserver funktioniert auch NUR es ist schwer daten darin zu speichern :slight_smile:

Hat vieleicht einer ein anderes Webclient Programm was ich Testen kann ?

Das Google Programm funktioniert auch nicht richtig :~

com-cat:
Der Webserver funktioniert auch NUR es ist schwer daten darin zu speichern :slight_smile:

Wie ist das gemeint? Kannst Du einen Aufruf, den eigentlich der Arduino machen würde mal im Brwoser aufrufen. Werden dann die Daten korrekt erfasst?
Was sagen die Logfiles des Webservers?

Hast Du die PHP-Scripte selbst geschrieben, oder nutzt Du Files aus einem anderen Projekt?

com-cat:
Hat vieleicht einer ein anderes Webclient Programm was ich Testen kann ?

Wenn nicht mal das "Google" Programm, ich vermute mal es handelt sich um das Web-Client Beispiel, richtig funktioniert, hast Du evtl. ein grundsätzliches Problem. Ehe Du weiter mit Deinem komplexen Programm rumhantierst, solltes Du erstmal die grundlegenden Probleme lösen. Und das heißt schrittweise vorgehen.

com-cat:
Das Google Programm funktioniert auch nicht richtig :~

Was genau "funktioniert nicht richtig"? Etwas mehr Informationen wären hilfreich.

Funktioniert denn in Deinem Sketch denn die serielle Ausgabe, wenn Du das Daten-Senden per Ethernet wegläßt?
Außerdem hast Du noch immer nicht geschrieben, welches Board Du einsetzt. Also

  1. welcher Arduino genau
  2. welches Ethernetshield
    beides möglichst mit Link, falls es keine originalen Arduinos sind.

Mario.

AT MEga 1280

  • Orginales ethernet shild