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

Hola. Necesito controlar un circuito arduino 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.

Inserto el código a continuación.

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 



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 
}


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

void draw()


  //Recibir datos presión del Arduino 
  if(port.available() > 0) // si hay algún dato disponible en el puerto
   {
     valor=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
   {
     valorHT=port.read();//Lee el dato y lo almacena en la variable "valorHT" 
   }
   //Visualizamos la presión con un texto
   text("Humedad y Temperatura =",390,200);
   text(valorHT, 520, 200);
   text("           %           ºC",547,200);

  
    
   //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
  }
}

Hola,

Ese codigo que publicas es de Processing, no de Arduino...O estoy en un craso error???

Sí. Perdona. ¡Llevas toda la razón! Es un código de processing para controlar arduino. Es que de verdad que estoy hecho ya un lío!!!

De todas formas, ya en la introducción digo que es de processing. El problema es que voy apuradísimo de tiempo con todo ésto, y la verdad es que aprender cosas de programación cuando el tiempo apremia... Es complicado.

No sabéis lo que os agradecería algo de ayuda!!!!

He logrado crear un código de Processing para este proyecto. Sin embargo, me da varios errores como que "It looks like you are mixing "active" and "static" modes", o bien que los codigos que marco en color son erróneos.

Agradecería si alguien puede decirme qué hago mal!!!

Gracias.

 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
  }
}

Creo que estas en el foro incorrecto amigo..

Pues gracias. Al menos es un avance.

Yo lo colgué en el foro de programación, pero algún moderador me lo desvió aquí, a proyectos. Es evidente que no estaré en el sitio adecuado. Gracias a todos, no obstante.

MrSpock: Yo lo colgué en el foro de programación, pero algún moderador me lo desvió aquí, a proyectos. Es evidente que no estaré en el sitio adecuado. Gracias a todos, no obstante.

Amigo, creo que este es el foro que buscas: Processing

No soy muy ducho en processing, pero me parece (toco de oído) que la hacer un read sobre el puerto obtienes un byte, por lo tanto no creo que se pueda asignar a un float, deberías escribir una subrrutina para construir el float leyento byte por byte (enviando una cadena de caracteres desde el arduino) y luego limpiar el buffer con port.clear() antes de leer el siguiente valor, o si la resolución es baja, conformarte con enviar un solo byte desde el arduino (resolución 256).

Saludos.

Gracias a ambos.

Te consulto algo:¿ El proyecto es sobre arduino y recogida de datos o lo importante son los datos en si mismos?

Saludos.

Yo haría que el Arduino tome los datos, los envie por Serial y la PC en processing haga lo que deba.

A ver. ARDUINO está conectado por USB al ordenador. Cuando pulso la letra h me da la lectura de la humedad y la temperatura. El problema es que necesito que tome los datos de forma contínua y me lo registre en un fichero de texto para poder manejar luego esos datos de temperatura y humedad.

Y ahí es donde ya me pierdo. Empecé a mirar hacer un programa en C, luego en C++, luego en JAVA, para finalmente acabar en Processing. Y ya estoy como digo hecho un lío y desesperado.

He conseguido que me manden enlaces de foros y de tropecientas mil cosas, que si nadie me explica, pues como que no me sirven para nada.

El programa de arduino ya viene hecho, con lo cual no se ni tan siquiera cómo se han definido las variables en el mismo.

Por eso lo de pedir ayuda. Es evidente que me estoy planteando trabajar temas de programación para que estos problemas no se me vuelvan a presentar. El problema es la prisa que tengo con el tema.

Gracias a todos, no obstante.

No lo tomes a mal, por que no es mi intención recriminarte nada, pero que tipo de ayuda quieres? Pocos en el foro te escribirán un trabajo de tesis a medida. Podemos ayudarte a encontrar errores, pero tu caso esta por encima de eso, se te escapan conceptos de lo que un byte y estas intentando hacer algo que un programador con poca experiencia le costaría su buen trabajo. Tu programa tiene errores de concepto como poner código en el setup, código que no funcionaria. El setup en prossecing y en arduino esta para configurar. Te puedo aconsejar que empieces con metas más pequeñas, por ejemplo sacaR por pantalla de manera continúa la presión y luego ir escalando tu programa hasta lograr lo que necesitas. De esa manera nos será más fácil ayudarte y muchos problemas los resolverás por tu cuenta de forma natural. No te desmoralices por el trabajo que tienes por adelante verás que empezando por abajo avanzas rápido. Saludos

No lo tomo a mal en absoluto, así como TAMPOCO PRETENDO QUE NADIE ME HAGA EL TRABAJO. El problema es que me encuentro de buenas a primeras manejando SIN TIEMPO PARA TOMAR CONTACTO una cosa que yo no he escogido. Estoy estudiado el lenguaje de programación en estos días, y el setup se usa para configurar... o para hacer una cosa una sóla vez. En ciertos ejercicios de iniciación a la programación en Processing se usa el modo setup y el draw para mostrar cómo algunas instrucciones se ejecutan una sóla vez (setup), o bien se ejecutan ininterrumpidamente si las mismas intrucciones van tras el draw.

El problema... sobre todo tiene que ver con la definición de variables. Ese código ha salido de observar varios proyectos de processing, en los cuales ciertamente utilizan números enteros para la temperatura (que no me sirve) o variables de cadena de caractéres (String). Y ciertamente el concepto de bite como unidad de información es muy fácil cuando te lo estudias teóricamente, y no tan fácil cuando tomas contacto con él tras mucho tiempo Y DESCONOCES SI FLOAT ENVIA UN BITE O UN ROSCON DE REYES AL VECINO.

El tema, como dice el refrán, está en los detalles. Cuando uno solicita ayuda, debe dejarse aconsejar con cierta humildad por gente que sin duda sabe muchísimo más de estos temas que uno. Cuando muestro el código, lo que pregunto es si sirve para algo. Veo que no por tus comentarios. Aún así, estos días estoy aprendiendo un montón sobre todos estos temas.

Gracias a todos por vuestro tiempo.

Te repito no intentes saltar etapas, como primer paso piensa en la estructura de tu programa y deja los detalles (código) para lo ultimo.

La estructura de tu programa seria

la parte que haces una sola vez _inicializar _Configurar

La parte cíclica

_Obtener presión _Obtener temperatura _Obtener Humedad _Imprimir valores _Guardar Datos

Con mas detalle (no es la única forma de hacerlo)

inicializar(cabecera de tu programa):

Crear el objeto port de la clase serial Declarar variables globales

Configurar(void setup()) :

Configurar tu objeto port

Parte cíclica (void draw())

Llamada a la funciones

_Obtener presión _Obtener temperatura _Obtener Humedad _Imprimir valores _Guardar Datos

desarrollos de funciones

_Obtener presión _Obtener temperatura _Obtener Humedad _Imprimir valores _Guardar Datos

Gracias por tus aportaciones otra vez. Básicamente es lo que había pensado hacer, aunque visto cómo lo expones tú, parece mucho más claro El tema es que al inicio mezclaba la parte estática, de configuración, con la parte cíclica o dinámica. El error viene de que inicialmente comencé a intentar hacer el programa en JAVA y hubo cosas que confundí.

Una vez que me dí cuenta de eso, el problema ha consistido sobre todo en la definición del tipo variables. Por la forma en la cual el arduino que da los datos (me lo he encontrando configurado ya), es mucho más fácil definir variables String que variables numéricas. Sobre todo es que dos variables me las muestra en el mismo reglón con espacios en blanco. Cláramente veo ahora que es mucho más fácil así

Por ello he pensado que voy a cambiar dos variables que tenía definidas inicialmente, y las voy a refundir en una sóla, pero tipo cadena de caractéres. Si el fichero de datos lo genero en formato. .txt luego podré importar esos datos por ejemplo a excel, por lo cual esto no supone un mayor problema.

Ya iré contando cómo va la cosa.

Gracias por todo otra vez.

Acá te dejo lo anterior, pero mas digerido. Tal vez el compilador chille, no tengo instalado Processing. "solo " le faltan los detalles del código

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

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()

{ valorP=Obtener_presión(); valorHT=Obtener_temperatura_humedad(); Imprimir_valores(valorP,valorHT); Guardar_Datos(valorP,valorHT);

}

string Obtener_presión() { // no estoy seguro como se declara este tipo de funcion en processing

} string Obtener_temperatura_humedad() { }

void Imprimir_valores(string presion,string ht ) { } void Guardar_Datos(string presion,string ht ) { }