Proyecto telefonillo

Mi proyecto consiste en: Conectar un relé a la zumbador del telefonillo para poder contar los pulsos y hacer diferentes acciones.
-Al presionar el botón del telefonillo de la calle 4 veces.El arduino contará los 4 pulsos y hará que un relé conectado al botón de abrir la puerta se active durante 3 segundos.

-Al presionar el botón del telefonillo 5 veces.El arduino los contará y enviará la señal a otro relé conectado al mando de garaje para que se abra la puerta del garaje comunitario.

Mi problema es que no se hacer el código, porque tiene que interpretar si le voy a dar 4 veces o 5 esperar unos segundos y realizar la acción y pasados unos segundos se reinicie el contador. Porque sino cuando pulse 5 veces también se hará la función de las 4 veces.

Otro problema que he tenido en las pruebas es que al utilizar como pulsador el relé el contador se vuelve loco y deja de funcionar el programa.

Soy muy nuevo en esto de arduino y ya se que estoy pidiendo mucho y pido perdón por ello, pero si alguien me puede ayudar lo agradecería mucho.

Hola, para empezar pon tu codigo asi facilitaras que se te ayude porque sino no sabemos de que estamos hablando.
respecto a lo del codigo de las 4 o 5 pulsaciones primero cuenta y pasado el tiempo mira el contador asi decides si son 4 o 5, si ejecutas directamente al contar 4 es logico que te haga el codigo para 4 y al pulsar la 5 te haga la otra acción.

Dystrom:
Hola, para empezar pon tu codigo asi facilitaras que se te ayude porque sino no sabemos de que estamos hablando.
respecto a lo del codigo de las 4 o 5 pulsaciones primero cuenta y pasado el tiempo mira el contador asi decides si son 4 o 5, si ejecutas directamente al contar 4 es logico que te haga el codigo para 4 y al pulsar la 5 te haga la otra acción.

hola muchas gracias por contestar. mi código es este:

int ledPinl = 8;
int ledPin2 = 9;
int conta=0;
int inputPin = 4;
int estadoCero = 0;

void setup()
  { Serial.begin(9600);
    pinMode (4, INPUT);
    pinMode (8, OUTPUT);
    pinMode (9, OUTPUT);
  }

void loop()
  {int pl = digitalRead(inputPin);
  if(pl!=estadoCero){
    if(pl==HIGH)
  {
   conta++;
   Serial.println(conta);
  }
 }
 estadoCero=pl;
 if (conta==4){
    digitalWrite(ledPinl, HIGH);
    delay (4000);
    digitalWrite(ledPinl, LOW);
    conta=0;
 }
  if (conta==5){
    digitalWrite(ledPin2, HIGH);
    delay (2000);
    digitalWrite(ledPin2, LOW);   
    conta=0;
 }
}

Sigo sin saber como hacer para que se ejecute la parte de 5 pulsaciones y no solo la de 4.
PD: Soy bastante noob.

Te voy respondiendo en la medida que vea los errores.
este inmediatamente a cambiarlo.

void loop() {

  const byte pl = digitalRead(inputPin);

no puedes poner constante la lectura de un sensor!!!!!

reemplaza por

 byte pl = digitalRead(inputPin);

prueba y nos cuentas.

haz de hacer que las pulsaciones se hagan en un tiempo, sino puedes pulsar una vez cada dia y el 4 dia te haría lo de la cuarta pulsacion y esto no tiene logica. yo lo que haria es que las pulsaciones se hagan por ejemplo en 3 segundos a partir de la primera pulsacion. Para hacerlo haz que al pulsar por primera vez guarda un valor de millis en una variable y pasados 3 segundos miras el contador y entras en la comparación que has hecho, si es 4 que haga una cosa, si es 5 que haga otra y si es un valor diferente que ponga el contador a cero y espere una nueva pulsacion para empezar de nuevo. lo entiendes mejor ahora?

No sabe como hacerlo.

puede que no sepa pero le servira de guía, lo que no puede esperar es que nadie ponga el codigo haciendole el trabajo, la "gracia" es aprender.
DavidCM99 si evolucionas el codigo y te salen dudas ya sabes.

Muchas gracias por responder. Después de un buen rato investigando he encontrado la manare de que funcione.
Lo único malo es que cuando sustituyo el pulsador por un relé accionado por otro pulsador simulando el telefonillo, el monitor serial deja de contar y se queda pillado y el programa empieza a funcionar mal y no me deja subir nada. Si quito el usb y lo vuelvo a poner vuelve a funcionar correctamente.

El código utilizado es este:

int botonEstado = 0;
int botonAnterior = 0;
int status = 0;
int x=0;
int conta = 0;
boolean compareTo = false;
void setup(){
 Serial.begin(9600);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 
 pinMode(4, INPUT);

}
void loop(){


           
               while(true){
                   botonEstado = digitalRead(4);
                      
                      
                      if (botonEstado == HIGH && botonAnterior == LOW) {
                             status = status + 1;      
                             delay(200);
                             Serial.print("Pulso");
                       }
                       
                   x=conta%2;
                         
                         
                      if(status != 0 && x==0 && conta==80){  
                           
                           compareTo=true;
                           Serial.println(status);
                           break;
                  
                         }
                 
                      if(status != 0){
                        delay(20);
                         conta++;
                       }

                   botonAnterior = botonEstado;

             }

               if(compareTo == true){   

                   switch (status)
                   {

                       case 4:
                           digitalWrite(9, HIGH);
                           delay(4000);
                           digitalWrite(9, LOW);                           
                           digitalWrite(8, LOW);
                            status = 0;
                            compareTo=false; 
                            conta = 0;
                           break;
                       case 5:
                           digitalWrite(9, LOW);                        
                           digitalWrite(8, HIGH);
                           delay (2000);
                           digitalWrite(8, LOW);                             
                           status = 0;
                           compareTo=false;
                           conta = 0;
                           break;
                       default:
                           status = 0;
                           digitalWrite(9, LOW);
                           digitalWrite(8, LOW);
                           compareTo=false;
                           conta = 0;
                           break;
                   }
               
               }

Si hay alguna manera de mejorarlo o de hacer que el arduino consuma menos agradecería que me lo dijerais.

para mejorarlo quita los delays del case 4 y el case 5 y cambialos por millis, con esto mejoras en que si has de pulsar 5 veces cuando hagas la 4 pulsacion y vayas a hacer la 5 no tengas que esperar ese tiempo de delay.

Los programas con delay() se vuelven TONTOS.
En otras palabras. Delay detiene la ejecución del código hasta cumplir el tiempo prefijado. No puedes usarlo y esperar que responda a un evento.
Por eso debes usar millis();
El reemplazo de delay por millis no es directo, y tampoco es muy intuitivo.
millis() es una función que te dice cuantos mseg lleva arduino desde que lo encendiste.

Ahora imagina la situación que hace delay(1000), pues llega a esa linea de codigo y se detiene 1000 mseg.
millis() no se detiene y entonces como haces lo que quieres usándolo?
Pues le preguntas si se ha cumplido la condición de haber superado un lapso de tiempo de 1000 mseg y entonces actuas.

Bien mirando tu nuevo código creo que te has desbandado.
Poner algo dentro de un while(true) hace que jamás salga de ese loop infinito el código que este entre llaves.
Eso es un error.

Vamos a empezar de nuevo y desde 0.
Reescribamos el código hasta que con el botón simules el rele del telefonillo como tu le llamas.
Usa etiquetas para cada cosa, usa nombres para los pines, nada de digitalRed(4), escribe algo que lea otra persona y lo entienda. Ponle comentarios.

Podrías usar esto para detectar el relé

Previo defines
#define botonRele 4 // pone en Pin el número que corresponda.

 bool debounce(boolean last) // Función antirebote
 {
   bool current = digitalRead(botonRele);
   if (last != current) {
     delay(100); // en este caso si debo esperar 100 mseg
     current = digitalRead(botonRele);
   }
   return current;
 }

esta es una rutina muy simple que se usa asi

    estadoBoton = debounce(estadoBotonAnt);

    if (estadoBoton == HIGH && estadoBotonAnt == LOW) {
       status = status + 1;     // se incrementa con cada pulsación                
       Serial.print("Pulso");
    }

Al final vuelves a hacer

 estadobotonAnt = estadoBoton;

Pruebala y asegúrate que eso funciona bien.
Luego seguimos. Retira los while y guarda en otro archivo el resto de tu código. No está todo mal, pero si como lo has presentado.