Affichage sur Proccessing avec Arduino et DHT11

Bonjour tout le monde,

J'aimerais afficher sur un même graphe les valeurs de température et d'humidité grâce au capteur DHT11 sur Processing. Le problème est que les deux données (humidité et température) proviennent de la même sortie numérique, et je n'arrive pas à afficher, sur le même graphe, les deux courbes.

Voici mon code Arduino, provenant de l'exemple pour le DHT11 :

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to

#define DHTTYPE DHT11   

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);


void setup() {

  Serial.begin(9600); 
  dht.begin();
 }
  
void loop() {
  
  int h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  
  
  // Check if any reads failed and exit early (to try again).
 if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);
  
   
  //Serial.print("Humidity: "); 
  Serial.println(h);
  //Serial.print("Temperature: "); 
  Serial.println(t);
    

  delay(300);
  
  }

Et voici mon code pour Processing provenant du site Arduino/graph :

import processing.serial.*;

Serial myPort;        // The serial port
int xPos = 1;         // horizontal position of the graph 

//Variables to draw a continuous line.
int lastxPos=1;
int lastheight=0;
float val;

void setup () {
  // set the window size:
  size(800, 600);        

  // List all the available serial ports
  println(Serial.list());
  // Check the listed serial ports in your machine
  // and use the correct index number in Serial.list()[].

  myPort = new Serial(this, Serial.list()[0], 9600);  //

  // A serialEvent() is generated when a newline character is received :
  //myPort.bufferUntil('\n');
  background(0);      // set inital background:
}
void draw () {
  if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();          // read it and store it in val
    // Convert the values to set the radius
      
  }
  // everything happens in the serialEvent()
}

void serialEvent (Serial myPort) {
  // get the ASCII string:
  String inString = myPort.readStringUntil('\n');
  if (inString != null) {
    inString = trim(inString);                // trim off whitespaces.
    float inByte = float(inString);           // convert to a number.
    inByte = map(inByte, 0, 100, 0, height); //map to the screen height.

    //Drawing a line from Last inByte to the new one.
    stroke(127,34,255);     //stroke color
    strokeWeight(2);        //stroke wider
    line(lastxPos, lastheight, xPos, height - inByte); 
    lastxPos= xPos;
    lastheight= int(height-inByte);

    // at the edge of the window, go back to the beginning:
    if (xPos >= width) {
      xPos = 0;
      lastxPos= 0;
      background(0);  //Clear the screen.
    } 
    else {
      // increment the horizontal position:
      xPos++;
    }
  }
}

Auriez-vous un petit avis ?

Merci d'avance,

Bonjour,

j’ai voulu moi aussi tenté d’utiliser Processing pour interargir avec l’Arduino.

Mon programme agit sur une carte très simple avec des potentiomètres qui simuleront des valeurs lues depuis le CAN avec un écran LCD pour qu’on puisse voir les changements.

Voici mon skectch Arduino

#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 10, 9, 5, 4, 3, 2);
int compt=17;
int octet_received1,octet_received2,octet_received3;

void setup() {
  // initialize the serial communication:
  Serial.begin(9600);
  pinMode(51,INPUT);
  lcd.begin(20,2);
}

void loop() {
  int processing;
  
  if(compt==15){
  lcd.setCursor(0,0);
    lcd.print("          ");
  }
  Serial.write(map(analogRead(A5),0,1023,0,255));
  Serial.write(map(analogRead(A9),0,1023,0,255));
  delay(50);
  
  
  if (Serial.available()>0){
    octet_received1=Serial.read();
    if(octet_received1==65){
      lcd.setCursor(0,0);
      lcd.print("HOLA JESUS");}
    else{
      //octet_received1=Serial.read();
      octet_received2=Serial.read();
      octet_received3=Serial.read();
      lcd.setCursor(0,0);
      lcd.print(octet_received1);
      lcd.print(":");lcd.print(octet_received2);
      lcd.print(":");lcd.print(octet_received3);
      lcd.print("  ");
      
    }compt=0;
  }
  compt++;
}

On peut voir que les valeurs envoyes sont traités avec la fonction map(), qui permet de convertir la valeur selon une certaine plage, essaye de mettre la même pour commencer.

Et voici mon sketch Processing

import processing.serial.*;

Serial port;
int data1,data2,data3;
int compt=0;

void setup(){
  smooth();
  size(1000,1000);
  background(255);
  fill(0);
  ellipse(500,500,603,603);
  port =new Serial(this,Serial.list()[1],9600);
  println(Serial.list());
  fill(0);text("TENSION :",800,50);
  fill(0);text("FREQUENCE :",800,70);
}

void draw(){
  int HH, MM, SS;
    //Display
    compt++;
    if(compt%10==0){
        background(255);
        fill(0);
        ellipse(500,500,603,603);
        fill(0);text("FREQUENCE :",800,50);
        fill(0);text("TENSION :",800,70);}
    
    if (port.available() >0){
      //Tension
      data1 = port.read();
      fill(data1,255-data1,66);
      quad(500,500,540,460,545+data1,500,540,540);
      data1=(data1*2000)/255;
      text(data1,900,50);
      
      //Frequence
      data2 = port.read();
      fill(data2,255-data2,66);
      quad(500,500,460,460,500,455-data2,540,460);
      data2=(data2*670)/255;
      text(data2,900,70);
      
      //Courant
      fill(0,255,0);
      quad(500,500,540,540,500,800,460,540);
      fill(0,255,0);
      quad(500,500,460,540,200,500,460,460);
      
      if(keyPressed==true){
      if (key == 'h') {
        HH=hour();MM=minute();SS=second();
        port.write(HH);port.write(MM);port.write(SS);
      }
      else if(key == 'm') {
        port.write(65);
      }
      
  }
}
}

Pour Proccessing essaye d’effectuer un myPort.read par lecture.

En espérant que ca puisse t’aider.