Arduino UNO - Programa de calculadora [SOLUCIONADO]

Hola! Llevo poco tiempo en el mundo de Arduino y estoy intentando hacer un programa que se me está atragantando, la idea es hacer una calculadora que solo suma usando únicamente un Display 1-7 y tres pulsadores a modo de interfaz.

En mi cabeza la idea tenía buena pinta, he montado los componentes para tener una mejor visual de la idea pero cuando me he puesto con el código me he dado cuenta de que aún no tengo los conocimientos necesarios de programación para realizarlo, he intentado algo pero no se si voy por buen camino.

Esta es la idea que llevo en mente:

VALOR1 + VALOR2 = RESULTADO

Pulsador 1 // Por defecto deja que modifiquemos el VALOR1, si pulsamos pasamos al VALOR2 y si le damos otra vez procede a mostrarnos el resultado de la suma.

Pulsador 2 // En el valor en el que nos encontremos, resta una unidad.
Pulsador 3 // En el valor en el que nos encontremos, suma una unidad.

Así es como lo tengo montado:
https://drive.google.com/open?id=16AvVp-2DzwFut9IwvzyBFBJBiXj8H83m

Y aqui donde me ha hecho BOOM la cabeza:

// Calculadora (solo suma)
// Constantes pines
  int PULSADOR1 = 10;
  int PULSADOR2 = 11;
  int PULSADOR3 = 12;
  int C1 = 0; //P1
  int C2 = 0; // P2
  int C3 = 0; // P3
  int M = 0; // Modo
  
  int VALOR1 = 0;
  int VALOR2 = 0;
  int RESULTADO = 0;

  byte numero [10][10] =
{
{ 1, 1, 1, 1, 1, 1, 0, 0 }, // 0
{ 0, 0, 0, 0, 1, 1, 0, 0 }, // 1
{ 1, 1, 0, 1, 1, 0, 0, 1 }, // 2
{ 0, 1, 0, 1, 1, 1, 0, 1 }, // 3
{ 0, 0, 1, 0, 1, 1, 0, 1 }, // 4
{ 0, 1, 1, 1, 0, 1, 0, 1 }, // 5
{ 1, 1, 1, 1, 0, 1, 0, 1 }, // 6
{ 0, 0, 0, 1, 1, 1, 0, 0 }, // 7
{ 1, 1, 1, 1, 1, 1, 0, 1 }, // 8
{ 0, 0, 1, 1, 1, 1, 0, 1 }, // 9
};
  
void setup() {
  Serial.begin(9600);
  pinMode(PULSADOR1, INPUT);
  pinMode(PULSADOR2, INPUT);
  pinMode(PULSADOR3, INPUT);
}

void loop() {
  C1= digitalRead(PULSADOR1);
  C2= digitalRead(PULSADOR2);
  C3= digitalRead(PULSADOR3);
  
  if (C1 == HIGH){}
}

¿Alguna idea de cómo podría resolver el programa?

Un saludo!

Rubén.

20180715_025310.jpg

Lo primero recordarte que en cada uno de los pines digitales 10, 11 y 12 debes poner una resistencia pull-up de 10K para que este en HIGH mientras no esta presionado el botón correspondiente o cambiar las lineas del setup() asi:

const byte PULSADOR1 = 10;
const byte PULSADOR2 = 11;
const byte PULSADOR3 = 12;

void setup(){
   Serial.begin(115200);
   pinMode(PULSADOR1, INPUT_PULLUP);
   pinMode(PULSADOR2, INPUT_PULLUP);
   pinMode(PULSADOR3, INPUT_PULLUP);
}
void loop(){
   Serial.println("Aqui tu codigo");
}

Mi idea inicial era mantener los pulsadores en reposo en LOW y aprovecharme del momento HIGH al pulsarlos para modificar los valores, el circuito físico está montado en pull-down.

¿Qué cambia de poner ‘int’ a ‘const byte’?

Si usas un sólo display ¿como harás si la suma te da una valor de dos cifras? ¿No sería mejor utilizar otro tipo de componentes como teclados y alguna lcd?

Tal como veo los códigos expuestos darían problemas. He estado viendo códigos de algunos compañeros en el foro y tienen razón. Da igual si lo pones cómo input o cómo input_pullup. Si no pones las resistencias y haces una parada de tiempo en el código da problemas si tadas un poco más o un poco menos en soltar el botón. Uniendo los dos métodos los botones funcionan cómo deben.

Revisa algunos códigos de otros temas donde usan millis(). A mí me sirven para aprender.

Conseguido!!

// Calculadora (solo suma)
// Constantes pines
  int PULSADOR1 = 10;
  int PULSADOR2 = 11;
  int PULSADOR3 = 12;
  int C1 = 0; //P1
  int C2 = 0; // P2
  int C3 = 0; // P3

  int VALOR1 = 0;
  int VALOR2 = 0;
  int RESULTADO = 0;

  byte numero [10][8] = // Config números 1 al 9
{
{ 1, 1, 1, 1, 1, 1, 0, 0 }, // 0
{ 0, 0, 0, 0, 1, 1, 0, 0 }, // 1
{ 1, 1, 0, 1, 1, 0, 0, 1 }, // 2
{ 0, 1, 0, 1, 1, 1, 0, 1 }, // 3
{ 0, 0, 1, 0, 1, 1, 0, 1 }, // 4
{ 0, 1, 1, 1, 0, 1, 0, 1 }, // 5
{ 1, 1, 1, 1, 0, 1, 0, 1 }, // 6
{ 0, 0, 0, 1, 1, 1, 0, 0 }, // 7
{ 1, 1, 1, 1, 1, 1, 0, 1 }, // 8
{ 0, 0, 1, 1, 1, 1, 0, 1 }, // 9
};
  
void setup() {
  Serial.begin(9600);
  pinMode(PULSADOR1, INPUT); // Config pulsadores como Imput
  pinMode(PULSADOR2, INPUT);
  pinMode(PULSADOR3, INPUT);
    for (int i = 2; i < 10; i++){ // Config todos los Output del Display
    pinMode(i, OUTPUT);}
}

void loop() {
  C1= digitalRead(PULSADOR1);
  C2= digitalRead(PULSADOR2);
  C3= digitalRead(PULSADOR3);
if (C3 == HIGH) {VALOR1++;}
    else if (C2 == HIGH) {VALOR1--;}
  for (int e = 0; e <9; e++){
      digitalWrite(e + 2, numero[VALOR1][e]);}
      delay(250);
    if (C1 == HIGH){segunda();}
}
void segunda(){
bucle1:
  C1= digitalRead(PULSADOR1);
  C2= digitalRead(PULSADOR2);
  C3= digitalRead(PULSADOR3);
if (C3 == HIGH){VALOR2++;}
    else if (C2 == HIGH) {VALOR2--;}
  for (int a = 0; a <9; a++){
      digitalWrite(a + 2, numero[VALOR2][a]);}
      delay(250);
    if (C1 == LOW) {goto bucle1;}
    else if (C1 == HIGH){resultado();}
}
void resultado() {
  bucle2:
    C1= digitalRead(PULSADOR1);
  RESULTADO= (VALOR1 + VALOR2);
     for (int u = 0; u <9; u++){
      digitalWrite(u + 2, numero[RESULTADO][u]);}
      delay(250);
          if (C1 == LOW) {goto bucle2;}
    else if (C1 == HIGH){loop();}
  }