Analizziamo ora un semplice esempio per il monitoraggio in tempo reale della temperatura, sfruttando il sensore a bordo di FTPMicro, e l'azionamento di due LED, tramite una pagina HTML ed una CGI.
Nell'esempio viene utilizzato AHAH (Asynchronous HTTP And HTML), il quale
ci permette di inviare richieste HTTP in modo asincrono, ovvero senza dover ricaricare la pagina.
Il file CGI che utilizzeremo (status.cgi) è molto semplice; è costituito da codice html per realizzare una tabellina, all'interno della quale verranno scritti lo stato dei LED e la temperatura di sistema.
<table class="status_table"> <tr><th colspan="2">Temperature</th></tr> <tr><td>System</td><td>%00°C</td></tr> <tr><th colspan="2">LED Status</th></tr> <tr><td>LED 1</td><td>%01</td></tr> <tr><td>LED 2</td><td>%02</td></tr> </table>
Come si può notare, le variabili utilizzate sono:
- 00: la temperatura;
- 01: il primo LED
- 02: il secondo LED
Quindi questa pagina sarà richiesta periodicamente per conoscere lo stato del sistema.
Ora esaminiamo la pagina principale (index.htm), la quale fondamentalmente conterrà due pulsanti per modificare lo stato dei LED, ed ingloberà, grazie ad AHAH, la pagina CGI.
<html> <head> <title>FTPMicro: Temperature Example</title> <script type="text/javascript" src="/ahah.js"></script> <script type="text/javascript"> function refresh() { if (lo) return true; // interrompe il caricamento se c'è già un altro caricamento in corso (causa pulsanti) noloadAHAH('/Status.cgi','tempdiv','GET'); // richiede la pagina status.cgi e la carica nel div "tempdiv" } window.setInterval("refresh()",2000); </script> <link rel="stylesheet" type="text/css" media="all" href="/style.css" /> </head> <body> <h1>FTPMicro</h1> <div class="bar"> The world smallest WebServer and FtpClient with DHCP and UDP features </div> <div id="tempdiv" class="left"> Loading... </div> <div class="left"> <form> <table class="status_table"> <tr><th>LED Toggle</th></tr> <tr><td><input type="submit" value="LED 1" onclick="javascript: noloadAHAH('/Status.cgi?t=1','tempdiv','GET'); return false;"></td></tr> <tr><td><input type="submit" value="LED 2" onclick="javascript: noloadAHAH('/Status.cgi?t=2','tempdiv','GET'); return false;"></td></tr> </table> </form> </div> </body> </html>
Come si può notare, la pagina è piuttosto semplice; la cosa che potrebbe risultare un po' criptica, però, è l'utilizzo di AHAH.
Innanzitutto, nell'header della pagina, si trova un breve script Javascript, che attraverso la funzione setInterval, ci permette di visualizzare lo stato ad intervalli regolari richiamando la pagina CGI. Quest'ultima verrà caricata all'interno del div che ha come id "tempdiv".
L'altra sezione di rilievo, è quella che riguarda i pulsanti. Anch'essi ricorrono ad AHAH per inviare comandi senza dover ricaricare la pagina.
In questo esempio, viene utilizzato il parametro "t" il cui valore corrisponde al LED su cui agire, quindi /Status.cgi?t=1 sarà il comando da inviare per il primo LED, e /Status.cgi?t=2 per il secondo. Dopo l'esecuzione del comando verrà restituita la pagina richiesta (status.cgi) che verrà sempre caricata all'interno del suo div.
Nell'esempio viene anche utilizzato un file css, ma esso serve soltanto per definire lo stile della pagina.
A questo punto, analizziamo l'implementazione dei metodi ProcessIO, HTTPExecCmd e HTTPGetVar; ecco il primo:
static char Temperature[8]; static void ProcessIO(void) { signed long temp; // Start A/D conversion ADCON0bits.GO = 1; // Wait until A/D conversion is done while(ADCON0bits.GO); temp = (long)(*(WORD*)(&ADRESL)) * 322 - 50000; // conversione approssimativa... itoa(temp/1000, Temperature); }
Tale metodo viene invocato ciclicamente, "appena possibile", ovvero quando lo stack non sta svolgendo le sue funzioni. In questo esempio, effettua la lettura della tensione d'uscita del sensore di temperatura, e la successiva conversione in stringa.
#define VAR_TEMPERATURE (0x00) #define VAR_LED1 (0x01) #define VAR_LED2 (0x02) #define CMD_LED1 (0x1) #define CMD_LED2 (0x2)
Queste define sono utili per identificare variabili CGI e comandi.
void HTTPExecCmd(BYTE** argv, BYTE argc) { if (argv[1][0] == 't') { switch (argv[2][0] - '0') { case CMD_LED1 : LED1_IO = !LED1_IO; break; case CMD_LED2 : LED2_IO = !LED2_IO; break; } } }
Come visto prima, i possibili comandi che inviamo sono del tipo "status.cgi?t=x" dove x rappresenta il led a cui applicare il comando. Con questo comando, quando verrà invocato il metodo HTTPExecCmd, l'argomento argv, conterrà al primo posto la stringa "status.cgi" che rimarrà invariata; il secondo elemento sarà "t" (e ci assicureremo che sia così); il terzo conterrà il numero relativo al LED ma sottoforma di carattere ASCII, perciò dovremo convertirlo in intero, sottraendovi il carattere '0'.
WORD HTTPGetVar(BYTE var, WORD ref, BYTE* val) { switch (var) { case VAR_LED1 : *val = LED1_IO ? '1' : '0'; break; case VAR_LED2 : *val = LED2_IO ? '1' : '0'; break; case VAR_TEMPERATURE: *val = Temperature[(BYTE)ref]; if(Temperature[(BYTE)ref] == '\0') return HTTP_END_OF_VAR; else if(Temperature[(BYTE)++ref] == '\0' ) return HTTP_END_OF_VAR; return ref; default : break; } return HTTP_END_OF_VAR; }
Infine il metodo HTTPGetVar restituisce lo stato corrente dei LED, oppure la stringa Temperature; Nel primo caso è sufficiente assegnare a *val il carattere corrispondente allo stato del led (0 o 1), mentre nel secondo caso, trattandosi di una stringa, è necessario restituire un byte alla volta facendo riferimento al valore di ref.
Nel codice si fa riferimento alle definizioni LEDx_IO, le quali si trovano nel file Compiler.h:
#define LED1_IO (LATAbits.LATA0) #define LED1_TRIS (TRISAbits.TRISA0) #define LED2_IO (LATAbits.LATA1) #define LED2_TRIS (TRISAbits.TRISA1)
In questo caso vengono utilizzati i LED legati al modulo Ethernet, perchè già presenti nella scheda, ma modificando tali definizioni si possono impiegare due pin generici.
Potete realizzarlo da soli (fai-da-te) scaricando tutti i codici sorgenti (Schema elettrico realizzato con Orcad, lista parti, circuito stampato realizzato con Orcad, file gerber, codice sorgente assembler realizzato su piattaforma Microchip).
Il progetto montato e collaudato è disponibile sul nostro store --> FTPmicro
Il link funziona perfettamente, forse non sei loggato?
FTPmicro accetta il ping?
non riesco a pingare ilmio FTPmicro.
Lem è una azienda che fa trasduttori. Interfaccie tra le 230Vac di rete ed i 5V del microcontrollore.
Puoi usare anche un trasformatore, ma poi devi inserire un po di elettronica per avere un segnale pulito (praticamente quello che fa la LEM in alcuni dei suoi componenti miniaturizzati)
Tutta la documentazione di FTPmicro è disponibile qui nel blog
http://it.emcelettronica.com/elettronica/etichette/ftpmicro
Ciao Daniele82,
FTPmicro è dotato di ADconverter a bordo, quindi puoi effettuare tutte le misure di tensione e corrente che vuoi, MA DEVI INTERFACCIARLO con un dispositivo di potenza (ad esempio LEM) anche per la misura di frequenza vale lo stesso, inoltre è dotato del capture compare per misure in frequenza di precisione.
FTPmicro lavora a 5V come scheda e 3.3V il microcontrollore, non puoi quindi collegarlo direttamente alla tensione di rete delle normali linee elettriche 🙂
Buon giorno a tutti, mi chiamo Stefano,
sto provando FTPMicro con sw FTPMicro_1v01.
Il mio scopo è quello di fare un controllo remoto via internet.
Non ho capito come si fa a formattare la sd con fat16 e settori di 512 byte nel senso che cioò limiterebbe molto la capacità.
Mi spiego meglio: utilizzando windows xp, strumenti di amministrazione, gestione disco, formatta non risulta essere possibile formattare nemmeno sd da 64MB.
Credo che il limite massimo sia di 32mb.
Grazie per l’attenzione
Stefano
Io utilizzo una sd da 1G formattata normalmente in FAT, senza problemi