Pages: [1]   Go Down
Author Topic: Stromzähler mit Ethernetshield <-- keine Verbindung??  (Read 1471 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-confuse


Code:
// 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 ???



Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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...
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das erste was mir auffällt ist, das Du den Client wiefolgt definierst:
Code:
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()".
Code:
   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 "http://www.trallala.de/ich/bin/ein/test.html" 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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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---

Code:
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

 

 
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


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

Code:
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: http://arduino.cc/en/Reference/EthernetClient
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
Code:
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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Habe jetzt noch mal etwas umgebaut den Quelltest leider OHNE Erfolg  smiley-neutral

Keine Verbindung möglich ?

Code:
#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(""); 
 }
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Code:
// ----------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?
« Last Edit: November 30, 2012, 02:00:47 am by mkl0815 » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Das Google Programm funktioniert auch nicht richtig  smiley-confuse

Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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?

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.

Das Google Programm funktioniert auch nicht richtig  smiley-confuse

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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

AT MEga 1280
+ Orginales ethernet shild
Logged

Pages: [1]   Go Up
Jump to: