Werte an Web-Server mit enc28j60 Ethernetadapter übergeben

Hallo Leute,

ich möchte Zustände und Messergebnisse des Arduinos an eine Datenbank auf meinem Web-Server übergeben. Mit hilfe des Internets habe ich auch schon einiges herausgefunden. Ich rufe den Web-Server mit dem folgenden Sketch auf:

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x32 };

byte Ethernet::buffer[700];
static uint32_t timer;

char website[] PROGMEM = "meine-Domain.de";

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void setup () {
  Serial.begin(57600);
  Serial.println("\n[webClient]");

  if (ether.begin(sizeof Ethernet::buffer, mymac,53) == 0) 
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/script/SaveTempToMySQL.php?T1=55&T2=33&key=pin"), "", website, my_callback);
  }
}

Mit den festen Werten für T1=55 und T2=33 funktioniert es auch. Wie kann ich aber die Werte 55 und 33 durch Messergebnisse oder Zustände ersetzen?

Wenn ich die Werte für T1 und T2 z.B. als Integer deklariere und die letzte Code-Zeile wie folgt ersetze:

ether.browseUrl(PSTR("/pumpstation/SaveTempToMySQL.php?T1=" + T1 + "&T2=" + T2 + "&key=pumpstation"), "", website, my_callback);

erhalte ich diese Fehlermeldung:

error: invalid operands of types 'const char*' and 'const char [5]' to binary 'operator+'

Mir ist schon klar, dass es mit den unterschiedlichen Variablen-Typen zusammen hängt.

Gruß
Frank

PS: wie würde Loddar sagen: mei inglisch is not so gutt! Dies bitte bei Antworten mit Links berücksichtigen, Danke.

error: invalid operands of types 'const char*' and 'const char [5]' to binary 'operator+'
Mir ist schon klar, dass es mit den unterschiedlichen Variablen-Typen zusammen hängt.

Leider wohl nicht ganz klar.
Die VariablenTypen const char * und const char[5]
kennen leider kein + dazwischen.
und const char* +int macht nicht das, was du willst.

sprintf oder evtl. strcat ist das was du suchst.
( Und das Ergebnis kann natürlich nicht als PSTR im Flash liegen )

Nachtrag: Glück gehabt, dass du überhaupt eine Fehlermeldung gekriegt hast

int i = 4;
char * Text = "hallo ";
Serial.println (Text + i); // kein Fehler, liefert "o ", aber niemals "hallo 4"

Danke erstmal an michael_x, ich bin vielleicht eine Schritt weiter?!

Ich bekomme keine Fehlermeldung mehr, wenn ich folgendes in der Schleife mache:

void loop () {
  ether.packetLoop(ether.packetReceive());
  String web1 = "/script/SaveTempToMySQL.php?T1=";
  String web2 = "&T2=";
  String web3 = "&key=pin";
  String webg = "";
  int T1 = 50;
  int T2 = 100;
// hier kann ich die Variablen T1 und T2 noch bearbeiten
  T2 = 200;
  
  webg = web1 + T1 +web2 + T2 + web3;
  
  char charBuf[62];
  webg.toCharArray(charBuf, 62); 
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.println(charBuf); // Kontrolle, was in chrBuf steht
    Serial.print("<<< REQ ");
    //ether.browseUrl(PSTR("/script/SaveTempToMySQL.php?T1=55&T2=33&key=pin"), "", website, my_callback);
    ether.browseUrl(charBuf, "", website, my_callback);
  }

Allerdings komme ich ohne das PSTR auch nicht bei der Web-Seite an, die ich haben will.

Ich habe Probleme mit dem PSTR!!! Kann mir jemand erläutern, was da eigentlich passiert. Aus dem Playground werde ich nicht schlau! Was bewirkt das PSTR?

Was bewirkt das PSTR?

PSTR ( ) definiert einen konstanten string, der im Flash liegt. ( Ähnlich wie das F-Makro )
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
Ob [b]browseUrl[/b] nur mit solch einem PSTR zurechtkommt, ist nun die Frage.

Allerdings komme ich ohne das PSTR auch nicht bei der Web-Seite an, die ich haben will.

... aber

    Serial.println(charBuf); // Kontrolle, was in chrBuf steht

zeigt genau das an, was du erwartest ? ...

Standard Funktionen können normalerweise keinen Progmem String verarbeiten. Das kompiliert u.U. aber geht nicht. Man muss den String schließlich auch wieder aus dem Flash auslesen!

Man kann sich aber einmal global ein Puffer Array definieren, das groß genug für den größten String ist:

const int STRING_BUFFER_SIZE = 101;
char stringBuffer[STRING_BUFFER_SIZE];

Dann schreibt man sich Funktionen die einen Progmem String als Paramter nehmen und kopiert diesen ins RAM

void browseUrl_P(const char* str)
{
  strncpy_P(stringBuffer, str, STRING_BUFFER_SIZE);
  ether.browseUrl(stringBuffer);
}

Da kann man dann browseUrl_P(PSTR("....")); schreiben

Das hier ist auch sehr praktisch:

#define P(str) (strcpy_P(stringBuffer, PSTR(str)))

Das kann man dann wie F() verwenden, aber für alle Funktionen:
ether.browseUrl(P("...."));

Am besten man gibt den String dabei mal auf Serial aus um zu sehen ob er richtig kopiert wird. Diese Sachen sind recht fehleranfällig, da es oft keine Compile-Fehler gibt, aber danach Unsinn im Array steht wenn man einen falschen Zeiger verwendet.

Oder mal die Definition von browseUrl in der Lib anschauen (mit AtmelStudio/VisualStudio würde man es auch in der IDE sehen). Wenn der Parameter als const definiert ist, wird i.d.R. ein Progmem String erwartet. Ansonsten einer in RAM (100%ig sicher ist das nicht, aber man kann es Anhaltspunkt nehmen). Ich bezweifle es aber dass das für Progmem gedacht ist. Normalerweise sollte man es am Funktionsnamen sehen. Wenn da also nicht sowas wie "pgm" oder "_P" dabei steht wird es eher ein RAM String sein.

Vielen Dank für Eure Infos.

Ich bin zwar nicht so ganz dran lang gestiegen, aber mich haben Eure Hinweise zur Lösung geführt.

Die Funktion

ether.browseUrl(PSTR("/script/SaveTempToMySQL.php?T1=55&T2=33&key=pin"), "", website, my_callback);

erwartet in der zweiten Variablen (hier ein leerer String "") ein const char *, die an die URL angehängt wird. Jetzt sieht mein Aufruf wie folgt aus und funktioniert auch:

void loop () {
  ether.packetLoop(ether.packetReceive());

  String web1 = "T1=";
  String web2 = "&T2=";
  String web3 = "&key=pin";
  String webg = "";
  int T1 = 50;
  int T2 = 100;
  webg = web1 + T1 +web2 + T2 + web3;
  
  char charBuf[100];
  webg.toCharArray(charBuf, 100); 
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/script/SaveTempToMySQL.php?"), charBuf, website, my_callback);
  }

Also ncohmals Danke!!!