Problema con guardado de datos en txt


#1

Hola estimados!, tengo un problema que no he podido solucionar, llevo poco tiempo utilizando processing y me he encontrado con muchos problemas que gracias a internet los he ido solucionando, pero hay uno que no he podido solucionar. Resulta que estoy enviando datos desde Arduino a processing y la idea es realizar un guardado de estos, hasta ahí todo bien, el problema surge cuando al momento de leer estos datos, al apretar un boton ( inicio), comienza el guardado de los datos en un archivo txt hasta que se apriete el boton (fin). Lo que he logrado hacer es guardar los datos con una cantidad definida por un contador que está dentro de un while y va aumentando hasta que se cumple el valor y sale, pero mi idea es sacar el dato desde el botón. Por favor si alguien me pudiera orientar se lo agradecería bastante. Espero que mi idea haya quedado clara.

type or paste // PROCESSING

import processing.serial.*;

float sensor1 = 0.0;
float sensor2 = 0.0;
float sensor3 = 0.0;

float arreglo1;
float arreglo2;
float arreglo3;

PFont titulos,senales;

int consta = 100;

int aux00 = 0;
int flag = 0;
int flag2 = 0;
int flag10 = 0;
boolean aux;
int cont = 0;
int num1= 0;

Serial puerto;

// Editor path y extension de archivo
final String pathFolder = "";
final String fileExtension = ".txt";

// Estados
final int normal = 0;  // consts 
final int load = 2;
int state = normal;  // Estado actual, debe ser uno de ellos, current state ( must be one of them) 

// Paths
String loadPath = "";


void setup()
{
  size (1300,800);
  titulos = createFont("Arial Black",12);
  senales = createFont("Arial",12);
  textFont(titulos);
  puerto = new Serial(this, Serial.list()[0],9600);
  puerto.clear();
  puerto.bufferUntil('\n');
}

void fijos ()
{
    background(255);  
    fill(55);
    textFont(titulos,12);
  
    text("Guardar Ensayo",50,660);
    text("Registrar Datos",200,660);
    text("Resetear Sensores",350,660);
    text("Terminar Ensayo",505,660);
    
    text("Sensor 1 : ",25,100);
    text("Sensor 2 : ",25,115);
    text("Sensor 3 : ",25,130); 
         
}

 void mostrar ()
    {
     textFont(senales);
     text(arreglo1,100,100);
     text(arreglo2,100,115);
     text(arreglo3,100,130);
    }
 void botones()
    {
     fill(43,100,43);
     ellipse(90,700,60,60);
     ellipse(250,700,60,60);
     ellipse(410,700,60,60);
     ellipse(560,700,60,60);
    }
    

void envio_y_creacion_de_datos()
{
  String dato = puerto.readStringUntil('\n');
  if (dato != null)
   {
    float[] datos = float(split(dato,","));
    sensor1 = datos[0];
    sensor2 = datos[1];
    sensor3 = datos[2];
    
     arreglo1 = consta - sensor1;   
     arreglo2 = consta - sensor2;
     arreglo3 = consta - sensor3;
   } 
    fijos ();
    mostrar();    
    botones();

  
  if(flag == 1)
     {
      fill(0);
      textSize(12);
      text("Inicio",880,550);
      text("Fin",980,550);
      fill(43,100,43);
      ellipse(900,600,60,60);
      ellipse(1000,600,60,60);      
     }
            
 }
 


void draw()
{
  
  switch (state)
  {
   case normal :
   drawForStateNormal();
   break;
    
   case load:
   waitForLoadDialog();
   break;
   
   default:
   //Error
   println("Fail");
   exit();
   break;
  } 
   float distancia1 = dist(mouseX,mouseY,90,700); //Boton guardar
   if(distancia1 < 30)
   {
    fill(139,0,0);
    ellipse(90,700,60,60);
    
   }
   float distancia2 = dist(mouseX,mouseY,250,700); //Boton registrar

  if(distancia2 < 30)
    {
     fill(139,0,0);
     ellipse(250,700,60,60);
     
    }
   float distancia3 = dist(mouseX,mouseY,410,700); //Boton resetear

   if(distancia3 < 30)
     {
      fill(139,0,0);
      ellipse(410,700,60,60);
     }
   float distancia4 = dist(mouseX,mouseY,560,700); //Boton terminar

   if(distancia4 < 30)
     {
      fill(139,0,0);
      ellipse(560,700,60,60);
      
      }
   float distanciaBotonInicio = dist(mouseX,mouseY,900,600); //Boton inicio
   
   if (distanciaBotonInicio < 30 && flag == 1)
      {
       fill(139,0,0);
       ellipse(900,600,60,60);
      }
      
   float distanciaBotonFin = dist(mouseX,mouseY,1000,600); //Boton fin
   
   if (distanciaBotonFin < 30 && flag == 1)
      {
       fill(139,0,0);
       ellipse(1000,600,60,60);
      }
}


void drawForStateNormal()
{
 envio_y_creacion_de_datos();

}
void initLoad()
{
 loadPath = "";
 File fileDescription = new File( sketchPath() + "//" + pathFolder + "//" + fileExtension);
 selectOutput("Select a file to write to", "fileSelectedLoad", fileDescription);
 state = load;
}

void fileSelectedLoad(File selection) {
  // the 'callback' function
  if (selection == null) {
    // println("Window was closed or the user hit cancel.");
    // go back 
    state=normal;
  } else {
    // println("User selected " + selection.getAbsolutePath());
    loadPath=selection.getAbsolutePath();
  }
}

void waitForLoadDialog() { 
  envio_y_creacion_de_datos();
  if (!loadPath.equals("")) {
    // waiting is over
    loadIt();
    // go back 
    state=normal;
  }
}

void loadIt()
{
 flag2 = 0;  //Para que la ventana de guardar se abra solo una vez
 num1 = 22; //Cantidad de veces que imprime debe considir con el contador (cont) en el while
  // make array (to save it)
    aux = true;  
    cont = 0;
     
  String[] strs1 = new String[num1];
       while(aux == true && cont<22) 
            {
              //for(int j=0 ; j<= 10; j++)        
                //{
                 envio_y_creacion_de_datos();
                 strs1[cont]=str(arreglo1)+","+ str(arreglo2)+","+ str(arreglo3);
                 delay(100);
                 println(strs1[cont]);           
                 cont++;       
            } 
                             
              loadPath += fileExtension; // add the file Extension
                // save 
                println("Saved: " + loadPath);       
                saveStrings( loadPath, strs1 );                               
}

void mouseClicked()
 {
  float distancia = dist(mouseX,mouseY,560,700); //Boton salir
  if(distancia < 30)
    {
     exit();
    }
       
   float distancia3 = dist(mouseX,mouseY,250,700); //Boton registrar
  
  if(distancia3 < 30)
     {
       flag = 1;
      // registrar();
     }  
    
    float distanciaBotonInicio = dist(mouseX,mouseY,900,600); //Boton inicio
    
    if(distanciaBotonInicio < 30)
      {
         flag2 = 1; //Se abre la ventana para guardar
         initLoad();
        
      }
      
    float distanciaBotonFin = dist(mouseX,mouseY,1000,600); //Boton fin
    
    if(distanciaBotonFin < 30)
      {
       flag2 = 0; // Para que no se abran muchas ventanas de guardar
        
       aux = false;
      }
      
 }   
    
     
code here

#2

Hola, la verdad creo que no te entendí muy bien, pero tu solo quieres sacar un solo dato al presionar un boton, cierto? si es así, podrías usar la función mousePressed() y dentro de esta función hacer las condiciones en donde almacenes los datos, quizá utilizando ArrayList o algo por el estilo, la verdad es que no te entendí del todo. Por otro lado, te recomiendo crear una clase Boton.
Saludos!


#3

Mira, lo que quiero hacer es lo siguiente: Yo estoy leyendo 3 variables que vienen desde Arduino (Sensor1,Sensor2 y Sensor3), estás variables las visualizo en un text y se van actualizando sin ningún problema, lo que quiero hacer es guardar estas variables en un archivo de texto. cuando presiono una botón de la interfaz me abre un cuadro de dialogo en donde elijo el nombre y la ruta a donde quiero guardar el archivo, eso lo hace bien, peero en el guardado estoy teniendo problemas, resulta que debe guardar todos los datos desde que aprieto el boton inicio hasta que se aprieta el boton parar, el problema es que cuando aprieto el boton inicio, el codigo entra en un while :

void loadIt()
{
 flag2 = 0;  //Para que la ventana de guardar se abra solo una vez
 num1 = 22; //Cantidad de veces que imprime debe considir con el contador (cont) en el while
  // make array (to save it)
    aux = true;  
    cont = 0;
     
  String[] strs1 = new String[num1];
       while(aux == true && cont<22) 
            {
              //for(int j=0 ; j<= 10; j++)        
                //{
                 envio_y_creacion_de_datos();
                 strs1[cont]=str(arreglo1)+","+ str(arreglo2)+","+ str(arreglo3);
                 delay(100);
                 println(strs1[cont]);           
                 cont++;       
            } 
                             
              loadPath += fileExtension; // add the file Extension
                // save 
                println("Saved: " + loadPath);       
                saveStrings( loadPath, strs1 );                               
}

En este while se realiza el guardado de los datos, pero no me permite presionar el boton para finalizar, entonces la única manera que he logrado que guarde es agregandole un contador.


#4

Ok mira, ahorita no tengo manera de apoyarte bien, pero no deberías de utilizar el while, es muy problemático. Con el ciclo draw() es suficiente. Se me ocurre que utilices un ArrayList <String> datos que será la variable en donde almacenarás los datos. Y una variable booleana que te dirá el estado del botón, si es verdadero, es decir, si lo has presionado, su estado cambia a true, y mediante un if(boton_presionado == true) empiezas a guardar. Utilizar arrayList te permite crear arreglos de tamaño dinámico, con lo cual te quedaría algo de este estilo

boolean boton_presionado = false;
arrayList<String> datos; olvide como inicializar el arrayList, si tienes dudas me avisas.
Void setup(){\\}
Void draw(){
//Aquí el código del botón en donde cambias el estado del botón
If (boton_presionado == true){
datos.add(la variable string dónde guardas tus datos).
}

Suerte, la verdad no lo he calado pero espero que te oriente.


#5

Amigo, te respondo ahora porque tuve que dejar de lado el proyecto un tiempo, pero ahora lo retomé.
Intente hacer lo que me dijiste, en verdad no me manejo bien con arrayList, así que lo que hice fue lo siguiente:
Recorrí el arreglo que tiene almacenado los valores de los sensores con un for,
con esto, el programa me imprime una vez todas los datos que tiene el arreglo ( dato sensor1, dato sensor 2 y dato sensor3 ).
Hasta ahí vamos bien, pero lo que no logro hacer es que ese ciclo se repita hasta que yo presione otro botón.

// PROCESSING

import processing.serial.*;



float sensor1 = 0.0;
float sensor2 = 0.0;
float sensor3 = 0.0;


float arreglo1;
float arreglo2;
float arreglo3;

PFont titulos,senales;

int consta = 100;

int aux00 = 0;
int flag = 0;
int flag2 = 0;
int flag10 = 0;
boolean aux;
Serial puerto;

// Editor path y extension de archivo
final String pathFolder = "";
final String fileExtension = ".txt";

// Estados
final int normal = 0;  // consts 
final int load = 2;
int state = normal;  // Estado actual, debe ser uno de ellos, current state ( must be one of them) 

// Paths
String loadPath = "";
float[] datos;
String dato;
String[] dato_de_cada_sensor;

void setup()
{
  size (1300,800);
  titulos = createFont("Arial Black",12);
  senales = createFont("Arial",12);
  textFont(titulos);
  puerto = new Serial(this, Serial.list()[0],9600);
  puerto.clear();
  puerto.bufferUntil('\n');
  
}

void fijos ()
{
    background(255);  
    fill(55);
    textFont(titulos,12);
  
    text("Guardar Ensayo",50,660);
    text("Registrar Datos",200,660);
    text("Resetear Sensores",350,660);
    text("Terminar Ensayo",505,660);
    
    text("Sensor 1 : ",25,100);
    text("Sensor 2 : ",25,115);
    text("Sensor 3 : ",25,130); 
    
    
}

void envio_y_creacion_de_datos()
{
   dato = puerto.readStringUntil('\n');
  if (dato != null)
   {
    datos = float(split(dato,","));
    dato_de_cada_sensor = split(dato,",");
    sensor1 = datos[0];
    sensor2 = datos[1];
    sensor3 = datos[2];
       
     arreglo1 = consta - sensor1;   
     arreglo2 = consta - sensor2;
     arreglo3 = consta - sensor3;
     
    fijos ();

    textFont(senales);
    
    
    text(arreglo1,100,100);
    text(arreglo2,100,115);
    text(arreglo3,100,130);
   
    fill(0);
    textSize(9);    
    
    fill(255,datos[0],50);
    rect(370,400,10, -datos[0]*2);  
    fill(255,datos[1],50);
    rect(405,400,10, -datos[1]*2);    
    fill(255,datos[2],50);
    rect(440,400,10, -datos[2]*2);   
    
  fill(43,100,43);

  ellipse(90,700,60,60);
  ellipse(250,700,60,60);
  ellipse(410,700,60,60);
  ellipse(560,700,60,60);
  
  if(flag == 1)
     {
      fill(0);
      textSize(12);
      text("Inicio",880,550);
      fill(43,100,43);
      ellipse(900,600,60,60);
      
     }
     
      
   if( flag2 == 1)
     {      
     fill(0);
     textSize(12);
     text("Fin",980,550);
     fill(43,100,43);
     ellipse(1000,600,60,60);
     aux = true;
     initLoad(); 
      // 
     }

 }
 
}


void draw()
{
  
          
  switch (state)
  {
   case normal :
   drawForStateNormal();
   break;
    
   case load:
   waitForLoadDialog();
   break;
   
   default:
   //Error
   println("Fail");
   exit();
   break;
  } 
   float distancia1 = dist(mouseX,mouseY,90,700);
 if(distancia1 < 30)
   {
    fill(139,0,0);
    ellipse(90,700,60,60);
    
   }
   float distancia2 = dist(mouseX,mouseY,250,700);

  if(distancia2 < 30)
    {
     fill(139,0,0);
     ellipse(250,700,60,60);
     
    }
   float distancia3 = dist(mouseX,mouseY,410,700);

   if(distancia3 < 30)
     {
      fill(139,0,0);
      ellipse(410,700,60,60);
     }
   float distancia4 = dist(mouseX,mouseY,560,700);

   if(distancia4 < 30)
     {
      fill(139,0,0);
      ellipse(560,700,60,60);
      
      }
   float distanciaBotonInicio = dist(mouseX,mouseY,900,600);
   
   if (distanciaBotonInicio < 30 && flag == 1)
      {
       fill(139,0,0);
       ellipse(900,600,60,60);
      }
      
   float distanciaBotonFin = dist(mouseX,mouseY,1000,600);
   
   if (distanciaBotonFin < 30 && flag == 1)
      {
       fill(139,0,0);
       ellipse(1000,600,60,60);
      }
}


void drawForStateNormal()
{
 envio_y_creacion_de_datos();

}
void initLoad()
{
 loadPath = "";
 File fileDescription = new File( sketchPath() + "//" + pathFolder + "//" + fileExtension);
 selectOutput("Select a file to write to", "fileSelectedLoad", fileDescription);
 state = load;
}

void fileSelectedLoad(File selection) {
  // the 'callback' function
  if (selection == null) {
    // println("Window was closed or the user hit cancel.");
    // go back 
    state=normal;
  } else {
    // println("User selected " + selection.getAbsolutePath());
    loadPath=selection.getAbsolutePath();
  }
}

void waitForLoadDialog() { 
  if (!loadPath.equals("")) {
    // waiting is over
    loadIt();
    // go back 
    state=normal;
  }
}

void loadIt()
{        
    if(aux == true) 
            {
              envio_y_creacion_de_datos();
              for( int i = 0; i < dato_de_cada_sensor.length; i++)
                 {     
                   println(dato_de_cada_sensor[i]);
                 }
               
            }  
                                        
              loadPath += fileExtension; // add the file Extension
                // save 
                println("Saved: " + loadPath);
               
                saveStrings( loadPath, dato_de_cada_sensor);   
               
               
 }


void mouseClicked()
 {
  float distancia = dist(mouseX,mouseY,560,700);
  if(distancia < 30)
    {
     exit();
    }
       
   float distancia3 = dist(mouseX,mouseY,250,700);
  
  if(distancia3 < 30)
     {
       flag = 1;
      // registrar();
     }  
    
    float distanciaBotonInicio = dist(mouseX,mouseY,900,600);
    
    if(distanciaBotonInicio < 30)
      {
         flag2 = 1;
        
      }
      
    float distanciaBotonFin = dist(mouseX,mouseY,1000,600); 
    
    if(distanciaBotonFin < 30)
      {
//       flag2 = 0; // Para que no se abran muchas ventanas de guardar
      }
      
 }   
   

También intente mover todo hacia el Draw, como me lo habias dicho y lo que conseguí fue que el programa me genero muuuchos archivos sin nombre y con la extension .txt aumentando, algo como :
.txt
.txt.txt
.txt.txt.txt y así sucesivamente.

Algo que se me olvido comentar es que así como está el programa ahora, se siguen abriendo ventanas cada vez que guardo el archivo con un nombre.
Por favor, me puedes orientar un poco más? .
Gracias.