Agrégateur flux RSS

Envoyé par le 14 Oct 2015

Ce projet a été réalisé dans de cadre d’une validation du mooc « La fabrication numérique ».
Après avoir suivi la formation en ligne, j’ai conçu un projet d’agrégateur RSS avec Arduino.
Jeremy Sfez

Présentation du projet

Le dispositif récupère les informations sur le flux RSS de « Googles news ». Après avoir parsé le flux (bibliothèque « TextFinder »), il affiche le premier titre sur un l’écran LCD 2×16. Quand l’utilisateur appui sur le bouton, le titre suivant est affiché.

N’ayant pas à ma disposition de carte ethernet, le téléchargement du flux RSS est fait par script python. Le programme communique directement avec le dispositif sur le port série grâce la bibliothèque « serial ».

 

Présentation du dispositif

Photo du dispositif 1

Le dispositif attend le xml de google news

Photo du dispositif 2

Le dispositif affiche un des titres de l’actualité

 

Présentation de l’algorithme

Présentation de l'algorithme

Algorithme flux RSS

 

Matériel utilisé

  • 1 cartes Arduino Uno
  • 1 écran LCD 2×16
  • 1 breadboard
  • 1 bouton
  • 1 résistance de 560 Ohms
  • potentiomètre de 10 kOhms (pour régler le contraste de l’écran)
  • fils de connexions

 

Schéma du montage

Schéma flux RSS

Schéma du montage

 

Code Arduino
//Bibliothèques
#include <LiquidCrystal.h>
#include <TextFinder.h>

LiquidCrystal lcd(12, 11, 4, 5, 6, 7); //Variables pour ecran LCD
TextFinder finder(Serial); //Variables pour parser le XML
char actualite[5][320];
int nbrArticlesRecu;
int nbrArticlesMax=5;
int t[] = {0, 0, 0, 0, 0};
int tmp = 0;
int numArticle = 0;
int cursor = 0;
int nbrAppelAffichage = 0;
//Variables pour le bouton
const int buttonPin = 2;
int buttonState = 0;
int lastButtonState = 0;
void setup() {
  // delay(2000);
  Serial.begin(115200);
  nbrArticlesRecu=0; //Initialisation parseur
  nbrAppelAffichage=0;
  pinMode(buttonPin, INPUT); //Initialise bouton comme input
 
  //Initialise ecran LCD
  lcd.begin(16, 2); 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Download news...");
  lcd.setCursor(0,1);
  lcd.print("Launch file .py");
  Serial.println("Debut du programme");
}
void loop(){
  if(nbrArticlesRecu<nbrArticlesMax){ // Récupération du flux RSS google news
    // Le XML est parcouru pour récupérer les titres des articles à une 
   if((t[nbrArticlesRecu]=finder.getString("<item><title>","</title>",actualite[nbrArticlesRecu],320))>0){
     nbrArticlesRecu=nbrArticlesRecu+1; 
   }
   delay(50);
  }
  else{
    afficherMessage2(actualite[numArticle], t[numArticle], nbrAppelAffichage);
    nbrAppelAffichage++;
    delay(4000);
    buttonState = digitalRead(buttonPin);
    if (buttonState != lastButtonState) {
      if (buttonState == HIGH) {
        numArticle=(numArticle+1)%nbrArticlesMax;
        nbrAppelAffichage=0;
        Serial.println(" bouton ");
      }
      delay(50);
    }
    lastButtonState = buttonState;
  }
}
void afficherMessage2(char* message, int taille, int numAppel){
  int nombreEcran = (taille-1)/32 + 1;
  // Serial.println(numAppel);
  int choixEcran = numAppel%nombreEcran;
  int pointeurMsg = choixEcran*32;
  for(int i=0;i<16;i++){
    lcd.setCursor(i,0);
    if(pointeurMsg+i<taille) lcd.print(message[pointeurMsg+i]);
    else lcd.print(" ");
    lcd.setCursor(i,1);
    if(pointeurMsg+16+i<taille) lcd.print(message[pointeurMsg+16+i]);
    else lcd.print(" ");
  }
}

 

Code Python
#!/usr/bin/python

import serial
import unicodedata
import urllib2

ser = serial.Serial(‘/dev/tty.usbmodem1411’, 115200);

# Recuperation du flux rss google news
data = urllib2.urlopen(« http://news.google.fr/?output=rss »).read();
# Overture d’un fichier tampon
f = open(‘Flux RSS.txt’, ‘r+’);

# Ecriture dans le fichier des donnes recu
f.write(data);

s1 = unicode(data,’utf-8′);
data = unicodedata.normalize(‘NFD’, s1).encode(‘ascii’, ‘ignore’);
data = data.replace(« ‘ », »‘ »);
ser.write(data);

Laisser une réponse

Votre adresse e-mail ne sera pas publiée.