Go Down

Topic: Stromzähler mit Ethernetshield <-- keine Verbindung?? (Read 2024 times) previous topic - next topic

com-cat

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


Code: [Select]

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




michael_x

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

mkl0815

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

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: [Select]

   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.

com-cat

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: [Select]

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




mkl0815


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: [Select]

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: [Select]

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.

com-cat

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

Keine Verbindung möglich ?

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

mkl0815

#6
Nov 30, 2012, 07:43 am Last Edit: Nov 30, 2012, 08:00 am by mkl0815 Reason: 1
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: [Select]

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

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

mkl0815


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.

com-cat

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

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

Das Google Programm funktioniert auch nicht richtig  :~


mkl0815


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


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


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.

com-cat


Go Up