Come prelevare un dato dal database via ethernet

Salve a tutti,
ho un problema non riesco a prelevare un dato dal database (tempo di campionamento) e inviarlo ad arduino che
comunica via ethernet.
Questo perchè ho un sensore di temperatura e invio in base al tempo di campionamento
i dati della temperatura al database. Arduino è munito di un modulo ethernet che mi permette di interfacciarmi
con il database. Qualcuno sa come prelevare il tempo di campionamento che ho definito in un altra tabella
diversa da dove inserisco i dati?
Ciao e Grazie a tutti

ciao,

ho un problema non riesco a prelevare un dato dal database (tempo di campionamento) e inviarlo ad arduino che
comunica via ethernet.

puoi spiegare il tuo problema?
Hai già scritto del codice?
Che Arduino usi? Shield Eth?

Questo perchè ho un sensore di temperatura e invio in base al tempo di campionamento
i dati della temperatura al database.

immagino quindi tu stia usando Arduino come webclient.

Qualcuno sa come prelevare il tempo di campionamento che ho definito in un altra tabella
diversa da dove inserisco i dati?

presupponendo tu abbia un apache2 + php + mysql (o analogo), avrai uno script php che interpreta le get/post di Arduino.
Questo script php è quello che si occupa poi di gestire le query al db relazionale.

Lato Arduino, per recuperare il dato relativamente alla frequenza di campionamento, farai una get specifica.
Per passare il dato recuperato dal sensore di temperatura, ne farai un'altra.

Uso arduino duemilanove (ATMEGA328) con arduino 0018.
il programma è questo:

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 103 };
byte server[] = { 192, 168, 1, 4 };

Client client(server, 80);
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);

delay(1000);

Serial.println("connecting...");

}

void loop()
{
float volt;
float temp;
int ID = 01;
int tempo_campionamento;

volt = (analogRead(0)0.0048828125);
temp = (((volt
289.15)/2.89)-273.15);

Serial.print("valore tensione uscita A(0)= ");
Serial.print(volt);
Serial.print("\n");
Serial.print("temperatura in gradi C = ");
Serial.print(temp);
Serial.print("\n");
if(volt>3)
Serial.print("Allarme temperatura troppo alta");

if(client.connect()){
Serial.println("connected");
client.print("GET /impostazioni.php?");
client.print("&sensoreID=");
client.print(ID);
client.println("HTTP/1.0");
client.println();
client.print("\n");
tempo_campionamento = client.read();
client.stop();

Serial.print(tempo_campionamento);
delay(tempo_campionamento);
}
for(int i=0;i<5;i++)
{
if (client.connect()) {
Serial.println("connected");
client.print("GET /data.php?");
client.print("&sensoreID=");
client.print(ID);
client.print("&valore=");
client.print(volt);
client.print("&temperatura=");
client.print(temp);
if(volt>2.88){
client.print("&allarme=");
client.print(1);
}
else {
client.print("&allarme=");
client.print(0);
}

client.println(" HTTP/1.0");
client.println();
client.print("\n");
client.stop();

}
else {
Serial.println("\n connection failed");
}
}

while (client.available()) {
char c = client.read();
Serial.print(c);
}

if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
delay(tempo_campionamento);
}

Utilizzo arduino come webClient.
Io utilizzo xampp con phpmyadmin, ho creato un database con due tabelle:
Una dove gli passo i valori della temperatura, data..
L'altra dove ho inserito il tempo di campionamento che dovrei prelevare ed inviarla ad arduino.
Quindi il mio problema sta nel tirare fuori il tempo do campionamento e passarlo ad arduino.
Ho provato con client.read() ma non mi funziona.
Grazie per la collaborazione

Ciao

  1. prova a postare anche il codice PHP che utilizzi per interfacciarti con MySQL
  2. se la stessa chiamata alle pagine PHP la fai da un browser invece che da Arduino funziona? Sul browser vedi visualizzato il dato che ti aspetti?

bye

Ora vi posto il programma in php:

<?php //http://localhost/impostazioni.php?sensoreID=01 $db=mysql_connect("localhost","root"); mysql_select_db("temperatura",$db); $sql="SELECT * FROM impostazioni WHERE sensoreID='".$_GET['sensoreID']."'"; //è la query SQL che prede l impostazione $res=mysql_query($sql); echo mysql_error(); $riga=mysql_fetch_array($res); $tempo = $riga['tempo_campionamento']; //stampa il tempo campionamento print_r($tempo); ?>

quando faccio la chiamata nel browser visualizzo la variabile del tempo di campionamento che voglio prelevare, però non riesco
ad inviarlo ad arduino.
Grazie per la collaborazione

..risposta veloce (ora ho guardato SOLO la prima parte del codice, quella che si occupa di recuperare apputno l'informazione relativa alìintervallo di campionamento).

Innanzitutto, non so se voluto o meno, ma con questo codice ad ogni loop vai a fare una get sul tuo script php per ottenere tale dato.
Ti converrebbe inizializzare la variabile tempo_campionamento = 0 (nel setup), e far eseguire la get solo in caso sia appunto = 0.
Oppure definire qualche contatore ed effettuare la get solo a cadenze regolari (N*tempo_campionamento, per es.)

Poi, tu scrivi:

tempo_campionamento = client.read();
client.stop();

..ma ti basta guardare agli esempi nell'IDE (appropos, perchè non utilizzi lo 0023, oppure l' 1.0?)

// if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

per capire che già nella lettura della risposta del server ci può essere qualche problema.

Il loop con la get per il tempo di campionamento è fatto apposta in modo che in qualsiasi istante posso cambiare il tempo
di campionamento.
Per la versione di arduino ho provato la 1.0 e non mi funziona, mi da errori che non sono capace di rimediare,
la 0023 va bene.
Per quanto riguarda questo:
while (client.available()) {
char c = client.read();
Serial.print(c);
}
l'ho preso dal IDE del webclient, però purtroppo non entra mai in questo ciclo. Se invece tolgo il ciclo while(client.avaible())
in uscita dalla seriale mi dà la variabile c = -1.
Grazie

ciao

un possibile problema che ho notato è che manca lo spazio bianco tra l'URL e il protocollo "HTTP/1.0", come invece è se guardi l'esempio:

Ad es.

client.print("GET /impostazioni.php?");
client.print("&sensoreID=");
client.print(ID);
client.println("HTTP/1.0");

l'ultima riga dovrebbe essere client.println(" HTTP/1.0");

fammi sapere

Ciao ragazzi,
Ho fatto delle modifiche:
la prima quella di mettere lo spazio tra l'URL e il protocollo " HTTP/1.0";
la seconda è stata quella di eliminare i client.stop() nei due cicli.
Però un altro problema:
Ricevo il dato via ethernet lo vedo bene solo se lo imposto come char, mentre se lo metto int vedo numeri aleatori, nonostante nel database
sia impostato come int.
Grazie per la vostra collaborazione

Ciao

è normale... tu NON ricevi in realtà un INT ma ricevi un CHAR* che "rappresenta" un numero...
Se vuoi convertire la stringa che ricevi in una variabile INT (es. per operazioni matematiche) devi usare la funzione atoi(),

ecco ad esempio un thread nel forum:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1176289764

Ho provato con atoi, se la sintassa è esatta :
while (client.available()) {
char c = client.read();
Serial.print(c);
char * thisChar = &c;
int tempo_campionamento = atoi(thisChar);
Serial.print(tempo_campionamento);
delay(tempo_campionamento);
}

char c = 10000 me lo converte in int ma mi da tutti numeri a caso, perchè?

legacy:

char c = 10000 me lo converte in int ma mi da tutti numeri a caso, perchè?

Perche' in un unsigned char i valori vanno da 0 a 255 in decimale, estremi compresi, hai solo 8 bit, e se tenti di forzare un casting di un valore decimale 1000 in un char prendi soltanto i primi 8 bit di quel numero.

Aspetta. Lui usa il tipo "char", che è limitato a -128/+127, tu parli dell'unsigned char, che è il tipo byte.

Ma non c'è bisogno di fare un define per l'unsigned char, c'è già un alias bello pronto: byte. :wink:
E secondo me è anche più intuitivo perché quando io penso ad un byte già mi prefiguro un valore che parte da 0 e finisce a 255.

è sbagliata la modalità con cui leggi la risposta dal server... se leggi un carattere alla volta con client.read() devi "accodare" questi caratteri in una stringa e poi alla fine convertire l'intera stringa con atoi().

Guarda come legge i dati nella variabile inString[] in questo esempio e se non ti è chiaro chiedi pure:
http://bildr.org/2011/06/arduino-ethernet-client/

bye