SOLUCIONADO Comunicación serial con arduino y guardar datos sd

Colegas como podría comunicar el rs232 de una balanza electrónica (sólo usa Rx Tx y GND) la cual me envia datos de peso ,con un arduino y que el peso recibido lo muestre en el display y lo guarde en una sd...ya tengo un código pero el display sólo me muestra simbolos..

prueba3.ino (1.54 KB)

RS232 es +-12V si no usas una interfaz RS232 a serial ttl no vas a poder leer bien los datos recibidos.

E puesto un max 232 entre la balanza y la uart del arduino (Rx y Tx)...solo cuando envió caracteres del monitor serial del arduino los puedo visualizar en el display, pero cuando conectó el puerto serie de la balanza a la uart del arduino para poder ver el peso solo me muestra simbolos....
Adjunto mi codigo...

prueba3.ino (1.54 KB)

Joseph90, ¿qué balanza estás utilizando?
Las balanzas que conozco (que no son pocas) necesitan ser configuradas para la comunicación con otros dispositivos en alguno de los siguientes modos:

  1. A petición: En este caso la balanza espera a recibir, desde algún dispositivo, la petición del peso. Es necesario enviarle un telegrama definido para la báscula. La báscula contestará con el peso.
  2. Cuando el peso es estable: En este caso nos debemos mantener a la escucha por el puerto serie.
  3. Cada n milisegundos: También debemos manetener a la escucha el puerto serie.

En cualquiera de los casos, el telegrama que envía la balanza suele tener al comienzo y al fin de la trama caracteres que deben ser despreciados para una correcta interpretación del peso.

Si nos dices qué báscula estás intentando comunicar, quizás te podamos ayudar para descrifrar el telegrama.

Saludos,

Juanjo

Colegas ya ecomunicado con la pc y recibo el peso bien con el hyperterminal. ...ST,SG 8.50 kg .
La e configurado para q cada vez que presione print mande un dato de peso..
El indicador que trabajo es un TSCALE CW..
Pero cuando lo conectó al serial del arduino sólo me muestra simbolos ya e probado quitando el max 232 y hay no envía nada..
Alguna sugerencia, nose si podrán revisar mi codigo quizás este fallando en algo..ya lo adjunte arriba

Colegas solucione el problema:

*El primer error fue poner un max232 entre la balanza y el arduino, ya que en la comunicacion entre microcontroladores no es necesaria poner un conversor de niveles, asi que lo obvie.

*En segundo lugar era que conectaba el pin de transmision y recepcion de datos pero no conectaba la tierra y ese era un error grande, felizmente me di cuenta.

*En segundo lugar el peso lo recibia en la octaba columna del display y los caracteres no se visualizaban completos, asi que cambie el codigo para recibirlos en la primera columna.

Ahora colegas, tengo otro problemita, como podria eliminar los primeros 6 caracteres del peso ya que solo necesito visualizar el peso y la trama que recibo me envia algunas letras y luego el peso...
el formato que recibo es ST,SG, 0.00Kg. entonces lo que quiero eliminar es: ST,SG,

Alguna ayuda...

No creo que sea una buena idea cortar el telegrama. En mi opinión deberías tratar los datos del telegrama que "sobran":

ST: Si no me equivoco te habla de la estabilidad del peso. Prueba a pulsar la tecla print mientras mueves la balanza. Podrás ver qué te devuelve en pesadas inestables.
SG: Te habla del signo. Supongo que en caso de ser negativo te devolverá algo así: "SG-", Es decir, se trata de un peso negativo. Este dato te puede servir para conocer si debes despreciar el dato o bien proporcionar algún mensaje al usuario.

Saludos,

Juanjo

Creo q tienes razon bueno en fin lo puedo dejar alli..ademas no se ve mal..
Aun soy un novato y aun no puedo guardar los datos que recibo de lpuerto serial a la SD..
Alguna idea de como guardar los datos del puerto serial a la SD..se que parece tonto pero el codigo que estoy usando no me sirve..este es el codigo que guardo lo datos seriales que me envia la balanza al arduino a la SD y no me funciona

{
if(Serial.available()> 0){
myFile = SD.open("test.txt", FILE_WRITE);

while(Serial.available()> 0){
caracter = Serial.read();
//Escribimos en el fichero de la siguiente manera:
myFile.println(caracter);
Pantalla.print(caracter);
delay(1000);
Pantalla.clear();
}

// Cerramos el fichero
myFile.close();
Serial.println("done.");

}
}

Prueba con esto, no sé cuantos caracteres vas a recibir máximo, si son más de 20 cambia text[20] a la cantidad que necesites + 1

char text[20];
{  
    if(Serial.available()> 0){
        int i=0;
        while(Serial.available()> 0){
            text[i] = Serial.read();
            delay(5); 
            i++;
        }
        text[i] = '\0';

        // Sólo si hay formación en variable text
        if ((text != NULL) && (text[0] != '\0')) {
            myFile = SD.open("test.txt", FILE_WRITE);
            //Escribimos en el fichero de la siguiente manera:  
            myFile.println(caracter);
            Pantalla.print(caracter);
            delay(1000); 
            Pantalla.clear();
            
            // Cerramos el fichero
            myFile.close();
            Serial.println("done.");

            // Limpiamos variable text
            text[0] = '\0';
        }
    }
}

Compañero en los paréntesis tengo que poner el número de caracteres de cada trama que recibo o el número de tramas que voi a recibir, porque si es así el número de tramas es mucha ya que sólo recibo información de peso de la balanza cada vez que presionó la tecla print en la balanza y eso sucede mas o menos cada minuto durante más de 10 horas de trabajo.. Es mucha información la que guardó en la balanza y cada trama me envía casi 15 caracteres ST,SG, 8.000 Kg..

De cada trama que recibes, si cada trama es algo como: ST,SG, 0.00Kg entonces con 20 caracteres estará bien

Sige sin guardar nada...
No se si será por los espacios que tiene la trama que recibo, ya que hay como cuatro espacios entre las letras y los números..

Pon el códigocompleto tal y como lo tienes ahora y vemos qué puede estar pasando.

Saludos,

Juanjo

Compañero tuve que modificar el código un poco pero ya pude guardar los datos en la sd...
Muchas gracias a todos por la ayuda ya que sino nunca podría aver terminado este pequeño proyecto...

Por favor, sube el código que te funcionó para que cuando alguien más tenga el mismo problema pueda encontrar la solución. Además edita tu primer post y agrégale la palabra "SOLUCIONADO" a tu título.

ADJUNTO EL CODIGO COMPAÑEROS...
LO QUE NO ENTIENDO ES COMO EDITAR PARA DAR COMO SOLUCIONADO..

#include <SD.h>
#include <SPI.h>
#include <LiquidCrystal.h>

LiquidCrystal Pantalla(9,8,7,6,5,4);

File myFile;
char caracter;
String cadena;

void setup()
{
// Abrimos la comunicación serial
Serial.begin(9600);
while (!Serial) {
; // Esperamos a que se abra la comunicación
}

Serial.print("Iniciando la tarjeta SD...");
Pantalla.print("INICIALIZANDO SD CAR");
delay(2000);
Pantalla.clear();

// Vamos a usar el pin 10 como CS, así que tenemos que configurarlo como una salida.
pinMode(10, OUTPUT);

if (!SD.begin(4)) {
Serial.println("Fallo al inicializar!");
Pantalla.print("fallo SD CARD...");
delay(2000);
Pantalla.clear();
return;
}
Serial.println("Inicializacion completa.");
Pantalla.print("SD INICIA OK...");
delay(2000);
Pantalla.clear();

// Abrimos el fichero que nos interesa. Solo podemos tener un fichero abierto, así que si queremos cambiar de fichero
// antes tendremos que cerrar el anterior.
myFile = SD.open("TEST.txt", FILE_WRITE);

// Si el fichero se abre correctamente:
if (myFile) {
Serial.print("Escribiendo el test...");
Pantalla.print("Escribiendo el test...");
delay(1000);
Pantalla.clear();

//Escribimos en el fichero de la siguiente manera:
myFile.println("probando 1, 2, 3.");
Pantalla.print("probando 1, 2, 3.");
delay(1000);
Pantalla.clear();

// Cerramos el fichero
myFile.close();
Serial.println("done.");

} else {
// Si no se puede abrir el fichero, mostramos un mensaje de error
Serial.println("error al abrir el fichero test.txt");
Pantalla.print("error al abrir el fichero test.txt");
delay(1000);
Pantalla.clear();

}

// Volvemos a abrir el fichero para leerlo
myFile = SD.open("TEST.txt");
if (myFile) {
Serial.println("TEST.txt:");

// leemos los datos del fichero
while (myFile.available()) {
Serial.write(myFile.read());
}
// cerramos el fichero
myFile.close();
} else {
// Si el fichero no puede abrirse, mostramos un erro.
Serial.println("error opening .txt");
Pantalla.print("error opening.txt");
delay(1000);
Pantalla.clear();
}
}
/////////////////////////////////////////////////////////////////
void loop()

{
if(Serial.available()> 0){
myFile = SD.open("TEST.txt", FILE_WRITE);
caracter = Serial.read();

//Escribimos en el fichero de la siguiente manera:
myFile.print(caracter);

// Cerramos el fichero
myFile.close();
Pantalla.print("guardando peso...");
delay(100);
Pantalla.clear();

}

else {
// MENSAJE PARA IMPRIMIR////

Pantalla.print("PRESIONAR PRINT");
delay(500);
Pantalla.clear();

}
}

Vas a tu primer post le das al botón para editarlo, cuando te aparezca el recuadro para modificar el contenido y el título, solo debes agregar la palabra "SOLUCIONADO" a ese primer post, y luego guardar los cambios.

COLEGAS ESTE ES EL CODIGO:::::

#include <SD.h>
#include <SPI.h>
#include <LiquidCrystal.h>

LiquidCrystal Pantalla(9,8,7,6,5,4);

File myFile;
char caracter;
String cadena;

void setup()
{
// Abrimos la comunicación serial
Serial.begin(9600);
while (!Serial) {
; // Esperamos a que se abra la comunicación
}
//////////////////////////////////////////////////////////
Pantalla.clear();
Pantalla.print("BALANZAS MURGUIA");
delay(2000);
Pantalla.clear();

//////////////////////////////////////////////////////
Pantalla.print("INICIANDO SD");
delay(2000);
Pantalla.clear();

// Vamos a usar el pin 10 como CS, así que tenemos que configurarlo como una salida.
pinMode(10, OUTPUT);

if (!SD.begin(10)) {

Pantalla.print("fallo SD CARD...");
delay(2000);
Pantalla.clear();
return;
}

Pantalla.print("SD INICIA OK...");
delay(2000);
Pantalla.clear();

// Abrimos el fichero que nos interesa. Solo podemos tener un fichero abierto, así que si queremos cambiar de fichero
// antes tendremos que cerrar el anterior.
myFile = SD.open("TEST.txt", FILE_WRITE);

// Si el fichero se abre correctamente:
if (myFile) {

Pantalla.print("COMPROBANDO.....");
delay(1000);
Pantalla.clear();

//Escribimos en el fichero de la siguiente manera:
myFile.println("REPORTE DE PESOS");
Pantalla.print("INICIO CORRECTO");
delay(1000);
Pantalla.clear();

// Cerramos el fichero
myFile.close();

} else {
// Si no se puede abrir el fichero, mostramos un mensaje de error

Pantalla.print("error de archivo.txt");
delay(1000);
Pantalla.clear();

}

// Volvemos a abrir el fichero para leerlo
myFile = SD.open("TEST.txt");
if (myFile) {
Serial.println("TEST.txt:");

// leemos los datos del fichero
while (myFile.available()) {
Serial.write(myFile.read());
}
// cerramos el fichero
myFile.close();
} else {
// Si el fichero no puede abrirse, mostramos un erro.

Pantalla.print("error opening.txt");
delay(1000);
Pantalla.clear();
}
}
/////////////////////////////////////////////////////////////////

void loop()
//////////////////////////////////////////////////////////////

{
if(Serial.available()> 0){
myFile = SD.open("TEST.txt", FILE_WRITE);
caracter = Serial.read();

//Escribimos en el fichero de la siguiente manera:
myFile.print(caracter);

// Cerramos el fichero
myFile.close();
Pantalla.print("guardando peso...");
delay(100);
Pantalla.clear();
return;

}

else {
// Si no se puede abrir el fichero, mostramos un mensaje de error

Pantalla.setCursor(0,0);
Pantalla.print("PRESIONE PRINT");

delay(1000);
Pantalla.clear();
}

}