Inviare dati temperatura a mysql su server

Ciao, sto cercando di inviare i dati della temperatura di un sensore DHT11 al un database mysql su un server online.
Nel server ho creato un file add.php che riceve i dati e li salva sul database (testato tramite browser e funziona).
Nell’arduino ho questo codice:

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

#include <EtherCard.h>
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

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

const char website[] PROGMEM = "dominio.server.it";

static void datiInviati (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(9600);

  dht.begin();

  
  // Change 'SS' to your Slave Select pin, if you arn't using the default pin
  if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
    Serial.println(F("Failed to access Ethernet controller"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));

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

#if 1
  // use DNS to resolve the website's IP address
  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
#elif 2
  // if website is a string containing an IP address instead of a domain name,
  // then use it directly. Note: the string can not be in PROGMEM.
  char websiteIP[] = "192.168.1.1";
  ether.parseIp(ether.hisip, websiteIP);
#else
  // or provide a numeric IP address instead of a string
  byte hisip[] = { 192,168,1,1 };
  ether.copyIp(ether.hisip, hisip);
#endif

  ether.printIp("SRV: ", ether.hisip);
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  ether.packetLoop(ether.packetReceive());
  String temp = String(t);
  String umid = String(h);
  String uno =  "add.php?temp=";
  String due =  "&umid=";
  uno +=  temp;
  uno += due;
  uno += umid;

  if (millis() > timer) {
    timer = millis() + 10000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/arduino/"), uno, website, datiInviati);
  }
}

Compilandolo mi da un errore che non riesco a capire, sembra che non gli vada bene la variabile uno. L’errore è:
no matching function for call to ‘EtherCard::browseUrl(const char*, String&, const char [16], void (&)(byte, word, word))’

Se al posto di quella variabile faccio un test dichiarando la variabile uno così:
char uno[] = “add.php?temp=5&umid=6”;
allora funziona

è come se stessi concatenando le stringhe in modo sbagliato.

Mi sapete dire dove sto sbagliando?
Grazie

ciao Fosco,

nella libreria EtherCard ci sono due versioni del metodo browseUrl ed in entrambi vengono passati, come primo e secondo parametro, un const char*.
il tuo "uno" è un Oggetto di tipo String...tutt'altra cosa.

Ciao Orso2001, grazie per la risposta.

Per trasformare la variabile uno da stringa a const chart* ho aggiunto la riga

const char* string1 = uno.c_str();

Così compila senza dare errori ma comunque non mi salva nulla nel database.

Se stampo nel monitor seriale la variabile string1 è esattamente come me la aspetto:
add.php?temp=valore_temperatura_variabile&umid=valore_umidità_variabile
e se faccio la richiesta manualmente dal browser effettivamente viene inserito nel database.

Non capisco dove sto sbagliando, può essere che stia facendo la richiesta all'url sbagliato?

Da browser io scrivo nella barra degli indirizzi:
http://dominio.server.it/arduino/add.php?temp=5&umid=6
e funziona.

È giusto il comando:
ether.browseUrl(PSTR("/arduino/"), string1, website, datiInviati);
per fare la stessa richiesta che faccio via browser?

Grazie ancora.
Fosco

Verifica che i parametri della funzione chiamata siano coerenti con i parametri che passi.
string1 lo stai dichiarando come puntatore, se nella funzione si aspetta una variabile potrebbe fare un cast implicito, quindi senza dare errore, ma stamparti l'indirizzo della variabile invece del valore.
Dovrebbe darti comunque un warning in compilazione.

Occhio quando si usano puntatori perchè fanno incappare in un sacco di problemi se non li si conosce bene.

ciao... il metodo c_str() ritorna il puntatore della stringa, diciamo, contenuta nel tuo oggetto String...attenzione che se l'oggetto String, come penso nel tuo caso, è locale viene distrutto appena esci dal contesto che contiene tale oggetto...non so a quel punto cosa possa succedere al puntatore.

PS: che poi non ho capito...già String sarebbe meglio non usarla in arduino...poi tu gli dai un "valore" fisso...usa direttamente un array di char.

Ciao, alla fine ho cambiato libreria ( ho seguito questa guida: Tweaking4All.com - Arduino Ethernet - Pushing data to a (PHP) server ) e sembra funzionare.

Il codice funzionante è:

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);


#include <UIPEthernet.h> // Used for Ethernet
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };

EthernetClient client;
char server[] = "dominio.server.it";
int  interval = 10000;

void setup() {

  Serial.begin(9600);

  Ethernet.begin(mac);
  
  dht.begin();

  Serial.print("IP Address        : ");
  Serial.println(Ethernet.localIP());
  Serial.print("Subnet Mask       : ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("Default Gateway IP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("DNS Server IP     : ");
  Serial.println(Ethernet.dnsServerIP());
}

void loop() {  
    // if you get a connection, report back via serial:
    if (client.connect(server, 80)) {
      Serial.println("-> Connected");
  
        float h = dht.readHumidity();
        float t = dht.readTemperature();
      
        if (isnan(h) || isnan(t)) {
          Serial.println(F("Failed to read from DHT sensor!"));
          return;
        }
      
      // Make a HTTP request:
      client.print( "GET /arduino/add.php?");
      client.print("temp=");
      client.print( t );
      client.print("&&");
      client.print("umid=");
      client.print( h );
      client.println( " HTTP/1.1");
      client.print( "Host: " );
      client.println(server);
      client.println( "Connection: close" );
      client.println();
      client.println();
      client.stop();
    }
    else {
      // you didn't get a connection to the server:
      Serial.println("--> connection failed/n");
    }
delay(interval);
}

Questo codice funziona perfettamente ma se aumento l’intervallo smette di funzionare. Ho fatto un po’ di prove e mi sembra che funzioni solamente se mantengo l’intervallo dei 10 secondi (che comunque non sono precisissimi, mi pare di aver capito che a quei 10 secondi si sommi il tempo di lettura dei sensori).

Io avrei bisogno di avere intervalli di almeno qualche minuto, mi sapete dire dove sto sbagliando?

ps. Il tutorial che ho linkato qui sopra suggerisce un sistema per aumentare il tempo dell’intervallo ( if ( CurrentMillis < PreviousMillis ) ecc…), l’ho provato, non da alcun errore ma non funziona.

Grazie mille dell’aiuto

Io nel mio programma faccio una String così: (devo ringraziare Black_Dragon che me lo ha detto lui…)

strURL = "GET /memorizzadati.php?serialnumber=";
  strURL += serialnumber;
  strURL += "&T=";
  strURL += T;
  strURL += "&RH=";
  strURL += RH;
  strURL += "&dp=";
  strURL += dp;
  strURL += "&DPset=";
eccetera eccetera......

Poi per l’intervallo gli hai messo che è int, quindi non più di 32 secondi (32.760, cioè 2 byte). Se vuoi di più devi fare una long oppure inserisci direttamente l’intervallo in cifre nel delay (), senza passare dalla variabile.
Ti ricordo che con delay, però, fermi il programma, letture comprese…