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
Présentation de l’algorithme
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
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);