Partage
  • Partager sur Facebook
  • Partager sur Twitter

Interface météo sous arduino et processing.

Presque terminé, besoin d'aide svp.

    11 janvier 2015 à 17:10:03

    Bonjour à tous,

    J'ai commencé un petit projet d'interface météo tout simple qui se complexifiera au fur et à mesure que le projet avancera.

    Pour l'instant je possède un capteur DHT11 et une photo-résistance branché sur un arduino Uno, j'arrive à afficher la luminosité (Lux), la température et l'humidité. Ca c'est pour la partie arduino.

    Je veux afficher en temps réel (liaison usb / 5v) sur une interface processing les données.

    Etat actuel :  la partie hardware fonctionne parfaitement, le code arduino fonctionne en mode console.

    Voici le code arduino

    #include <dht.h>
    #define dht_dpin A2
    dht DHT;
    int photocellReading = 0;
    int photocellPin = 0;
    void setup()
    {
    Serial.begin(9600);
    }
    void loop()
    {
      DHT.read11(dht_dpin);
      photocellReading = analogRead(photocellPin);  // Read the input pin.
    int h = DHT.humidity;
    int t = DHT.temperature;
    Serial.println(photocellReading);
    Serial.println(t);
    Serial.println(h);
    delay(1000);
    }

    Ma question : : J'ai un petit soucis sur la partie processing en effet voici le code:

    import processing.serial.*;  // Charge la bibliothèque serial.
    
    Serial myPort;               // Création de l'objet myPort (classe Serial).
    int baudrate = 9600;         // Vitesse de transfert des données (en bauds).
    int valPort = 0;             // Données reçues depuis le port série.
    String buffer ="";
    int photocellReading;
    String luminosite;
    
                              
    // Température
    float tempmini=34;         //Temperature mini mesurée par l'Arduino
    float tempmax=12;          //Temperature maxi mesurée par l'Arduino
    int t;
    int h;
    int fps = 1;               // Nombre de frames par seconde
    int j;
    int k;
    int x=0;          //Abcisse
    int x0=0;         //Abcisse précédente
    int y=0;          //Ordonnée
    int y0;           //Ordonnée précédente
    //////////////////////////////////////////////////////////////////////////////////////////
    
    void setup(){  
      frameRate(fps);
      size(1000, 610);
      smooth();                  //On active le lissage
      println("Ports séries disponibles :");
      println(Serial.list());    // Sur mon ordinateur, la carte Arduino est connectée au port 
                                // dev/cu.usbmodem1411, le premier dans la liste, d'où le 0 dans Serial.list()[0].  
      String portName = Serial.list()[0];
      myPort = new Serial(this, "/dev/cu.usbmodem1411", baudrate);  
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////
    
    void draw()
    {
      background(#DFF2FF);  //couleur de fond de l'application
      while (myPort.available() > 0) {
        // Pour transmettre la valeur mesurée codée sur 10 bits (2^10 = 1024),
        // soit un nombre compris entre 0 et 1023,
        // valPort prend successivement des valeurs entre 48 et 57,
        // ce qui correspond en code ASCII aux caractères 0 à 9.
        // Quand la valeur à transmettre (0 à 1023) l'est, valPort prend les valeurs 
        // 13 (retour chariot en code ASCII), puis 10 (saut à la ligne en code ASCII).
        valPort = myPort.read();
        serialEvent(valPort);
      }
     
    ///////////////////PARTIE PHOTOCELLPIN  //////////////////////////////////////////////////////////////////////////////////
     if (photocellReading < 10) {luminosite=("Très ensoleillé");
              } else if (photocellReading < 200) {luminosite=("Lumière Ambiante");
              } else if (photocellReading < 500) {luminosite=("Sombre");
              } else {luminosite=("Pénombre");  
              }
    
    ///////////////////PARTIE DHT11  //////////////////////////////////////////////////////////////////////////////////
    
      
      if (t < tempmini) {tempmini = t;} //Calcul temperature mini
      if (t > tempmax) {tempmax = t;} //Calcul temperature maxi
      
      // Affichage de la température à l'écran (à chaque boucle, toutes les secondes : cf fps).
      if (t != 0 ) {
          PFont police = loadFont("Baskerville-Italic-30.vlw"); 
           textFont(police, 30);
           fill(#26C4EC);
           text("Suivi température", 620, 570);    //Titre de l'application
            fill(#008E8E);
           text("Température instantannée :", 500, 50);  //Champ des témpératures instantannée
           text(t + "°C", 800,50);    //affichage de la temperature en °C.
           text("Historique température", 520, 300);
           fill(0,0,255);
          text(nf(tempmini,0,1)+" °C", 520, 360);
          fill(255,0,0);
          text(nf(tempmax,0,1)+" °C", 520, 450);
          textAlign(LEFT);
      }
      // Affichage de la lumière à l'écran (à chaque boucle, toutes les secondes : cf fps)
           if (photocellReading != 0 ) {
          PFont police = loadFont("Baskerville-Italic-30.vlw"); 
           textFont(police, 30);
           fill(#008E8E);
           text("Luminosité  :" +   luminosite,50,550);
           }
             
             if (h != 0 ) {
          PFont police = loadFont("Baskerville-Italic-30.vlw"); 
           textFont(police, 30);
           fill(#008E8E);
           text("Humidité  :" +   h,500,150);
           }
      //Dessin du thermomètre -----------------------
           PFont police = loadFont("Baskerville-Italic-30.vlw"); 
           textFont(police, 20);
           fill(50);
           noStroke();
           rect(100,70,20,420);
           ellipse(110, 490, 40, 40);
       //Dessin du réservoir
           ellipse(110, 70, 20, 20);
           fill(#FF0000);
           ellipse(110, 490, 30, 30);
        //Gradations et textes tous les 5 degrés
           fill(50);
           strokeWeight(2);
           stroke(50);
        //à droite
            for (int i = 0; i < 11; i++) {
             j=i*40;
             k=i*5;
             line(120, 475-j, 130,475-j);
              text(k+" °C", 140, 475-j);
             }
       //Gradations fines des degrés à droite
             strokeWeight(1);
             stroke(50);
             for (int i = 0; i < 50; i++) {
              j=i*8;
              line(120, 475-j, 125,475-j);
               }
      //Dessin temperature actuelle -----------------------
          noStroke();
          fill(#FF0000);
          rect(105,475-t*8,10,t*8+5);
          fill(#FF0000);
          rect(110,480-t*8,3,t*8-5);
    
       text(hour()+" : "+minute()+" : "+second(),200, 20);
       text(day()+" / "+month()+" / "+year(), 25, 20);
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////
    
    void serialEvent(int serial)  // Méthode de la classe Serial.
    {
        if (serial != 10) { // 10 <=> saut à la ligne en code ASCII. 
      buffer += char(serial); // Store all the characters on the line. 
    }
    else {
    // The end of each line is marked by two characters, a carriage //return (13) and a newline (10). We're here because we've gotten a //newline, but we still need to strip off the carriage return.
    buffer = buffer.substring(0, buffer.length()-1);
    //Parse the String into an integer (analog inputs go from 0 to 1023).
    t = parseInt(buffer);
    h= parseInt(buffer);
    photocellReading=parseInt(buffer); 
    
    buffer = ""; // Clear the value of "buffer"
    }
     } 
       
    
    
    //////////////////////////////////////////////////////////////////////////////////////////

    Mon problème est le suivant: j'ai un soucis avec la fonction serialevent, lorsque je lance mon interface, dans les champs humidité, température, luminosité cela s'affiche correctement mais avec un seul paramètre.

    Par exemple si dans le code arduino je termine par un "Serial.println(h);" alors dans mon interface processing dans le champ température s'affiche l'humidité (h), dans le champ humidité s'affiche l'humidité (h) et pareil pour la luminosité qui affiche (h).. Si je termine dans arduino le code par un Serial.println(t) alors uniquement la température 't' s'affiche partout comme si processing ne faisait pas la différence entre h, t et photocellReading mais utilisé que un des paramètres.

    Avez vous une idée? On m'a conseillé de créer des tableaux dans la partie arduino, mais c'est mon premier projet et je n'arrive pas vraiment a changer ce problème.

    Je vous remercie d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      11 janvier 2015 à 18:31:17

      En même temps, ton arduino affiche toutes les infos avec un println.

      Coté processing, il va donc recevoir : 12$54$47$85$11$58$68$ (je remplace les sauts de lignes par des $)

      Difficile de distinguer quelle donnée correspond à quoi non ?

      Tu ferais mieux d'envoyer quelque chose du genre : 125T22H89L (tu noteras qu'il n'y a pas de \n)

      Avec la signification suivante :

      T : indique que le chiffre qui vient d'être reçu correspond à la température

      H : indique que le chiffre qui vient d'être reçu correspond à l'humidité

      L : indique que le chiffre qui vient d'être reçu correspond à la luminosité

      Dans ce cas, on a donc une température à 125, une humidité de 22 et une luminosité à 89

      Ce qui nous donne le code arduino suivant :

      Serial.print(photocellReading);
      Serial.print('L');
      Serial.print(t);
      Serial.print('T');
      Serial.print(h);
      Serial.print('H');

      Et un code de ce genre coté pressing :

      int nombreEnCours = 0;
      
      void serialEvent(int serial) {
      	if ( ( serial >= '0' ) && ( serial <= '9' ) ) {
      		nombreEnCours = ( ( nombreEnCours * 10 ) + ( serial - '0' ) );
      	} else if ( serial == 'T' ) {
      		t = nombreEnCours;
      		nombreEnCours = 0;
      	} else if ( serial == 'H' ) {
      		h = nombreEnCours;
      		nombreEnCours = 0;
      	} else if ( serial == 'L' ) {
      		photocellReading = nombreEnCours;
      		nombreEnCours = 0;
      	}
      }




      -
      Edité par lorrio 11 janvier 2015 à 18:32:14

      • Partager sur Facebook
      • Partager sur Twitter
        11 janvier 2015 à 19:10:15

        Bonsoir lorrio !!


        Je te remercie pour ton aide , j'ai testé et compris ton idée et cela fonctionne parfaitement !!

        Merci beaucoup :) 

        Je ne manquerai pas de mettre à jours dès que mon interface évoluera un peu ^^

        Bonne soirée à tous

        • Partager sur Facebook
        • Partager sur Twitter

        Interface météo sous arduino et processing.

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown