Saltar la navegación

Representación gráfica de medidas con Processing.

graficaTH

Representar gráficamente en la pantalla del ordenador mediante un programa en Processing los datos obtenidos de temperatura y humedad.

Una vez obtenidos los datos de temperatura y humedad a través del sensor DHT11 desde Arduino, enviamos, a través del puerto serie, estos datos al PC, donde tenemos ejecutando un programa en Processing que está "escuchando" el puerto serie, obteniendo los datos y representándolos en pantalla. Simultáneamente guardamos los datos en un archivo de texto que posteriormente podremos analizar en una hoja de cálculo.

IMPORTANTE: No hay que tener abierto el monitor serie del IDE de Arduino porque ocupa el puerto y, por lo tanto, no deja leer los datos a Processing.

PROGRAMA A CARGAR EN ARDUINO:

#include "DHT.h"
#define DHTPIN 2   
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);


void setup() {
  Serial.begin(9600); 
  dht.begin();
}

void loop() {

  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Fallo al leer el sensor DHT11");
    return;
  }
  // Únicamente enviar a Processing las variables t y h 
  Serial.println(h);
  Serial.println(t);
 
}


PROGRAMA A EJECUTAR EN PROCESSING (PC / LAPTOP):

Vamos a guardar dos archivos en Processing, al primero le llamamos visual_dot.pde y al segundo Graf.pde. Ambos lo guardamos en el mismo directorio.

/*
Tildes omitidas en los comentarios.
visual_dot.pde
*/

import processing.serial.*;

int x = 65, ancho = 700, alto = 600;
boolean p = true;
int cFondo = 240; //Color fondo

PrintWriter datos;
Serial puertoArduino;
Graf g = new Graf(ancho, alto, cFondo);


void setup (){
 
  size(ancho, alto);
  background(cFondo);
  print(Serial.list());
  //ojo el '0' de Serial.list()[0] 
  //se cambia por el orden de numero de puerto de tu ordenador
puertoArduino = new Serial(this, Serial.list()[0], 9600);
// Guardaremos los datos muestreados en un archivo de texto, // asi podremos analizarlos con una hoja de calculo y otro programa. datos = createWriter("medidas.txt"); fill(0, 0, 255); text("VOLTIOS (Digital): ", 20, 40); text("Muestras", ancho / 2, alto - 20); g.cuadricula(); } void draw(){ String inString = puertoArduino.readStringUntil('\n'); if (inString != null){ inString = trim(inString); float val = float(inString); datos.print(val + "\n"); // copia el dato en medidas.txt g.puntos(x, val, p); p = false; x = x + 20; if (x > ancho - 60) {x = 60; g.borra(); g.cuadricula(); p = true; } } } void keyPressed() {//Presionar 'ESC' para salir datos.flush(); datos.close(); exit(); }
/*
Tildes omitidas en los comentarios.
Graf.pde
*/

class Graf {

  int nX, nY, colF;
  float coordAntX, coordAntY;
  Graf (int x, int y, int cF){
    nX = x;
    nY = y; 
    colF  = cF;
  }
  void cuadricula(){
    stroke(0);   
    for (int  j = 60 ; j <= nX - 60; j = j + 20){
      line (j, 60, j, nY - 60);      } // Vert
    for (int  j = 60 ; j <= nY - 60; j = j + 20){
      line (60, j, nX - 60, j);} // Horiz
 
  }
  
  void borra(){
    fill(colF); // Color del fondo
    noStroke();
    rectMode(CORNERS);
    rect(50 , 50, nX , nY - 30 ); 
  }
  void puntos(int x, float nValor, boolean primera){
      
      fill(255,255,255);
      rectMode(CORNERS); 
      rect(140,25,200,45);//Borra lectura anterior
      fill (0,0,255);
      text(nValor, 142, 40);
      fill(0, 0, 255);
      float v = map(nValor, 0, 1023, nY - 60, 60); //Mapeo inverso entre 
                                                   //los margenes sup e inf.    
      ellipse(x, v, 5, 5);
      //Une los dos puntos con una linea excepto en la primera lectura.
      if (primera == false){ 
        line (coordAntX, coordAntY, x, v);
        
      }
        coordAntX = x;
        coordAntY = v;          
  }


}