Salve a tutti! Sto cercando di implementare nel mio progetto un lettore di feed RSS dal corriere della sera. Per ora ho provato il seguente codice che però visualizza solo i primi due tag.
#include <LiquidCrystal.h>
#include <Ethernet.h>
#include <SPI.h>
EthernetClient client;
LiquidCrystal lcd(30,29,28,27,26,25);
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(89, 31, 55, 103 ); // corriere
//char worrd[32];
char target[7] = { '<', 't', 'i', 't', 'l', 'e', '>' };
char tolcd[80];
int counter = 0;
int lcdcount = 0;
int count = 0;
int foundcount = 0;
int linecount = 0;
boolean worded = true;
//boolean taketext = false;
boolean tag = false;
//int ledPin = 13;
void setup()
{
Ethernet.begin(mac);
Serial.begin(9600);
// pinMode(1, OUTPUT);
delay(1000);
// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(0,0);
lcd.print("connecting…");
Serial.println("connecting…");
if (client.connect(server,80)) {
// Print a message to the LCD.
lcd.clear();
Serial.println("connected");
delay(1000);
lcd.print("connected.");
delay(1000);
client.println("GET http://xml.corriereobjects.it/rss/homepage.xml HTTP/1.0");
client.println();
} else {
Serial.println("connection failed");
lcd.print("connection failed.");
}
}
void loop()
{
// lcd.clear();
if (client.available()) {
//only works if xml is formatted with line breaks
/* while(linecount < 2){
char c = client.read();
if (c == 10){linecount++;}}*/
char c = client.read();
if(c == '<'){
for(int i=0; i<7; i++){
// Serial.print(c);
if(c != target[i]){ worded=false; }
c = client.read();
if(i==6 && worded==true){
//STUFF TO DO AFTER TITLE TAG GOES HERE
for(int i=0; i<80; i++){
tolcd[i]=' ';}
//Serial.print(c);
while(tag==false){
if(c=='<'){tag=true;}
tolcd[lcdcount]=c;
lcdcount++;
//Serial.print(c);
c = client.read();
}
for(int i=0; i<16; i++){
tolcd[lcdcount-1]=(' ');
lcdcount++;
}
Serial.print(lcdcount);
for(int p=0; p<(lcdcount-16); p++){
char dispchar = tolcd[p];
Serial.print(dispchar);
for(int i=0; i<16; i++){
lcd.setCursor(0, 0);
lcd.print("Headlines:");
char displaychar = tolcd[(i+counter)%lcdcount];
lcd.setCursor(i,1);
lcd.print(displaychar);
}
if(p==0){delay(1000);}
counter++;
delay(120);
}
counter=0;
lcdcount=0;
if(tag==true){tag=false; Serial.println(" ");}
}
}
}
if(worded==false){worded=true;}
}
}
Come posso fare in modo che mi scriva anche i successivi?Grazie
Tanto per cominciare questo è un post da Software, non da Generale...
Prossima volta, prima di postare il codice fai Strumenti -> Formattazione Automatica, anzi prova a farlo ora e vedrai che differenza!
Sinceramente non vedo nessun limite al numero di RSS che vengono presentati, tutti i tag presenti nella pagine vengono stampati
edit: prova a stampare quello che ti arriva dalla client.read() su seriale e postarlo qui.
metti una Serial.println("TITOLO TROVATO").. mi aspeto che i titoli sono riconosciuti... in teoria scorrono tutti sul'LCD ad un secondo tra una pagina e l'altra
Ecco cosa ottengo su seriale ad intervalli di un secondo:
connectingâ?¦
connected
TITOLO TROVATO
28Corriere.it
TITOLO TROVATO
57Corriere della Sera on line versione rss
TITOLO TROVATO
22
TITOLO TROVATO
22
TITOLO TROVATO
22
TITOLO TROVATO
22
quindi come puoi vedere lui trova più di 2 titoli, e ogni TITOLO TROVATO corrisponde alla stampa su LCD di un titolo RSS, confermi? quindi qual'è la richiesta?
forse ho capito.
lui ti mostra solo i titoli "corriere.it" e "corriere della sera on-line blablabla..."
allora in tal caso il problema è
if(c=='<'){
tag=true;
}
in pratica lui smette di leggere il titolo appena trova il carattere '<' dando per scontato che sia il , ma come vedi i titoli successivi a quelli stampati sono all'iterno di un tag <>
esempio:
<![CDATA[Corte dei Conti: «La corruzione pregiudica la nostra economia»]]>
ora, al posto che uscire se trovi "<", devi uscire solo se trovi "", con la stessalogica che usi per entrare quando trovi "".. ovvio che togliere quell'if non ha senso, ti troveresti in un loop infinito, per un test veloce cambia '<' in '>', vedrai qualche carattere strano ma almeno sapremo di aver centrato il problema.
connectingâ?¦
connected
TITOLO TROVATO
35Corriere.it</title
TITOLO TROVATO
64Corriere della Sera on line versione rss</title
TITOLO TROVATO
85
<![CDATA[La restituzione dell'Imu attira il 4% degli indecisi]]
TITOLO TROVATO
101
<![CDATA[Isole Salomone, tsunami sui villaggi Il Giappone dirama l'allertaÌ e
Altra modifica necessaria per vedere correttamente i tag è questa:
Riprendo il discorso sul feed rss perchè è sorto un altro problemino. Integrandolo nel mio progetto (che presenta su un lcd temperatura,ora e data,sveglia e regolazione di queste ultime) noto una lentezza eccessiva nel recuperare i dati dal sito. Può servire far memorizzare ad arduino il sito xml su microsd e quindi fare la ricerca dei titoli ? Qualche suggerimento?Grazie.
Scusatemi Ho apportato una modifica alla funzione per attivare la retroilluminazione dell'lcd via fotoresistenza.Ho usato millis() anzichè delay().Ciao!