Control de humedad, temperatura y presión desde PC con Processing

edited January 2016 in Arduino

Hola. Necesito hacer un fichero txt con los datos que mide un circuito arduino. Por ello he pensado en hacer una pequeña aplicación para ejecutarla desde un pc con processing. El tema es que necesito medir la humedad relativa y la temperatura por un lado, y la presión por otro lado, y recoger los datos en un fichero de texto de un ordenador. Es evidente que necesito que se esté midiendo de forma contínua cada cierto tiempo para recoger un número de datos significativo para el estudio que debo hacer en un trabajo académico.

Aunque he estudiado programación en PASCAL hace ya algún tiempo, mis conocimientos de programación están bastante obsoletos, por lo cual el contacto con el JAVA y PROCESSING me está costando mucho trabajo.

Estudiando un poco por aquí y por allí he logrado hacer un código para un programa, pero me da problemas. Y quisiera preguntar si alguno puede ayudarme en este proyecto, que imagino para algunos será relativamente fácil.

El código que he logrado hacer es el siguiente:

import processing.serial.*; //Importamos la librería Serial

Serial port; //Nombre del puerto serie

PrintWriter output; //Para crear el archivo de texto donde guardar los datos

float valorP;//Valor de la presión
float valorH;//Valor de la humedad relativa float valorT;//Valor de la Temperatura int index=0;

{ println(Serial.list()); //Visualiza los puertos serie disponibles en la consola de abajo port = new Serial(this, Serial.list()[1], 9600); //Abre el puerto serie COM3

output = createWriter("Parametros_datos.txt"); //Creamos el archivo de texto, que es guardado en la carpeta del programa

size(800, 400); //Creamos una ventana de 800 píxeles de anchura por 600 píxeles de altura }

void setup() { port.write("p"); //Envia una "p" para que el Arduino lea la presión }

{ //Recibir datos presión del Arduino if(port.available() > 0) // si hay algún dato disponible en el puerto { valorP=port.read();//Lee el dato y lo almacena en la variable "valorP" }

//Visualizamos la presión con un texto text("Presión =",390,200); text(valorP, 520, 200); text(" hPa",547,200);

//Escribimos los datos de la presión con el tiempo (h/m/s) en el archivo de texto output.print(valorP + " hPa "); output.print(hour( )+":"); output.print(minute( )+":"); output.println(second( )); output.println("");

}

{ port.write("h"); //Envia una "h" para que el Arduino lea la humedad y la temperatura

}

void draw()

{ //Recibir datos de Temperatura y Humedad del Arduino if(port.available() > 0) // si hay algún dato disponible en el puerto

{

//Leemos hasta que se encuentre un espacio y guardamos lo leido en Data Data = port.readStringUntil(" "); //buscamos la posición del espacio que separa //los dos valores y guardamos la posición en index index = Data.indexOf(" ");

//almacenamos la primera parte del texto en valorH valorH= Data.substring(0,index); //Almacenamos la segunda parte en valorT valorT= Data.substring(index+1,Data.length()); } } { valor=port.read();//Lee el dato y lo almacena en la variable "valorH" } //Visualizamos la humedad y la temperatura con un texto text("Humedad = ", 390, 300); [color=green] text(valorH, 520, 300); text(" % ", 547, 300); text("Temperatura = ", 630, 300); text(valorT, 520, 547); text(" ºC ", 547, 300);[/color] } { //Escribimos los datos de la temperatura y la humedad con el tiempo (h/m/s) en el archivo de texto output.print(valorHT + " % ºC "); output.print(hour( )+":"); output.print(minute( )+":"); output.println(second( )); output.println("");

}

void keyPressed() //Cuando se pulsa una tecla {

} { //Pulsar la tecla E para salir del programa if(key=='e' || key=='E')

{ output.flush(); // Escribe los datos restantes en el archivo output.close(); // Final del archivo exit();//Salimos del programa } }

Pero no se si está bien porque me da varios errores. Si alguien pudiese echar un vistazo a ver qué está mal, me sería de gran ayuda. Muchas gracias.

Answers

  • Gracias por las indicaciones. Pero si supiera hacer todo eso no tendría que pedir ayuda.

  • edited January 2016

    You need to edit your code text block for proper format. It's a mess right now!
    Highlight it and hit CTRL+O in order to indent it with 4 spaces.

  • edited January 2016
    import processing.serial.*; //Importamos la librería Serial
    
    Serial port; //Nombre del puerto serie
    
    PrintWriter output;  //Para crear el archivo de texto donde guardar los datos
    
    
    float valorP;//Valor de la presión  
    float valorH;//Valor de la humedad relativa
    float valorT;//Valor de la Temperatura
    int index=0;
    
    
    
    
    {
      println(Serial.list()); //Visualiza los puertos serie disponibles en la consola de abajo
      port = new Serial(this, Serial.list()[1], 9600); //Abre el puerto serie COM3
    
      output = createWriter("Parametros_datos.txt"); //Creamos el archivo de texto, que es guardado en la carpeta del programa
    
      size(800, 400); //Creamos una ventana de 800 píxeles de anchura por 600 píxeles de altura 
    }
    
    void setup()
    {
    port.write("p"); //Envia una "p" para que el Arduino lea la presión
    }
    
    
    
     {
      //Recibir datos presión del Arduino 
      if(port.available() > 0) // si hay algún dato disponible en el puerto
       {
         valorP=port.read();//Lee el dato y lo almacena en la variable "valorP"
       }
    
       //Visualizamos la presión con un texto
       text("Presión =",390,200);
       text(valorP, 520, 200);
       text(" hPa",547,200);
    
       //Escribimos los datos de la presión con el tiempo (h/m/s) en el archivo de texto
       output.print(valorP + " hPa     ");
       output.print(hour( )+":");
       output.print(minute( )+":");
       output.println(second( ));
       output.println("");
    
    
    }
    
    
    {
    port.write("h"); //Envia una "h" para que el  Arduino lea la humedad y la temperatura
    
    }
    
    void draw()
    
     {
      //Recibir datos de Temperatura y Humedad del Arduino 
      if(port.available() > 0) // si hay algún dato disponible en el puerto
    
    {  
    
    
      //Leemos hasta que se encuentre un espacio y guardamos lo leido en Data
      Data = port.readStringUntil("");
       //buscamos la posición del espacio que separa 
      //los dos valores y guardamos la posición en index
      index = Data.indexOf(" ");
    
      //almacenamos la primera parte del texto en valorH
      valorH= Data.substring(0,index);
      //Almacenamos la segunda parte en valorT
      valorT= Data.substring(index+1,Data.length());
    }
     }
       {
         valor=port.read();//Lee el dato y lo almacena en la variable "valorH" 
       }
       //Visualizamos la humedad y la temperatura con un texto
       text("Humedad = ", 390, 300);
       text(valorH, 520, 300);
       text(" % ", 547, 300);
       text("Temperatura = ", 630, 300);
       text(valorT, 520, 547);
       text("  ºC  ", 547, 300);
     }
          {
       //Escribimos los datos de la temperatura y la humedad con el tiempo (h/m/s) en el archivo de texto
       output.print(valorHT + "   %     ºC     ");
       output.print(hour( )+":");
       output.print(minute( )+":");
       output.println(second( ));
       output.println("");
    
    
    }
    
    
    void keyPressed() //Cuando se pulsa una tecla
    {
    
      }
      {
      //Pulsar la tecla E para salir del programa
      if(key=='e' || key=='E')
    
      {
        output.flush(); // Escribe los datos restantes en el archivo
        output.close(); // Final del archivo
        exit();//Salimos del programa
      }
    }
    
  • I am trying to write it as a code.

  • edited January 2016

    I understand it is a mess now! But thank you because I wrote it as a code!! Thank you for your help!!

  • No need to re-post it. You can edit your own posts.
    Remove those ``. Highlight the whole code. Press CTRL+O.

  • Hola. He llegado al siguiente código, pero me da un error en

    text(" ", 520, 547);[/color];

    import processing.serial.*; //Importamos la librería Serial
    
    Serial port; //Nombre del puerto serie
    
    PrintWriter output;  //Para crear el archivo de texto donde guardar los datos
    
    String valorP;//Valor de la presión  
    String valorHT;//Valor de la humedad relativa y la temperatura
    int index=0;
    
    
    void setup()
    {
      println(Serial.list()); //Visualiza los puertos serie disponibles en la consola de abajo
      port = new Serial(this, Serial.list()[1], 9600); //Abre el puerto serie COM3
      output = createWriter("Parametros_datos.txt"); //Creamos el archivo de texto, que es guardado en la carpeta del programa
        size(800, 400); //Creamos una ventana de 800 píxeles de anchura por 600 píxeles de altura
    }
    
    
    
    void draw()
    
    
    
    
    
    {
    port.write("p"); //Envia una "p" para que el Arduino lea la presión
    }
    
    
    
     {
      //Recibir datos presión del Arduino 
      if(port.available() > 0) // si hay algún dato disponible en el puerto
       {
         valorP=port.read();//Lee el dato y lo almacena en la variable "valorP"
       }
    
       //Visualizamos la presión con un texto
       text("Presión =",390,200);
       text(valorP, 520, 200);
       text(" hPa",547,200);
    
       //Escribimos los datos de la presión con el tiempo (h/m/s) en el archivo de texto
       output.print(valorP + " hPa     ");
       output.print(hour( )+":");
       output.print(minute( )+":");
       output.println(second( ));
       output.println("");
    
    }
    
    
    {
    port.write("h"); //Envia una "h" para que el  Arduino lea la humedad y la temperatura
    
    }
    
    
    
     {
      //Recibir datos de Temperatura y Humedad del Arduino 
      if(port.available() > 0) // si hay algún dato disponible en el puerto
    
    {  
    
    
    
      //almacenamos los datos recibidos en valorHT
      valorHT= Data.substring(0,index);
    
    }
     }
       {
         valor=port.read();//Lee el dato y lo almacena en la variable "valorH" 
       }
       {
       //Visualizamos la humedad y la temperatura con un texto
       text("Humedad y Temperatura = ", 390, 300);
    
       text(valorHT, 520, 547);
       text("   ", 520, 547);[/color];
     }
          {
       //Escribimos los datos de la temperatura y la humedad con el tiempo (h/m/s) en el archivo de texto
       output.print(valorHT + "   %     ºC     ");
       output.print(hour( )+":");
       output.print(minute( )+":");
       output.println(second( ));
       output.println("");
    
    
    }
    
    
    void keyPressed() //Cuando se pulsa una tecla
    {
    
      }
      {
      //Pulsar la tecla E para salir del programa
      if(key=='e' || key=='E')
    
      {
        output.flush(); // Escribe los datos restantes en el archivo
        output.close(); // Final del archivo
        exit();//Salimos del programa
      }
    }
    
  • Answer ✓

    hi, you are trying a difficult task if you are not a processing programmer . like you , i am a novice processing programmer , jj . i made a similar project in processing with temperature , humidity and light , i started with this code (i am not the author i get this code of Derek Runberg's book) , but it s more clear for me and it works , i suggest you , to read some processing book , processing is not complicated but you have to learn some concepts , studying processing examples. i hope it helps you

    import processing.serial.*;
    
    Serial myPort;
    
    float temp = 0;        
    float light = 0;      
    float humidity = 0;       
    PrintWriter output;
    void setup() 
    {
      size(700, 400);
      output = createWriter("MrSpock.txt");
      println(Serial.list());
      myPort = new Serial(this, Serial.list()[0], 9600);
    
    //Generate a new serial event at new  line:
      myPort.bufferUntil('\n');  
    }
    
    void draw() 
    {
      println(light + "," + humidity + "," + temp);  //Print serial data to terminal
      background(150);  //Standard grey background
    
      stroke(0);  //Base level line color
      line(0, 300, width, 300);  //Base level line
    
      noStroke();  //Remove outline
    
      fill(255, 0, 0);  //Temp rectangle
      rect(100, 300, 100, -temp);
    
      fill(0, 255, 0);    //Light rectangle
      rect(300, 300, 100, -light);
    
      fill(0, 0, 255);  //humidity rectangle
      rect(500, 300, 100, -humidity);
        fill(0);    //black
      textAlign(CENTER);
      text("Light: "+light, 150, 325);
      text("humidity: "+humidity, 350, 325);
      text("Temperature: "+temp, 550, 325);
      output.println(light + "," + humidity + "," + temp);
    }
    
    
    
    void serialEvent(Serial myPort)
    {
      String inString = myPort.readStringUntil('\n');
    
      if (inString != null) 
      {
        inString = trim(inString);
        float[] vals = float(split(inString, ","));
    
        if (vals.length >= 3) 
        {
          temp = map(vals[0], 0, 1023, 0, 200);
          light = map(vals[1], 0, 1023, 0, 200);
          humidity = map(vals[2], 0, 1023, 0, 200);
        }
      }
    }
    void keyPressed()
    {
    if(keyCode == UP)
    {
    output.flush(); //flush the buffer and
    //collect what data is on its way
    output.close(); //close the text file
    }
    }
    
    

    change it , if you have doubts post it with arduino code

  • Thank you, thankyou, thank you so much!! In this moment it takes a little mistake, but it seems I can use it in my project!! I have to modify a few, but I can use it!! My problem is that I don't have time to study in this moment, because I have to start this project.

    But I will study processing because I don't want new problems with it!!

    As I told you before, thank you so much again.

  • The code, goes and create the file!!. But now i've got a new problem. I have to send h from the pc to arduino, because I don't have data until aruino receive this char. I can't change it in Arduino, so I have to do it in proccessing. I have think the following code:

    {
    port.write("p"); //Envia una "p" para que el Arduino lea la presión
    
    
    
    void loop()
    {
      if(Serial.available()>0) //Comprobamos si en el buffer hay datos
      {
        char dato=Serial.read();  //Lee cada carácter uno por uno y se almacena en una variable
    
        Serial.println(dato);  //Imprimimos en la consola el carácter recibido
      }
    }
    }
    {
    port.write("h"); //Envia una "h" para que el Arduino lea la humedad y la temperatura
    
    
    
    void loop()
    {
      if(Serial.available()>0) //Comprobamos si en el buffer hay datos
      {
        char dato=Serial.read();  //Lee cada carácter uno por uno y se almacena en una variable
    
        Serial.println(dato);  //Imprimimos en la consola el carácter recibido
      }
    }
    }
    

    I don't know if it's right. ¿Can anyone answer me about it? Thank you.

  • im not sure, but if i understand your task , you are trying to manage your readings , aren't you? portwrite(h); from processing to arduino , and start to read humidity ,for example.

  • Yes! The program in this moment only send me zeros. Arduino needs to read a char "h" for reading humidity and temperature, and "p" for pressure. You're right in your example.

  • edited January 2016

    maybe i can i help you if you write arduino code , because i think that it s not necessary. Arduino reads and sends to processing without processing's help

  • I will try to get it!! Thank you again!!

  • edited January 2016

    below,the arduino code(without sensors) works with processing code ,you can use it for simulation

    int h = 27;
    int g = 40;
    int f = 200;
    void setup()
    {
    Serial.begin(9600); //start serial communication at 9600 bps
    }
    void loop()
    {
      int f = random(255);
      int g = random(255);
    Serial.print(f);//light
    Serial.print(",");
    Serial.print(g);//sound
    Serial.print(",");
    Serial.println(h);//temperature
    delay(100);
    } 
  • Thank you! I don't have the arduino code yet, but I think this is very useful for me! Thank you again!

Sign In or Register to comment.