Networked light arduino-Nicolas pdf.pde

De Wikilipo
Aller à la navigation Aller à la recherche
// getting started with Arduino
// Example 08A: Arduino networked lamp
// parts of the code are inspired
// by a blog post by Tod E. Kurt (todbot.com)
// 
// tested and corrected with @nicolasszilas
// April 5, 2010
// French commenting April 14
// @atelierpdf.com

// the arduino API has to run networked-lamp.ino in parallel

import processing.serial.*;

// String feed = "https://twitter.com/lci";
//String feed = "http://www.lefigaro.fr";
String feed = "https://twitter.com/#!/search/ange";

int interval = 10;  // analyse du site toutes les 10 secondes
int lastTime;       // le moment de la dernière analyse

int love    = 0;    // variable contenant le mot 1
int peace   = 0;    // variable contenant le mot 2
int arduino = 0;   // variable contenant le mot 1

int light = 0;  // varibale du niveau capté par la cellule photoélectrique
Serial port;
color c;
String cs;

String buffer = ""; // empile les valeurs provenant de l'arduino

PFont font;

void setup() {
  size(640,480);
  frameRate(10);    // rythme des mises à jour de processing

  font = loadFont("HelveticaNeue-Bold-32.vlw");  
  fill(255);  
  textFont(font, 32);
  // IMPORTANT NOTE:
  // The first serial port retrieved by Serial.list()
  // should be your Arduino. If not, uncomment the next
  // line by deleting the // before it, and re-run the
  // sketch to see a list of serial ports. Then, change
  // the 0 in between [ and ] to the number of the port
  // that your Arduino is connected to.
 //  println(Serial.list());
  String arduinoPort = Serial.list()[0]; // adresse du port sériel
  port = new Serial(this, arduinoPort, 9600); // connection avec celui de l'aduino

  lastTime = 0;
  fetchData();
}

void draw() {
  background( c );
  int n = (interval - ((millis()-lastTime)/1000));

  // Debug: build a colour based on the 3 values
//  peace = 255;
//  love = 200;
//  arduino = 200;
//  
  
  c = color(peace, love, arduino);
  cs = "#" + hex(c,6); // formattage du "string" à envoyer à l'arduino 
 
 // affichage du programme: mots tracés, traduction en couleurs 
  text("Arduino - la lampe en ligne", 10,40);
  text("Analyse du site: ", 10, 100);
  text(feed, 10, 140);

  text("Prochain relevé dans "+ n + " secondes",10,450);
  text("mot 1 ",10 ,200);
  text(" " + peace, 130, 200);
  rect(250,172, peace, 28);

  text("mot 2 ",10,240);
  text(" " + love, 130, 240);
  rect(250,212, love, 28);

  text("mot 3 ",10,280);
  text(" " + arduino, 130, 280);
  rect(250,252, arduino, 28);

  // write the colour string to the screen
  text("envoi de", 10, 340);
  text(cs, 250,340);

  text("lumière ambiante: ", 10, 380);
  rect(300, 352,light/10.23,28); // on exprime 1023 en 100

  if (n <= 0) {
    fetchData();
    println("Fetching fata"); // affichage dans processing de chaque appel 
    lastTime = millis();
  }

  port.write(cs); // envoi des données vers l'arduino

  if (port.available() > 0) { // le port sériel attend-t-il des donnée?
    int inByte = port.read(); // lecture d'un byte
    if (inByte != 10) { // s'il n'est pas un "newline"
      buffer = buffer + char(inByte); // on l'ajoute au tampon (buffer)
    }
    else {

      // dès que le "new line" est reçue, on traite les données
      if (buffer.length() > 1) { // teste si les données existent

        // on enlève le dernier caractère, c'est un retour de charriot
       
        buffer = buffer.substring(0,buffer.length() -1);
 
        // on transforme les données en valeurs entières
        light = int(buffer);

        // puis on le vide la mémoire tampou pour le cycle suivant
        buffer = "";

        // préparons la place en mémoire pour les nouvelles
        // données... en effaçant tout
        port.clear(); 
      }
    } 
  }

}

void fetchData() {
  // ces chaînes de caratères vont nous permettre
  // d'analyser les données
  String data; 
  String chunk;

  // on met les compteurs à 0
  love    = 0;
  peace   = 0;
  arduino = 0;
  try {
    URL url = new URL(feed);  // cet objet contient l'url
    // on met en place la connection  
    URLConnection conn = url.openConnection(); 
    conn.connect(); // et on l'opère

    // on met en place les données en ligne
    // à raison d'une ligne à la fois
    BufferedReader in = new
    BufferedReader(new InputStreamReader(conn.getInputStream()));

    // on prend chacune des lignes du flux entrant
    while ((data = in.readLine()) != null) {

      StringTokenizer st =
        new StringTokenizer(data,"\"<>,.()[] ");// on le découpe
      while (st.hasMoreTokens()) {
        // on s'assure que tous les caratères sont en bas de casse
        chunk= st.nextToken().toLowerCase() ;

        if (chunk.indexOf("Anges") >= 0 ) // a-t-on trouvé le premier mot?
          love++;    // increment love by 1
        if (chunk.indexOf("ange") >= 0)   // a-t-on trouvé le second mot?
          peace++;   // increment peace by 1
        if (chunk.indexOf("je") >= 0)    // a-t-on trouvé le troisème mot?
      }
    }

    // le maximun est bloqué a 64 références
    if (peace > 64)   peace = 64;
    if (love > 64)    love = 64;
    if (arduino > 64) arduino = 64;

    peace = peace * 4;     // que l'on multiplie par 4 pour arriver à 255
    love = love * 4;       // puisque l'on forme des message de couleurs
    arduino = arduino * 4; // codés sur 4 bytes (ARGB)
  } 
  catch (Exception ex) { // en cas d'erreur, arret du sketch
    ex.printStackTrace();
    System.out.println("ERROR: "+ex.getMessage());
  }

}