Contador 0 - 99 con dos displays de 7 segmentos

Buenas!

Soy nueva en arduino y tengo que hacer el proyecto de realizar un contador de 0 a 99 segundos con dos displays de dos segmentos, utilizando ademas tres botones que sumen segundos, resten segundos, y reinicien el contador

genere el codigo de mil maneras y no logro darme cuenta de los errores que me faltan

Aqui adjunto el codigo

#define A 12
#define B 13
#define C 7
#define D 8
#define E 9
#define F 11
#define G 10
#define MAS 4
#define MENOS 3
#define RESET 5
#define UNIDAD A4
#define DECENA A5
#define APAGADO 0
#define TIMEDISPLAYON 10

int numero = 0;
int mas = 1;
int masAntes = 1;
int menos = 1;
int menosAntes = 1;
int reset = 1;
int resetAntes = 1;

void setup() 
{
  pinMode(MAS, INPUT_PULLUP);
  pinMode(MENOS, INPUT_PULLUP);
  pinMode(RESET, INPUT_PULLUP);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(UNIDAD, OUTPUT);
  pinMode(DECENA, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  iniciarContador(numero);
  
  int presionado = botonPresionado();

  if (presionado == MAS) {
    numero++;
    if (numero > 99)
      numero = 0;
  } else if (presionado == MENOS) {
    numero--;
    if (numero < 0)
      numero = 99;
  } else if (presionado == RESET) {
    numero = 0;
  }

   

  delay(25);
}

void verEnDisplay(int numero) {
  apagarTodosDisplays();

  switch(numero) {
    case 0:
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, HIGH);
      digitalWrite(D, HIGH);
      digitalWrite(E, HIGH);
      digitalWrite(F, HIGH);

      break;
    case 1:
      digitalWrite(B, HIGH);
      digitalWrite(C, HIGH);
      delay(25);
      break;
    case 2:
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(G, HIGH);
      digitalWrite(E, HIGH);
      digitalWrite(D, HIGH);
 
      break;
    case 3:
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(G, HIGH);
      digitalWrite(C, HIGH);
      digitalWrite(D, HIGH);

      break;
    case 4:
      digitalWrite(F, HIGH);
      digitalWrite(G, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, HIGH);

      break;
    case 5:
      digitalWrite(A, HIGH);
      digitalWrite(F, HIGH);
      digitalWrite(G, HIGH);
      digitalWrite(C, HIGH);
      digitalWrite(D, HIGH);

      break;
    case 6:
      digitalWrite(A, HIGH);
      digitalWrite(F, HIGH);
      digitalWrite(G, HIGH);
      digitalWrite(C, HIGH);
      digitalWrite(D, HIGH);
      digitalWrite(E, HIGH);

      break;
    case 7:
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, HIGH);

      break;
    case 8:
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, HIGH);
      digitalWrite(D, HIGH);
      digitalWrite(E, HIGH);
      digitalWrite(F, HIGH);
      digitalWrite(G, HIGH);
      break;
    case 9:
      digitalWrite(A, HIGH);
      digitalWrite(F, HIGH);
      digitalWrite(G, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, HIGH);

      break;
  }
}

void digitoEncendido(int numero) {
  if (numero == UNIDAD) {
    digitalWrite(UNIDAD, LOW);
    digitalWrite(DECENA, HIGH);
    delay(TIMEDISPLAYON);
  } else if (numero == DECENA) {
    digitalWrite(UNIDAD, HIGH);
    digitalWrite(DECENA, LOW);
    delay(TIMEDISPLAYON);
  } else {
    digitalWrite(UNIDAD, HIGH);
    digitalWrite(DECENA, HIGH);
  }
}

void iniciarContador(int numero) {
  digitoEncendido(APAGADO);
  verEnDisplay(numero / 10);
  digitoEncendido(DECENA);
  digitoEncendido(APAGADO);
  verEnDisplay(numero - 10 * ((int)numero / 10));
  digitoEncendido(UNIDAD);
}

int botonPresionado(void) {
  mas = digitalRead(MAS);
  menos = digitalRead(MENOS);
  reset = digitalRead(RESET);

  if (mas == 1)
    masAntes = 1;
  if (menos)
    menosAntes = 1;
  if (reset)
    resetAntes = 1;

  if (mas == 0 && mas != masAntes) {
    masAntes = mas;
    return mas;
  }
  if (menos == 0 && menos != menosAntes) {
    menosAntes = menos;
    return menos;
  }
  if (reset == 0 && reset != resetAntes) {
    resetAntes = reset;
    return reset;
  }
  return 0;
}

void apagarTodosDisplays() {
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
}

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @getwsoon.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Esto no está bien

if (numero == UNIDAD) {

pero

#define UNIDAD A4

estás comparando el dígito a mostrar con un número de pin.
Lo mismo ocurre con DECENA.

Falta definir el pin B (13) como salida.

El código tal como lo has organizado resulta confuso.
Por ej., se espera que iniciarContador() haga justamente eso, nada más, en cambio hace todo el manejo del display (o eso es lo que parece)

como deberia hacer esa condicion entocnes?

He reformado tu código usando una librería que lo hace todo muy facil.
Se llama SevSeg.h y la tienes en tu gestor de librerías.

/* 
    SevSeg Counter Example
*/

#define MAS         4
#define MENOS   3
#define RESET      5
#define UNIDAD A4
#define DECENA A5
#define APAGADO 0
#define TIMEDISPLAYON 10

#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object

int numero    = 100;
int mas           = 1;
int masAntes  = 1;
int menos = 1;
int menosAntes = 1;
int reset = 1;
int resetAntes = 1;

byte numDigits    = 3;
byte digitPins[]  = {UNIDAD, DECENA};
byte segmentPins[] = {12, 13, 7, 8, 9, 11, 10};

bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected

void setup() {

  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  updateWithDelays, leadingZeros, disableDecPoint);
  sevseg.setBrightness(90);
  iniciarContador(numero);

  pinMode(MAS, INPUT_PULLUP);
  pinMode(MENOS, INPUT_PULLUP);
  pinMode(RESET, INPUT_PULLUP);
  Serial.begin(115200);
}

void loop() {
  static unsigned long timer = millis();
  static int deciSeconds = 0;

  botonPresionado();

  sevseg.setNumber(numero, 1);
  sevseg.refreshDisplay(); // Must run repeatedly
}

void iniciarContador(int numero) {
  sevseg.setNumber(numero, 2);
}

void botonPresionado(void) {
  delay(10);
  mas = digitalRead(MAS);
  if (mas && !masAntes) {
      if(numero++>999) numero = 999;
      Serial.println((numero));
  }
  masAntes = mas;
  menos = digitalRead(MENOS);
  if (menos && !menosAntes) {
      if(numero--<1) numero = 0;
      Serial.println((numero));
  }
  menosAntes = menos;
  
  reset = digitalRead(RESET);
  if (reset && !resetAntes) {
      numero = 0;
      Serial.println((numero));
  }
  resetAntes = reset;
  

}

Buenas, preciso ayuda con este proyecto.. Es realizar un contador de 0 a 99 con dos displays de 7 segmentos y con un deslizador, si el deslizador se encuentra de un lado debe aumentar numeros primos y si esta del otro debe aumentar numeros enteros... engo el problema de que no logran prenderse bien la unidad y la decena, la logica si no me equivoco esta correcta pero no puedo solucionar lo de que se prendan bien...

Por favor ayuda

#define A 10
#define B 11
#define C 5
#define D 6
#define E 7
#define F 9
#define G 8

#define INTERRUPTOR 2
#define UNIDAD A4
#define DECENA A5
#define APAGADOS 0
#define TIMEDISPLAYON 10

// VARIABLES
int numeroPrimo = 2;   // Guarda el valor del numero primo
int numero = 0;        // Guarda el valor del contador
int numeroUnidad = 0;  // Guarda el estado de la UNIDAD
int numeroDecena = 0;  // Guarda el estado de la DECENA
int posicionSwitch = 0;

// FUNCION: SETUP
// La funcion tiene el objetivo configurar y asignar los pines 

void setup() {
    pinMode(2, INPUT_PULLUP); //INTERRUPTOR
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(UNIDAD, OUTPUT);
    pinMode(DECENA, OUTPUT);
    digitalWrite(UNIDAD, 0);
    digitalWrite(DECENA, 0);
    verEnDisplay(0);
}

void loop() {
    int posicionSwitch = digitalRead(INTERRUPTOR);

    switch (posicionSwitch) {
        case 0: {
        

            if (numero < 100) {
                numero++;
            }

            iniciarContadorEntero(numero);
            delay(1000);
            break;
        }

        case 1: {
            numeroPrimo++;
            if (numeroPrimo > 97) {
                numeroPrimo = 0;
            }
            if (esPrimo(numeroPrimo)) {
                iniciarContadorPrimo(numeroPrimo); // Llamada a la función displayNumeroPrimo
                delay(1000); // Ajusta el tiempo según lo que necesites
        }
    }
  }
}

// FUNCION: VER EN DISPLAY
// La funcion tiene como objetivo el manejo de los segmentos del
// display dependiendo del numero del contador (UNIDAD Y DECENA)        
         
         
void verEnDisplay(int numero){
    apagarDisplays();
    switch (numero){
      case 1:
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        break;
      case 2:
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(E, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(G, HIGH);
        break;
      case 3:
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(G, HIGH);
        break;
      case 4:
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
        break;
      case 5:
        digitalWrite(A, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
        break;
      case 6:
        digitalWrite(A, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, HIGH);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
        break;
      case 7:
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        break;
      case 8:
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, HIGH);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
        break;
      case 9:
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
        break;
      default:
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, HIGH);
        digitalWrite(F, HIGH);
        break;
    }
}

// FUNCION: INICIAR CONTADOR
// La funcion tiene como objetivo pasarle a los display  
// el numero que debe mostrar a traves de los segmentos 

void iniciarContadorEntero(int numero)
{	
    digitalWrite(UNIDAD, HIGH);
    digitalWrite(DECENA, HIGH);
    verEnDisplay(numero - (numero / 10) * 10);
    digitoEncendido(UNIDAD);
  	digitoEncendido(APAGADOS);
  
    digitalWrite(UNIDAD, HIGH);
    digitalWrite(DECENA, HIGH);
    verEnDisplay(numero / 10);
    digitoEncendido(DECENA);
  	digitoEncendido(APAGADOS);
  
}

void iniciarContadorPrimo(int numeroPrimo) {
  digitalWrite(UNIDAD, HIGH);
  digitalWrite(DECENA, HIGH);
  verEnDisplay(numeroPrimo % 10);  //UNIDADES
  digitoEncendido(UNIDAD);
  digitalWrite(UNIDAD, HIGH);
  digitalWrite(DECENA, HIGH);
  verEnDisplay(numeroPrimo / 10);  //DECENAS
  digitoEncendido(DECENA);
}

// FUNCION: DIGITO ENCENDIDO
// La funcion tiene como objetivo controlar la visualizacion de 
// los displays a traves de la UNIDAD y DECENA, apagando y 
// prendiendo los mismos dependiendo el numero a mostrar
         

void digitoEncendido(int numero) {

  if (numero == UNIDAD)
  {
    digitalWrite(UNIDAD, LOW);
    digitalWrite(DECENA, HIGH);
    delay(TIMEDISPLAYON);
  }
  else
  {
    digitalWrite(DECENA, LOW);
    digitalWrite(UNIDAD, HIGH);
    delay(TIMEDISPLAYON);
  }
}

  
void apagarDisplays() {
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(F, LOW);
    digitalWrite(G, LOW);
}

         
//FUNCION: ES PRIMO
bool esPrimo(int numero) {
    if (numero <= 1) {
        return false;
    }

    for (int divisor = 2; divisor * divisor <= numero; ++divisor) {
        if (numero % divisor == 0) {
            return false;
        }
    }

    return true;
}

image

Creo que es la 2da vez que doble posteas.
Voy a verificar antes de emitir algun juicio.
Este es tu hilo general.

Son proyectos distintos

Que tienen de distinto?
Dos display, un contador hasta 99 por favor, no me tomes por tonto.

el que subi es con botones y este es con un deslizador, estoy pidiendo ayuda simplemente...

A ver, el sentido es el mismo
1 dos 3 botones y si son 4 botones vas a preguntar lo mismo?
No entiendes como funciona el foro, entonces te lo explico.
Temas similares van en el mismo hilo.
Pregunta todo lo que quieras y de todas las variantes posibles en el mismo hilo o será considerado como doble posteo.
Léete las normas del foro.
Si tienes dudas me preguntas por privado.
Ahora junto los temas.

este es de solamente un desliazdor, entiendo que seria distinto... Podrias ayudarme con mi problema por favor? No generare mas doble posteos

Probaste lo que te hice en el post#5?

lo que pasa es que no puedo usar librerias, debo utilizar todo default por como lo deasrrolle, el primer proyecto de 3 botones ya lo pude solucionar sin problemas viendo el error con profesores,

Este es la segunda parte de ese proyecto y es refactorizarlo sin exportar ninguna libreria.. solamente un deslizador que aumente o disminuya numeros enteros o primos de forma automatica...

En ninguno de los post dices que no puedes usar librerías asi que no somos adivinos.
Pregunta puedes usar matrices o arreglos? Digo porque respetando el no usar librerías lo siguiente es usar arreglos uni o bidimensional pero si no sabes sería muy obvio que te lo han hecho.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.