Contador con arduino 2 displays, 2 pulsadores y un potenciomestro

Muy buenos días (o noches) a todos, dependiendo de la parte del planeta en la que os encontréis. Necesito ayuda con un proyecto en arduino que estoy haciendo. Tengo una protoboard con 2 displays de 7 segmentos controlados por dos pulsadores. Uno es para START/STOP y otro para PAUSE. Estos dos pulsadores controlan 2 los 3 displays , el primero de los digitos indica las decenas y el segundo las unidades, el tercero es fijo y muestra siempre el numero 0. El problema se me presenta porque además quiero añadir un potenciometro que al girarlo cambiase los dígitos de los 2 primeros displays entre 00 y 99 en cualquier momento de la simulación. La siguiente imagen muestra el proyecto montado con el potenciometro:

El código que tengo actualmente para el contador es el siguiente:

// --- Mapeado de Hardware ---
#define DISPLAY_1   9 
#define DISPLAY_2  10   
#define START_STOP 11   
#define RESET  12  

int display7seg(int number);
void reset();
void multiplex(int value);
bool hasClickStoped();

int dez, // decena
    uni, // unidad
    counter = 0;   

bool stoped = false;
unsigned long timeStart, timeEnd = 0;

void setup()
{
  for(char i= 0; i< 7; i++) pinMode(i, OUTPUT); // Salidas Display 7Seg (PORTD)
  for(char k=11; k<13; k++) pinMode(k, INPUT_PULLUP); // Entrada pulsadores
  for(char j= 9; j<11; j++) pinMode(j, OUTPUT); // Salidas (comutador display)
  digitalWrite(DISPLAY_1, LOW);
  digitalWrite(DISPLAY_2, LOW);
 
}

void loop()
{
  timeStart = millis();	
  multiplex(counter);
  verifyReset();
  if(!hasStoped() && timeStart - timeEnd > 1000) {
    if(counter < 59) {
       counter++;
    }  else {
      counter = 0;
    }
    timeEnd = timeStart;
  }  
}


int display7seg(int number)
{
  
  //Declaracion e inicializacion del vector segmento
  int segmento[10] = {0x3f,   //Dato referente al BCD '0'
                      0x06,   //Dato referente al BCD '1'                      0x5b,   //Dado referente ao BCD '2'
                      0x4f,   //Dato referente al BCD '3'
                      0x66,   //Dato referente al BCD '4'
                      0x6d,   //Dato referente al BCD '5'
                      0x7d,   //Dato referente al BCD '6'
                      0x07,   //Dato referente al BCD '7'
                      0x7f,   //Dato referente al BCD '8'
                      0x67};  //Dato referente al BCD '9'
  
  return segmento[number];  
} 

void verifyReset() {
  if(digitalRead(RESET)){
    counter = 0; 
    timeEnd = timeStart;
  }
}

bool hasStoped() {
  if(digitalRead(START_STOP)){
   stoped = !stoped; 
   delay(3); 
  }

  return stoped;
}

void multiplex(int value)
{
   dez = value/10;
   PORTD = display7seg(dez);
   digitalWrite(DISPLAY_1, HIGH);
   delay(5);
   digitalWrite(DISPLAY_1, LOW);

   uni = value%10;
   PORTD = display7seg(uni);
   digitalWrite(DISPLAY_2, HIGH);
   delay(15);
   digitalWrite(DISPLAY_2, LOW);
  
  
}

Y el código del potenciometro que me querría añadir seria algo parecido a esto:

int unidade;
int dezena;

int pinounidade[]={8,7,6,5};
int pinodezena[]={12,11,10,9};

int numero[10][4] ={
{ 0, 0, 0, 0},//0
{ 0, 0, 0, 1},//1
{ 0, 0, 1, 0},//2
{ 0, 0, 1, 1},//3
{ 0, 1, 0, 0},//4
{ 0, 1, 0, 1},//5
{ 0, 1, 1, 0},//6
{ 0, 1, 1, 1},//7
{ 1, 0, 0, 0},//8
{ 1, 0, 0, 1} //9
};
void setup()
{
Serial.begin(960);
}

void loop()
{
  int valor = analogRead(A1);
  valor = map(valor, 0, 1024, 99, 0); 
  dezena = valor * 0.1;
  unidade = valor % 10;
  for( int i = 0; i < 4; i++){
    digitalWrite(pinounidade[i],numero[unidade][i]);
    digitalWrite(pinodezena[i],numero[dezena][i]);
    }
   delay(500);
}

Muchisimas gracias por adelantado a todos. Soy un neófito total y absoluto en el tema y seria de grandisima ayuda que alguien me echase un cable con esto. Intenté hacerlo mediante el CHAT de OPENAI pero no habia manera, con lo cual creo que mejor hablar con personas directamente que con maquinas

?????????????

No tengo ni idea. Lo he copiado de otro proyecto​:grimacing::person_facepalming:

Moderador:
Por favor, lee las Normas del foro y en particular el punto 5 sobre como poner títulos y qué palabras no usar.
Por esa razón edité tu título.

Reemplaza

Serial.begin(960);

por

Serial.begin(9600);

Con buscar algo sobre Arduino sabrías cuales son las velocidades de comunicación.
No existe un solo tutorial que enseñe Arduino que no use Serial.begin(BAUDIOS) en algún eketch.
Y con intentar abrir el monitor serie también descubrirías que no existe 960 como velocidad de comunicación serie.
No solo debes copiar y pegar, intenta entender y si no entiendes, Internet (Youtube para ser mas didáctico) y este foro en la sección Documentación estan llenos de tutoriales de todo tipo. Incluso sugerencia de libros.

Respecto de lo que quieres hacer explícate mejor.

Cual es la idea de cambiar con un potenciómetro el valor que muestan los digitos.
A ver..
Supongamos que le das start
y vas leendo 14 15 16 aca viene el problema y es es como determinas cuando ingresas algo del potenciómetro y cuando dejas de hacerlo?
Lo primero que debes saber es que el ADC del Arduino mostrará valores variables entre 0 - 1023 que será convertidos a 0-99 eso esta claro.
Pues usar map para eso en algo asi

number = map(analogRead(A0, 0, 1023, 0, 99);

eso en principio te mostrará el estado el potenciometro de 0 -99 pero aca la pregunta, cuando introduces esto y cuando no?
Si el potenciometro no se mueve tal vez el valor que presente sea estable, asi que imaginemos que estas en 40, tal vez lo que quieres es que al modificarse esa posición muestre el núevo número?

Si. Disculpa... Me expliqué mal. La idea es que cuando el contador esté parado y en 0. Se pueda mover el potenciómetro hasta un número x, y que empiece la cuenta al pulsar el pulsador de inicio en ese número. No sé si esta vez me he explicado bien...

Ahh ok. esa es otra cosa, ya estableces que esta parado y entonces se puede tener en cuenta el potenciómetro.
De todos modos, en cuanto este parado necesitas otro pulsador para que tome el valor del potenciómetro sino no existirá el 0.
Cuando lo pares, automáticamente marcaría algo dado por el potenciómetro si no tienes cómo decirle que debe leer el dato del pote.

Muchísimas gracias. Ahora ya lo tengo más claro :relaxed::relaxed::relaxed:

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