Leggere i Feed RSS senza PC tramite il solo utilizzo di FTPmicro(8x2)cm ed un comune display 16x2. Ovviamente è necessaria una connesione internet tramite ethernet.
Introduzione su come leggere i feed rss senza pc
In questo articolo vedremo un altro esempio pratico sull'utilizzo di FTPMicro e dello stack TCP/IP di Microchip.
In particolare verrà utilizzato il client TCP per visualizzare in un display LCD le più recenti notizie, direttamente dal sito dell''ANSA.
Se ti interessa FTPmicro montato e collaudato puoi trovarlo nel nostro negozio online
Hardware
L'hardware è costituito semplicemente da FTPMicro e da un display LCD alfanumerico Hitachi-compatibile.
I collegamenti tra questi due elementi sono configurabili a piacimentodal file HardwareProfile.h, nella sezione dedicata ad FTPMicro
(#elif defined(FTPMICRO)):
#define LCD_DATA_TRIS(TRISE)
#define LCD_DATA_IO(LATE)
#define LCD_RD_WR_TRIS(TRISBbits.TRISB5)
#define LCD_RD_WR_IO(LATBbits.LATB5)
#define LCD_RS_TRIS(TRISFbits.TRISF6)
#define LCD_RS_IO(LATFbits.LATF6)
#define LCD_E_TRIS(TRISFbits.TRISF5)
#define LCD_E_IO(LATFbits.LATF5)
Il software originale prevede soltanto display del tipo 16x2, ma il codice qui presentatoè stato modificato per supportare anche LCD 20x4;
per questo è presente la definizione di LCD_MODE_20x4 nel fileLCDBlocking.h.
RSS
Per leggere le notizie ANSA, FTPMicro non va di certo a consultare le pagine web, ma si affida
ad un feed RSS: si tratta un file XML,costantemente aggiornato, che contiene soltanto dati essenziali come titolo, testo, data, ecc.
Vediamo uno stralcio di questo file:
<item><title>Miss Italia 2007 e'' Silvia Battisti</title><description>E'' arrivata alle finali con la fascia di Miss Veneto</description><link>http://www.ansa.it/site/notizie/awnplus/topnews/news/2007-09-25_125104380.html</link><copyright>Copyright ANSA Tutti i diritti riservati</copyright><pubDate>2007-09-25 01:08</pubDate></item>
Ciò che ci interessa è il titolo della notizia, che verrà visualizzato sul display.
Quindi, il cuore del programma è costituito da un parser che analizza il file e ne estrapola soltanto i titoli.
GenericTCPClient
Lo stack comprende un file chiamato GenericTCPClient, il quale contiene unesempio pronto all''uso di client HTTP.
Vediamo come funziona il parser:
- E'' presente un buffer dove vengono salvate 4 o 8 notizie (a seconda del display),per il quale è stato riservato un banco di RAM nello script del linker.
- Nella sezione SM_PROCESS_RESPONSE, viene esaminato il file, e quindi salvatenel buffer le notizie a partire dalla numero t_count, fino al riempimento del buffer.
- Terminata l''analisi, si passa alla sezione SM_DONE dove: si ricomincia il processo se non è stataletta nessuna notizia (news_i = 0), oppure si passa a SM_DISPLAY.
- In quest''ultima, una notizia viene visualizzata ogni circa 5 secondi sul display.
In generale, vengono salvate NEWS_NUMBER notizie e visualizzate una alla volta,poi viene scaricato nuovamente il Feed e salvate le successive; raggiunta la fine del file, si ricomincia da capo.
Esaminiamo alcuni dettagli.
Dichiarazione della variabile che funge da buffer:
#pragma udata news_bufchar news[256];
#pragma udata
Il codice che costituisce il parser:
while(TCPGet(MySocket, &i))
switch(ParsingState){
case PS_HOME:
k = 0;
if (i == ''<'' && (news_i < NEWS_NUMBER))
ParsingState = PS_TAG;
break;
case PS_TAG:
if (i == ''>'') {
if (k == 5 && !memcmppgm2ram((char*)LCDText, "title", 5) && (t_cnt++ >= t_count)){
ParsingState = PS_TITLE;
}
else
ParsingState = PS_HOME;
k = 0;
break;
}
if (k < 5)
LCDText[k++] = i;
break;
case PS_TITLE:
if (i == ''<''){
if (k < NEWS_LEN) news[news_i*NEWS_LEN + k] = ''\\0''; ParsingState = PS_HOME;
news_i++;
break;
}
if (k < NEWS_LEN)
news[news_i*NEWS_LEN + k++] = i;
break;}
Si cerca il tag <title> e si salva il contenuto nel buffer, ma si saltano t_count titoli.
Visualizzazione:
case SM_DISPLAY:
if (TickGet() - Timer < 5*TICK_SECOND)
break;
memcpy((void*)LCDText, (void*)&news[k*NEWS_LEN], NEWS_LEN);
LCDUpdate();
k++;
Timer = TickGet();
if (k == news_i) {
if (news_i < NEWS_NUMBER)
t_count = 0;
else
t_count += NEWS_NUMBER;
t_cnt = 0;
news_i = 0;
GenericTCPExampleState = SM_HOME;
}
break;
In quest''ultima parte avviene la visualizzazione sull'LCD della notizia corrente; la variabile t_count, come già accennato,conta blocchi di NEWS_NUMBER notizie, mentre k la notizia nel buffer correntemente visualizzata.
Una volta visualizzate tutte le notizie in memoria, t_count viene incrementato di NEWS_NUMBER e quindi sitorna a SM_HOME, dove verrà riscaricato il Feed; se si è giunti alla fine del file, invece, t_count torna a zero.
Se ti interessa FTPmicro montato e collaudato puoi trovarlo nel nostro negozio online
Ciao Emanuele,
è possibile realizzare un sistema analogo costituito da più display ad esempio 10. Ognuno deve mostrare un valore univoco che gli viene fornito da un mio script in php tutto su interfaccia ethernet?
Ciao Seon,
si certo, è fattibile 🙂
mi dia il suo indirizzo email così da poterla contattare in privato grazie!
Puoi contattarmi direttamente tramite il CONTACT del mio profilo oppure su tutti i social network (FB, Linkedin etc.)
http://it.emcelettronica.com/emanuele