Hola a todos, soy nuevo en Arduino y por más que he buscado no encuentro la solución, necesito enviar un numero de 6 caracteres y recibirlo en decimal en arduino, en encontrado este ejemplo que es justo lo que estoy buscando pero cuando le pongo mas de 5 caracteres falla. Si alguien sabe que ocurre u que debo hacer estaría muy agradecido. Un saludo.
int i = 0; //variable de acarreo, utilizada con el array
int digitos = 0; //número de dígitos del número escrito
int numero = 0; //el número que hemos escrito
int exponente = 0; //el exponente al que se elevarán los dígitos
const int maxDigitos = 10; //Máximo de dígitos del número
int num[maxDigitos]; //array con los dígitos de nuestro número
void setup(){
Serial.begin(9600); //Iniciamos el Serial
}
void loop(){
digitos = 0;
numero = 0;
/*Primero, se comprueba que el Serial esté disponible. Si es así,
al enviar un número al Arduino desde el ordenador, se almacenarán
los dígitos individuales en las variables num[]. Además, muestra el
valor de los dígitos en el ordenador.
Hay que restar 48, ya que los números son enviados en formato ASCII
*/
if (Serial.available() > 0){
for (i = 0; i < maxDigitos; i++){
num[i] = Serial.read();
num[i] = num[i] - 48;
Serial.print(i);
Serial.print(" = ");
Serial.println(num[i]);
}
/*Determinamos los dígitos del número. En todas las variables
del array se almacena información, siendo un -49 si no contiene
un número. Por tanto, se cuentan las variables num[] con contenido
diferente de -49, y se pasa el resultado a la variable digitos*/
for (i = 0; i < maxDigitos; i++){
if (num[i] != -49){
digitos++;
}
}
Serial.print("digitos = ");
Serial.println(digitos);
/*En esta parte del programa se toman los dígitos por separado, y,
en función de su posición (unidades, decenas, centenas...) son
elevados a un exponente determinado por el número de dígitos
*/
for (i = 0; i < maxDigitos; i++){
if (i < digitos){
exponente = digitos - 1;
exponente = exponente - i;
numero = numero + (num[i] * pow(10, exponente));
}
}
/*Por un motivo que no entiendo, cuando los números son de 3 dígitos
o más, se le resta 1 a las unidades. Después de corregir esto último
se muestra el número
*/
if (digitos >= 3)
numero++;
Serial.print("El numero que has escrito es ");
Serial.println(numero);
}
}
Ejemplo del fallo:
-Escribo en el monitor ‘12345’ y me devuelve ‘El numero que has escrito es 12345’
-Por el contrario pongo ‘123456’ y me devuelve ‘El numero que has escrito es -7616’
---- SOLUCION --------------------------
Como bien me aconsejo ‘noter’ más abajo, el problema era que estaba mandando caracteres ascii (quien quiera ver el porque le remito a esta web que lo explican muy bienhttp://www.baldengineer.com/blog/2012/07/30/arduino-multi-digit-integers/).
El código para pasar cualquier digito es este, que nos devolverá después de pulsar ‘n’ el número enviado.
void setup() {
Serial.begin(9600);
}
unsigned long integerValue=0; // Valor máximo 65535 *//Modificada a long para que pueda albergar más números
char incomingByte;
void loop() {
if (Serial.available() > 0) { // Escuchando datos
integerValue = 0; // Limpiamos la variable (que ya no es integer)
while(1) { // blucle para enviar al pulsar 'n'
incomingByte = Serial.read();
if (incomingByte == 'n') break; // Sale del bucle while(1), cuando recibe 'n'
if (incomingByte == -1) continue; // Si no hay ningún carácter en buffer read() devuelve -1
integerValue *= 10; // desplaza a la izquierda una posición decimal
// Convierte de Ascii a Entero, lo agregamos y volvemos a desplazar
integerValue = ((incomingByte - 48) + integerValue);
}
Serial.println(integerValue); // Lo imprimimos para verlo. :)
}
}
Yo necesitaba dicho código porque desde un programa externo y utilizando un emisor RF 433Mhz quería enviar números incrementándolos así, para encontrar así el código que active unos receptores muy antiguos que tengo, http://www.made-in-china.com/showroom/silviachina/product-detailWMvJSnmTVQcD/China-Remote-Control-Sockets-RCS-K01-RCT-01-.html.
Y funcionar funciona pero me esta costando encontrarlo por este método ‘BruteForce’ supongo. El caso es que he conseguido encender todos los receptores a la vez con los códigos (170600 - 183700 - 188000) pero ni se como apagarlos, ni como encerderlos de uno en uno. Estoy cambiando el Periodo de 350 a 290. Sigo en ello…