La solita combinazione

Buondì, per un mio progetto necessito di dover usare solo 3 pulsanti per far funzionare un servo se inserita la giusta sequenza. A livello di Hardware nessun problema, mentre lo sketch non gira.
Ho utilizzato un iterazione enumerativa e due array per mantenere i dati. Devo ancora inserire il debounce ma non ho ancora capito la teoria dietro la programmazione di quest'ultimo.
So che l'if che ha come condizione l'uguaglianza dell'array andrebbe fuori dall'iterazione ma non riesco a capire come portare fuori un dato. (di solito programmo in C# (faccio 4a scienze applicate) ma non funzionano le stesse strutture)

#define b1 6
#define b2 7
#define b3 5
#define led 13
int A[4];
int puls[]  = {6, 7, 5};
int C[4] = {2, 3, 1};

void setup() {
  // put your setup code here, to run once:
 pinMode(b1,INPUT);
 pinMode(b2,INPUT);
 pinMode(b3,INPUT);
 pinMode(led,OUTPUT);
 Serial.begin(9600);
 
}
 
void loop() {
  // put your main code here, to run repeatedly:

 for(int i = 0; i < 4; i++){

    int stato = digitalRead(puls[i]);
     // int stato = digitalRead(b3);
      if( stato == HIGH)
      { A[i] += 1;
       Serial.println(A[0]);  
        if (A[1] == C[1] && A[2] == C[2] && A[0] == C[0] ){
    digitalWrite(led, HIGH);
   
   }
      }
   
   }
    
  
}

Grazie a chi trova il tempo di dargli un occhiata
Eugenio

Ciao! In tanto ti dico alcune cose che non vanno, poi non so se risolvi o c'è altro! Ma intanto correggi queste.

Premettiamo che non ottieni una combinazione col tuo programma, perché potresti avere una sequenza di pressioni del pulsante diversa. Esempio 2,3,1 posso premere 2 volte il primo pulsante e poi tre volte il secondo, ma posso anche premere una volta il primo una volta il secondo ecc...

  1. Quando dichiari un array e non lo inizializzi gli elementi dell'array hanno valori casuali e non sono zero

Per cui tu dichiari int A[4]; gli elementi non sono a zero, se tu sommi 1 sommi uno a un numero casuale.

Per inizializzare a zero l'array scrivi cosi

int A[4]={0}; // Cosi gli elementi sono inizializzati a zero e sommando un numero ottieni quello che vuoi

  1. Nel codice devi prevedere l'azzeramento dell'array A[], trovi la sequenza poi con un ciclo for azzeri l'array, altrimenti il codice ti funziona una sola volta visto che sommi uno a valori precedenti.
if (A[1] == C[1] && A[2] == C[2] && A[0] == C[0] ){
    digitalWrite(led, HIGH);
    for(int i=0;i<3;i++)
         A[i]=0;
   
}

littlebuilder:
Devo ancora inserire il debounce ma non ho ancora capito la teoria dietro la programmazione di quest'ultimo

Metti un passa basso RC esterno e non serve occuparsi di debounce:

ziostep-debounce.png

Ehm ... la resistenza in serie fra pin e pulsante andrebbe da 100 ohm, non da 10K ... :wink:

Etemenanki:
la resistenza in serie fra pin e pulsante andrebbe da 100 ohm

Cambia la costante di tempo, io lavoro sempre con tempi molto più lunghi per filtrare meglio (anzi, normalmente con 10k metto 1µF, e con 1k 10µF).

Poi ci sono tante possibili "interpretazioni" di un debounce hardware, ma tutte dovrebbero avere in comune:

  • resistenza di pull (up o down, tanto più bassa quanto più la linea è "disturbabile")
  • funzione passa basso (con costante di tempo di diversi ms, 10..20)
  • disaccoppiamento (resistenza in serie all'ingresso per non avere le giunzioni direttamente esposte alla linea esterna)

Grazie mille non sapevo l'array generasse numeri casuali :), provo a correggere quello e vediamo.

torn24:
Premettiamo che non ottieni una combinazione col tuo programma, perché potresti avere una sequenza di pressioni del pulsante diversa. Esempio 2,3,1 posso premere 2 volte il primo pulsante e poi tre volte il secondo, ma posso anche premere una volta il primo una volta il secondo ecc...

Questo purtroppo lo so l'arcano sta nel trovare come far valere qualsiasi pressione 1

Claudio_FF:
Metti un passa basso RC esterno e non serve occuparsi di debounce:

ziostep-debounce.png

Onestamente ammetto la mia ignoranza sull passo basso, ma tra gnd e pin ho già messo una resistenza da 10k,
è quello?
Grazie del tempo

littlebuilder:
tra gnd e pin ho già messo una resistenza da 10k

Quella che dici è la R di pull-down, quella più a sinistra dello schema.

Il passa basso è l'altra assieme al condensatore.

Se non lo metti tocca occuparsi del debounce via software.

Il modo più semplice (ma non è detto che sia applicabile in ogni caso) è fare due letture distanziate di 40ms, se sono uguali si prendono per buone, altrimenti si tiene buono il valore delle ultime buone precedenti. Naturalmente ad ogni lettura buona si aggiornerà il valore precedente a quello attuale.

Comunque già solo aggiungere un condensatore 100nF..1µF in parallelo alla tua resistenza dovrebbe bastare.

grazie mille