Problema con 3 botones

Saludos tengo un problema con un programa, no sé cómo abordarlo, lo que debe hacer el programa es monitorear 3 botones, y 2 canales del ADC

Solo si pulso el botón A debe leer los dos canales del ADC y mandar un pwm por alguna salida del arduino

Si pulso el botón B o C debe variar el pwm +/-

Si pulso 5 veces seguidas el botón A mientras está "encendido", debe apagar el micro o mandarlo a inactivo si son menos pulsaciones o son muy espaciadas las pulsaciones, solo leé los ADC y manda el pwm cada que precionas el botón

Si pulso 5 veces seguidas el botón A mientras está en idle o apagado debe prenderse

Todo se visualiza en una pantalla oled de 128x 32

El problema es que no sé cómo plantear la parte de encender y apagar con las 5 pulsaciones seguidas

Las demás partes para controlar el pwm, la pantalla y el ADC ya funcionan solo me falta la parte de encender y apagar el Arduino

?
Use English in this section or post in the section using Your wanted language.

Muy bien!! Ahora dinos que has hecho hasta ahora porque lo que planteas es básico, leyendo un libro o tutoriales lo resuelves.

2 cosas:

  1. Si posteas en el foro en inglés, usa ese idioma, no español. Cada idioma (en general) tiene su sección específica en International.
  2. y por favor, lee las Normas del foro.

Estaba pensando en usar un timer 0 o 2 y un contador, inicializar el timer cada vez que se preciona el botón y comparar si hay otra pulsación antes de que se desborde, si no hay pulsación resetear el contador a cero y realizar el bucle principal con normalidad si llega a 5 pulsaciones apague la pantalla y mande al micro a modo bajo consumo, otra duda es como despierto al micro con las 5 pulsaciones del mismo botón, ¿Debe ser con una interrupción por hardware?

En la noche adjunto el código

Un Arduino despierta con una Interrupcion en un pin, generalmente pin 2 o 3 que son las que estan directamente indicadas para UNO/NANO.
Ahora bien, no serán 5 pulsaciones, sino 1.

5 pulsaciones con un timer? Es que deben ser pulsaciones dentro de un cierto tiempo y 5 pulsaciones y ya? Son cosas diferentes.

Si pones algo asi

bool estado, estadoAnt = false;
byte contador = 0;

if (estado && estadoAnt) {
   contador++;
   if (contador > 5) {
      contador = 0; //
      // accion que corresponde a las 5 pulsaciones.
  }
}
estadoAnt = estado;

esto funcionará

es correcto pero lo que quiero es que sean 5 pulsaciones seguidas, si pulsas 2 veces seguidas y luego esperas 1 segundo y luego das las 3 restantes, no se activara o desactivara

esto es en lo que llevo hace algo parecido a lo que quiero pero no se si sea la forma mas eficiente de

volatile byte count = 0;
volatile long time_act=0;
bool power_on_off=true;
const byte ledPin = 13;
const byte interruptPin = 2;
const byte pulsador = 5;
long time_th=50 ;
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT);
  pinMode(pulsador,INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), pulsar, RISING);
}
void loop() {
    if (power_on_off==true)//bandera para saber si esta encendido o apagado
    {
      if (digitalRead(pulsador)==true)// si se preciona el boton activa la salida
      {
        digitalWrite(ledPin,true);
      }
      else
      {
        digitalWrite(ledPin,false);//si no se preciona el boton apaga la salida
      }
    }
    else
    {
      digitalWrite(ledPin,false);
      //apagado
    }
      if (time_act >= time_th) 
      {
        count=0;
      }
      if(count>=4)
      {
        power_on_off=!power_on_off;
        count=0;
      }
      time_act++;
      delay(10);
}
void pulsar() { //si pasa de un alto a bajo count aunmenta y pone la bandera flagpulso en alto
  count++;
  time_act=0;
}

chong_one:
Si pulso 5 veces seguidas el botón A mientras está en idle o apagado debe prenderse

Debes definir que son para ti 5 veces seguidas porque el Arduino es muy rapido y debe saber cuanto tiempo debe esperar por esa ocurrencia.

Podría ser 5 pulsaciones en un total maximo de 15 segundos o podrías definir que máximo debe haber 3 segundos entre una pulsación y la siguiente.

si defini que menos de medio segundo entre pulsaciones son pulsaciones seguidas

estoy trabajando para que sea el timer 2 el que lleven la cuenta del tiempo transcurrido entre pulsaciones y en la interrupción por desbordamiento meter una bandera y asi saber cuando a pasado el tiempo time_th y asi tener libre el loop principal para realizar las demás tareas
en cuanto termine lo posteare para que me digan si se puede mejorar alguna cosa

Para que te complicas usando timer si con millis() te sobra para detectar pulsaciones en el tiempo que has comentado.

Por ejemplo algo asi podría servirte, detectando el flanco:

bool actual,anterior;
byte contador;
unsigned long t;

if (actual && !anterior) {
   if (millis()-t < 3000){
      if (contador < 5) {
         contador++;
      }else{
         //Ya hay 5 pulsaciones seguidas
      }
   }else
      contador = 1;   //Es la primera pulsación
   }
   t = millis();      //Guarda tiempo para comparar en próxima vez
}
anterior = actual;

Saludos Kike la idea es que pueda estar haciendo otras cosas y no depender de milis () ya que he tenido problemas con actualizar otros datos en la pantalla oled y la lectura de otros botones y creo que se me hace más cómodo usar la interrupción y disponer de todo el micro en el loop principal
Sigo trabajando en el programa

Estas confundiendo millis() con delay(). Justamente te recomendamos usar millis() porque NO DETIENE el loop() que seguirá corriendo ejecutando otras instrucciones miles de veces por segundo.