Restador a infinito

Buenas, estoy empezando con el Arduino por un proyecto de la universidad y tengo un problema. Básicamente el proyecto consiste en un separador de monedas de 50 cents, 1 y 2 euros. Las monedas se separan, y se cuenta cuando cae cada una mediante un LED y una fotorresistencia. Cuando queremos expulsar una moneda pulsamos uno de los tres pulsadores.

La parte de contar el numero de monedas que caen la hace perfectamente, pero luego cuando mantengo el pulsador para que expulse una moneda el contador empieza a restar como un loco. ¿Podría alguien ayudarme a que aunque mantenga pulsado el pulsador solo me descuente una moneda?
Aquí adjunto la parte del programa:

if(analogRead(led1) >= 600){ //detecta el paso de una moneda de 1 euro y la suma
 count3=count3+1;

  Serial.println("Monedas de 1 euro: ");
  Serial.println(count3);
 delay(500);
 }

while(digitalRead(pulsador1) == LOW){ //debería de restar una moneda cuando pulse el pulsador
count3=count3-1;
Serial.println("Monedas de 1 euro: ");
Serial.println(count3);
}

Hola! Tu problema es porque estas usando una sentencia que dice que mientras el boton este pulsado se reste un entero a la variable count3, recuerda que el bucle se ejecuta muchísimas veces por segundo, es por eso que te hace miles de restas cuando presionas el pulsador eso ademas de los rebotes del pulsador. Quita el “while” y reeemplazalo por un “if” Prueba esto:

boolean estado_pulsador1=true;        //tienes que agregar estas 2 variables
boolean estado_ant_pul=true;           // en estas se guarda el estado del pulsador

//void loop
 
if(analogRead(led1) >= 600){ //detecta el paso de una moneda de 1 euro y la suma
  count3=count3+1;

   Serial.println("Monedas de 1 euro: ");
   Serial.println(count3);
  delay(500);
  }
 //AQUI ESTA LO QUE CAMBIE DE TU CODIGO

estado_pulsador1=digitalRead(pulsador1);
 
 if (estado_pulsador1 != estado_ant_pul){       //se presiono el boton
    if (estado_pulsador1==false){               //supongo que estas usando el boton en pull-up
       count3--;                                   //Esto es lo mismo que count3=count3-1;
       Serial.println("Monedas de 1 euro: ");
      Serial.println(count3);
     }
     estado_ant_pul=estado_pulsador1;
     if (count3 < 0)                                //esto es para evitar que te de numeros negativos
         count3=0; 
       delay(100); 
}

Cuando tengas una consulta es mejor poner el código completo para localizar mas fácil los errores, ah y recuerda usar etiquetas, lee las normas del foro (no tarda en decírtelo surbyte :slight_smile: )
Salu2

La forma que debes usar es ver la transición del pulsador.
Cuando éste cambia de 0 a 1 o 1 a 0. No he mirado tu programa.

Para ello debes mantener el estado anterior del pulsador. Cómo lo haces?
Ahora consultas si el estado anterior es distinto al actual. Pregunta si es tal estado y si el anterior es el opuesto
Lo haces solo cuando vas a incrementar el contador. Si lo mantienes presionado eso sumara solo 1 vez.

 estado_pulsador1=digitalRead(pulsador1);
 
 if (estado_pulsador1 && !estado_ant_pul){       //se presiono el boton
       count3--;                                   //Esto es lo mismo que count3=count3-1;
       Serial.println("Monedas de 1 euro: ");
       Serial.println(count3);
     }
     estado_ant_pul=estado_pulsador1;

eso decrementa 1 vez al pasar el puslador de 0 a 1

Ahora veo, este modo es mas eficiente y ahorra lineas de código, de ahora en adelante usare esa forma.

Gracias Surbyte.