Hola a todos bueno tengo una practica por hacer con el Arduino uno, hasta ahora puedo leer el dato con el modulo rs232 de una báscula pero el dato que me arroja no es el que ocupo me gustaría poder limpiarlo el dato es el siguiente : = -0038120 (kg) y necesito que el dato que me muestre sea solamente el peso que tiene el indicador en esta caso seria 38120 kg alguien pudiera ayudarme a saber si se puede limpiar el dato.
Y el código es?
Leíste las normas del foro? Léelas y verás porque te pido código y por favor postealo usando etiquetas.
Estoy utilizando Arduino uno para el siguiente código, cabe mencionar que tome parte de otro código para iniciar la lectura del puerto rs232 de donde estoy obteniendo ese dato
#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 2
byte x;
byte y;
byte incomingByte;
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
void setup()
{
mySerial.begin(9600);
Serial.begin(9600);
}
void loop()
{
if (mySerial.available())
{
incomingByte = mySerial.read();
if ((incomingByte>47)&&(incomingByte<58))
Serial.print(incomingByte,0);
{
if (incomingByte==10)
Serial.println (incomingByte,0);
}
}
}
Con este código lo único que consigo es que me muestre el dato de esta manera y requiero eliminar el primer cero ya que lo unico que utilizo son los numeros a partir del 3
030790
030790
030790
Te pedí que leyeras las normas y que postearas usando etiquetas, que parte no comprendiste?
Te acabo de enviar privado con instrucciones por favor edita tu post donde pones el código.
Bueno en ese código que aún no comprendes, lo único que haces es evitar que valores que no sean númericos sean presentados.
Pero lo que visualizas son caracteres ASCII y por eso vuelve a aparecer el 0.
Algo que puedes hacer es convertir ese dato a número con lo que vas a quitar el 0 a la izquierda.
También podrias jugar con el hecho de que el 0 a la izquierda estará entre los valores que llegarán primero y eliminarlo.
Pero lo mejor es la primer opción.
Mira este ejemplo usa la función String.toint
*
String to Integer conversion
Reads a serial input string until it sees a newline, then converts the string
to a number if the characters are digits.
The circuit:
- No external components needed.
created 29 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/StringToInt
*/
String inString = ""; // string to hold input
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// send an intro:
Serial.println("\n\nString toInt():");
Serial.println();
}
void loop() {
// Read serial input:
while (Serial.available() > 0) {
int inChar = Serial.read();
if (isDigit(inChar)) {
// convert the incoming byte to a char and add it to the string:
inString += (char)inChar;
}
// if you get a newline, print the string, then the string's value:
if (inChar == '\n') {
Serial.print("Value:");
Serial.println(inString.toInt());
Serial.print("String: ");
Serial.println(inString);
// clear the string for new input:
inString = "";
}
}
}
Adaptalo a tu necesidad y tendrás resuelto el problema.
Solo para ayudarte a comprenderlo te explico:
Basicamente es lo mismo que tu problema, en este caso espera que desde el monitor serie se envien valores.
Si miras
// Read serial input:
while (Serial.available() > 0) {
Acá comienza a leer el puerto serie.
while (Serial.available() > 0) {
int inChar = Serial.read();
if (isDigit(inChar)) {
// convert the incoming byte to a char and add it to the string:
inString += (char)inChar;
}
// if you get a newline, print the string, then the string's value:
if (inChar == '\n') {
Serial.print("Value:");
Serial.println(inString.toInt());
Serial.print("String: ");
Serial.println(inString);
// clear the string for new input:
inString = "";
}
}
Y esta es la rutina general
Comienza con algo similar a lo que tu usaste
int inChar = Serial.read();
Leo un caracter.
Pero luego tiene esta diferencia de código
if (isDigit(inChar)) {
// convert the incoming byte to a char and add it to the string:
inString += (char)inChar;
}
isDigit pregunta si el caracter es digito o sea si está entre los valores que tu pusiste >47 y <58
y si es el caso suma en una variable String concatenando o sea poniendo uno al lado del siguiente caracter todos hasta cuando?
Hasta detectar un ENTER o sea '\n' que es la instrucción siguiente.
Finalmente cuando lo detecta y da por terminado la tarea, lo convierte a entero suando el string que en este caso se llama inString y la subclase .toInt
Traducido, convierte el valor de String a un entero donde el 0 a la izquierda no tiene sentido.
Por supuesto esto tiene restricciones y cuales son?
una variable int va de -32,768 to 32,767
asi que en tu caso conviene que uses unsigned int para tener un rango de 0 a 65535
Si la balanza arroja valores mayores entonces usa long.
Pero si fuera el caso tenemos que cambiar la conversión de String a long.
la balanza si arroja arriba de 80 toneladas, entonces si es necesario la conversión a long.
Se tiene que realizar el cambio al momento de la impresión para declarar el
Serial.println(inString.toLong());
y la declaración en lugar de int - long
Bueno para mi sorpresa no hay una Subclase .toLong y sin embargo .toInt() devuelve un long de manera que si defines
Serial.println(inString.toInt());
Con valores superiores a 65535 verás que sigue convirtiendolos.
Prueba, total nada se va a romper!!
gracias por todo surbyte parece que ya quedo el programa