io ed i miei compagni stiamo portando avanti un progettino di Arduino con un lettore RFID per gestire le entrate e le uscite da una porta tramite un Database.
Il nostro codice funziona per quanto riguarda l'acquisizione del codice del Badge RFID (compresa conversione da Byte a Stringa), ed il collegamento al Database MySQL avviene con successo.
Il problema è il seguente: come faccio ad inviare questo codice (una stringa) al Database, compresi i dovuti controlli (Es: se la persona sta entrando o uscendo a seconda del suo ultimo stato, che può essere 0, DENTRO, oppure 1, FUORI)?
Devo passare per una pagina PHP? Se si come faccio?
Grazie mille delle risposte, se vi servono altre informazioni o il codice basta chiedere.
Quale Arduino, la uno?
Chi si collega al database, Arduino? Con quale libreria?
Se sei collegato al db, ci saranno istruzioni dentro alla libreria che permettono di aprire una tabella e di aggiungere record e scriverci.
A parte la tipologia di Arduino, è Arduino stesso che si connette al DB?
Per un progetto simile, ad Arduino faccio inviare solo una stringa di GET ad una pagina PHP che ascolta e legge i dati sul db, una volta paragonati i dati "vecchi" con quelli nuovi inviati da Arduino li salva nel DB.
In questa maniera la mole di lavoro che Arduino deve svolgere è ridotta al minimo.
Se usi la libreria di MySQL per Arduino devi fare dei controlli (if-else) sui valori precedentemente caricati nel DB e paragonarli con quelli che Arduino sta misurando al momento.
nid69ita:
Scrivi "...stringa di GET ad una pagina PHP che ascolta..."
Ma se c'e' una pagina PHP, c'e' un server con un interprete php, quindi un PC di mezzo o sbaglio?
Dici a me? @GianV ha parlato di PHP
GianV:
...
il collegamento al Database MySQL avviene con successo.
...
Devo passare per una pagina PHP? Se si come faccio?
...
Quindi immagino che se ha un database MySQL, con molta probabilità (non è scontato) ha anche un interprete PHP e sicuramente ha un elaboratore dove gira MySQL. Arduino che invia i dati a PHP mi sembra la soluzione migliore se si è in possesso di un server AMP.
Ora c'è da capire se @GianV conosce PHP e questo va domandato a lui
La domanda è a @GianV
perchè secondo me non si capisce se stà lavorando con solo Arduino o si appoggia a un server anche Web (di sicuro ha un pc con MySQL).
Poi lui chiede se è necessario usare PHP, ma non afferma che stà usando PHP perciò non si capisce quale HW usa.
Utilizzo Arduino UNO Rev 3, lo connetto tramite una Shield Ethernet alla rete della scuola, di conseguenza comunico con il Server Web con MySQL.
PHP lo conosco, o meglio, ho molti aiuti per quanto riguarda quel tipo di programmazione, ma volevo capire se fosse possibile inviare il mio dato, acquisito tramite Shield RFID (il sensore è un ID12 Innovation), direttamente al Database, o se per farlo devo per forza inviare prima il dato ad una pagina PHP, per poi farlo acquisire dal Database.
Ricordo che devo anche fare un controllo sul codice: se questo compare un numero PARI di volte, allora la persona a cui è associato il codice è considerata "Fuori dall'edificio", se il numero di volte che il codice compare, invece, è DISPARI, la persona è considerata "Dentro l'edificio".
E' una cosa un pò contorta, ed ora sono un pò di fretta, appena possibile tanto per cominciare vi metto il codice, e cerco di spiegarmi meglio, grazie ancora per la pazienza.
Non ho mai provato quella libreria.
Teoricamente (visto che dicono funzioni) devi avere una tabella del database e poi con la my_conn.cmd_query()
mandi una stringa SQL (anzi un comando) al db.
Per aggiungere record si usa INSERT INTO. Conosci i comandi SQL ?
La cosa complicata in Arduino può essere formattare la stringa con il tuo dato.
Tipo:
Ma qui abbiamo scritto solo due frasi fisse (naturalmente campo1 deve essere di tipo carattere e lungo abbastanza, campo 2 numerico)
puoi usare la sprintf per formattare la stringa:
char buf[100]; // buffer molto grande attenzione a non esaurire la memoria
num=123;
frase[]="prova";
sprintf(buf, "INSERT INTO miatabella (campo1,campo2) VALUES ('%s', %d)",frase,num);
my_conn.cmd_query(buf);
Si, conosco SQL piuttosto bene, per l'appunto però non riesco a mandare questa variabile "codice", ma solamente stringhe di valore costante...
La conversione del codice da Byte a Stringa l'ho fatta senza troppe difficoltà, quindi non è un problema.
Più che altro a questo punto mi interesserebbe capire, se qualcuno ha mai usato queste librerie, come faccio a inviare la mia variabile "Codice" di tipo Stringa, e se è possibile lanciare una Procedura SQL da Arduino ogni volta che inserisco un dato, appunto per controllare quante volte è già stato inserito e capire se la persona a cui è associato il codice è da considerare dentro o fuori.
Domani vi posto il codice tutto commentato e vediamo di fare chiarezza.
Ma scusa, te l'ho scritto sopra, usi la sprintf.
E' come la printf() ma "scrive" dentro a una stringa (vettore di char, NON l'oggetto String)
char buf[100]; // buffer molto grande attenzione a non esaurire la memoria
sprintf(buf, "INSERT INTO miatabella (campo1) VALUES ('%s')",codice);
my_conn.cmd_query(buf);
Grazie, ho capito cosa intendi, il problema adesso è che il programma si schianta quando esegue la Sprintf. Penso sia un problema legato al tipo di dato che voglio mettere nella stringa, che è dichiarato di tipo Stringa.
ma non funziona, il programma si blocca (se invece tolgo la riga della sprintf dal codice funziona come sempre.).
EDIT: Ci sono riuscito, grazie, bastava trasformare stringComplete in tipo Char, roba di due secondi... Ho fatto un passo importante, grazie mille. Riutilizzerò il thread per possibili dubbi futuri.
Può anche essere un problema di memoria che si esaurisce. Questi micro ne hanno poca.
Non credo che la lettura da un oggetto String lo riesca a fare. Anche mettendo un cast (char*)stringComplete nella sprintf non mi funziona
Puoi passare da un vettore di caratteri ulteriore usando string.toCharArray(buf, len);
String stringComplete;
char Query[100];
char buf[21]; // non so se bastano 20 char per la dimensione, vedi tu
stringComplete.toCharArray(buf,20);
sprintf(Query, "INSERT INTO Database.Table (Campo) VALUES ('%s')",buf);
Sì ma sinceramente avevo avuto problemi con i files.
Magari riprovo a riscaricare tutto (perchè appunto per la libreria mysql non trovo uno .zip pronto all'uso) e guardarci più attentamente che magari trovo l'errore
Personalmente sfrutterei una pagina in PHP per dialogare con il Db, questo mi permette di rendere più sicuro il server negando connessioni dirette dall'esterno al database!