Hola ^^, es mi primera vez usando el foro, asi que pido perdón de antemano si cometo algunos errores.
En un proyecto que comencé hace poco me di cuenta de que mi programa de arduino no estaba sumando valores como debiese, y he revisado varias veces el código y no he sido capaz de percatar el error, motivo del que hago este post por si alguien sabe que está fallando.
Explico en que consiste el proyectito: Son 4 botones que vienen a simular una contraseña numérica, 3 para introducir los números y otro botón para reiniciar la contraseña y cambiarla. Los botones se identifican como "1", "2" y "3", y dependiendo del orden que se opriman, se obtiene una contraseña u otra, como puede ser 123 o 321, la cual es guardada en una variable "contra" (*Las contraseñas siempre son de 3 dígitos). Para lograr esto, utilicé una variable "intentos" (que comienza en 0), que va guardando cuantas veces se a oprimido un botón, y la función exponencial en base 10 y de exponente la variable intento, multiplicando esta última por el valor del botón (1,2 o 3), logrando así que si se oprime 1 2 y 3 en ese orden, debiese resultar que suma será igual a:
suma=110^0+210^1+3*10^3=321
Donde el primer numero introducido es el de más a la derecha y el último el de la izquierda
Y es aquí donde nace el problema, ya que para este caso se espera que el valor final de "suma" sea 321, pero al imprimir en el monitor en seria su valor, sale que es de 320. Este error también sucede para el caso de de que la contraseña introducía sea 123, ya que en el monitor en serie sale 122, o 323 imprime 322.
Adjunto el código (*que fue recortado e incluye otras cosas como feedback mediante leds al usuario)
// CONSTANTES Y VARIABLES UTILES
const int boton1_pin=10; const int boton2_pin=9; const int boton3_pin=8;const int boton_r_pin=6;const int rojo_pin=5;const int verde_pin=4;
int b1;int b2;int b3;int br;
int estado=0;int suma=0;int intentos=0;int cambiar=0;int contra=0; static long t=0;
int hola=10;
//-------------------------
void setup(){
Serial.begin(9600);
pinMode(boton1_pin,INPUT);pinMode(boton2_pin,INPUT);pinMode(boton3_pin,INPUT);pinMode(boton_r_pin,INPUT);pinMode(verde_pin,OUTPUT);pinMode(rojo_pin,OUTPUT);pinMode(4,OUTPUT);pinMode(2,OUTPUT);
}
void loop(){
b1=digitalRead(boton1_pin);b2=digitalRead(boton2_pin);b3=digitalRead(boton3_pin);br=digitalRead(boton_r_pin);
//BOTÓN DE CAMBIO DE CONTRASEÑA
if (br==1 &&cambiar==0){
cambiar=1;
contra=0;
intentos=0;
suma=0;
digitalWrite(rojo_pin,HIGH);
digitalWrite(verde_pin,HIGH);
delay(400);
digitalWrite(rojo_pin,LOW);
digitalWrite(verde_pin,LOW);
}
if (cambiar==1 && intentos==3){
cambiar=0;
intentos=0;
}
//-------------------------
//CAMBIO DE CONTRASEÑA
if(cambiar==1 && b1==1){
contra+=1*pow(10,intentos);
delay(10);
intentos++;
digitalWrite(verde_pin,HIGH);
delay(580);
digitalWrite(verde_pin,LOW);
}
else if(cambiar==1 && b2==1){
contra+=2*pow(10,intentos);
delay(10);
intentos++;
digitalWrite(verde_pin,HIGH);
delay(580);
digitalWrite(verde_pin,LOW);
}
else if(cambiar==1 && b3==1){
contra+=3*pow(10,intentos);
delay(10);
intentos++;
digitalWrite(verde_pin,HIGH);
delay(580);
digitalWrite(verde_pin,LOW);
}
//-------------------------
delay(120);
//ACERTAR CONTRASEÑA
if (contra==suma && intentos==3){
if(t==0){
t=millis();
}
if (millis()-t>3300){
suma=0; t=0;}
}
//--------------CREAND0 EL INTENTO----------------
if (cambiar==0){
if(b1==1){
suma=suma+1*pow(10,intentos);
delay(10);
intentos++;
digitalWrite(rojo_pin,HIGH);
delay(580);
digitalWrite(rojo_pin,LOW);
Serial.println("---------------");
Serial.println(1*pow(10,intentos-1));
Serial.println("---------------");
}
else if(b2==1){
suma+=2*pow(10,intentos);
delay(10);
intentos++;
digitalWrite(rojo_pin,HIGH);
delay(580);
digitalWrite(rojo_pin,LOW);
Serial.println("---------------");
Serial.println(2*pow(10,intentos-1));
Serial.println("---------------");
}
else if(b3==1){
suma+=3*pow(10,intentos);
delay(10);
intentos++;
digitalWrite(rojo_pin,HIGH);
delay(580);
digitalWrite(rojo_pin,LOW);
Serial.println("---------------");
Serial.println(3*pow(10,intentos-1));
Serial.println("---------------");
}
}
Serial.print("intentos ");
Serial.println(intentos);
Serial.print("contra: ");
Serial.println(contra);
Serial.print("suma: ");
Serial.println(suma);
// MOSTRAR AL USUARIO QUE SE EQUIVOCÓ
if(intentos>3){
intentos=0;
suma=0;
digitalWrite(rojo_pin,HIGH);
delay(100);
digitalWrite(rojo_pin,LOW);
delay(100);
digitalWrite(rojo_pin,HIGH);
delay(100);
digitalWrite(rojo_pin,LOW);
delay(100);
digitalWrite(rojo_pin,HIGH);
delay(100);
digitalWrite(rojo_pin,LOW);
delay(100);
}
Serial.println(" ");
}
Además de algunos casos del monitor en serie:
Contraseña "123"
intentos 0
contra: 0
suma: 0
intentos 0
contra: 0
suma: 0
intentos 1
contra: 3
suma: 0
intentos 1
contra: 3
suma: 0
intentos 1
contra: 3
suma: 0
intentos 1
contra: 3
suma: 0
intentos 1
contra: 3
suma: 0
intentos 1
contra: 3
suma: 0
intentos 2
contra: 23
suma: 0
intentos 2
contra: 23
suma: 0
intentos 2
contra: 23
suma: 0
intentos 2
contra: 23
suma: 0
intentos 2
contra: 23
suma: 0
intentos 2
contra: 23
suma: 0
intentos 3
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
intentos 0
contra: 122
suma: 0
---------------
3.00
---------------
intentos 1
contra: 122
suma: 3
intentos 1
contra: 122
suma: 3
intentos 1
contra: 122
suma: 3
intentos 1
contra: 122
suma: 3
intentos 1
contra: 122
suma: 3
intentos 1
contra: 122
suma: 3
intentos 1
contra: 122
suma: 3
---------------
20.00
---------------
intentos 2
contra: 122
suma: 23
intentos 2
contra: 122
suma: 23
intentos 2
contra: 122
suma: 23
intentos 2
contra: 122
suma: 23
intentos 2
contra: 122
suma: 23
intentos 2
contra: 122
suma: 23
intentos 2
contra: 122
suma: 23
---------------
100.00
---------------
intentos 3
contra: 122
suma: 122
intentos 3
contra: 122
suma: 122
intentos 3
contra: 122
suma: 122
intentos 3
contra: 122
suma: 122
Contraseña "321"
intentos 0
contra: 0
suma: 0
intentos 0
contra: 0
suma: 0
intentos 0
contra: 0
suma: 0
intentos 1
contra: 1
suma: 0
intentos 1
contra: 1
suma: 0
intentos 1
contra: 1
suma: 0
intentos 1
contra: 1
suma: 0
intentos 2
contra: 21
suma: 0
intentos 2
contra: 21
suma: 0
intentos 2
contra: 21
suma: 0
intentos 2
contra: 21
suma: 0
intentos 2
contra: 21
suma: 0
intentos 3
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
intentos 0
contra: 320
suma: 0
---------------
1.00
---------------
intentos 1
contra: 320
suma: 1
intentos 1
contra: 320
suma: 1
intentos 1
contra: 320
suma: 1
intentos 1
contra: 320
suma: 1
intentos 1
contra: 320
suma: 1
---------------
20.00
---------------
intentos 2
contra: 320
suma: 21
intentos 2
contra: 320
suma: 21
intentos 2
contra: 320
suma: 21
intentos 2
contra: 320
suma: 21
---------------
300.00
---------------
intentos 3
contra: 320
suma: 320
intentos 3
contra: 320
suma: 320
Muchas gracias por su atención ^^