Home
Accesso / Registrazione
 di 

FTPmicro Tutorial - Esempio pratico

FTPmicro Tutorial - Esempio pratico

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.

Tutta la documentazione su FTPmicro è disponibile a questa pagina FTPmicro per Utenti Premium.
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

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di gio nazza

ftp micro con adobe flash

Salve stavo pensando di utilizzare ftmicro come interfaccia di I/O con il mondo esterno, mentre su un Pc installo Adobe Flash che comunica tramite tcp/ip con dei file CGI
eSEMPIO: Collegando un input digitale nel ftmicro attivo un azione su flash, oppure pulsante virtuale da flash attivo un out dal ftmicro. Può essere fattibile? Mi spiegheresti come interagire con flash, con un tipico esempio led on led off tramite un pulsante di flash grazie
Gio Nazza

ritratto di Marco Sambin

Ciao, dove è il software in

Ciao,
dove è il software in allegato di FTPMicro? non mi funziona il link, puoi mandarmelo via mail?

Grazie...

ritratto di Emanuele

Documentazione FTPmicro

Il link funziona perfettamente, forse non sei loggato?

ritratto di cchechio

ping FTPmicro

FTPmicro accetta il ping?

non riesco a pingare ilmio FTPmicro.

ritratto di Daniele82

Info

E' possibile effettuare anche misure di tensione, corrente e frequenza delle normali linee elettriche? Non sono pratico e vorrei sapere se è fattibile. Grazie

ritratto di Emanuele

Ciao Daniele82

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 :)

ritratto di Daniele82

Grazie per la risposta :) Un

Grazie per la risposta :) Un altra cosa, cosa è un LEM? Per i valori di tensione e corrente non è un problema, posso ridurli con un trasformatore Down (mi è venuta questa come prima cosa, ma ci sono altre soluzioni). Potresti indicarmi della documentazione utile allo sviluppo della board? Grazie ancora

ritratto di Emanuele

LEM e trasduttori

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

ritratto di trippus

Buon giorno a tutti, mi chiamo Stefano, sto provando FTPMicro

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

ritratto di Emanuele

Io utilizzo una sd da 1G formattata normalmente in FAT, senza p

Io utilizzo una sd da 1G formattata normalmente in FAT, senza problemi

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 1 utente e 50 visitatori collegati.

Utenti online

Ultimi Commenti