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...
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
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.
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:
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.