/*
Scrivere un programma che verifichi la combinazione di apertura
di una cassaforte con un pomello rotante. La cassaforte si apre dopo 3 sequenze
esatte segnalate dall'accensione successiva di 4 led.
Le sequenze di scatti sono valutate con un encoder rotativo e visualizzate
con una stampa su seriale. La combinazione segreta è 4 scatti a destra,
1 giro completo a sinistra, 3 scatti a destra. All'apertura della cassaforte
si accende un led. Dopo 3 tentativi sbagliati suona un allarme
sotto forma di cicalino continuo.
*/
#include "urutils.h"
int combinazione[3] = { 4, -2, 3};
int inserimento[4] = {0, 0, 0, 0};
int segno0 = 0;
int segno = 0;
int sw = 27;
int iSeq = -1;
int dt = 26;
int clk = 34;
int led = 32;
int led2 = 33;
int led3 = 25;
int led4 = 35;
int a0 = HIGH;
void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(dt, INPUT);
pinMode(clk, INPUT);
pinMode(sw, INPUT_PULLUP);
resetInserimento();
}
// verifica se la combinagione è giusta
bool controllo() {
bool ok = true;
for (int i = 0; i < 3; i++) {
if (combinazione[i] != inserimento[i]) {
ok = false;
}
}
return ok;
}
// resetta la combinazione
void resetInserimento() {
for (int i = 0; i < 3; i++) {
inserimento[i] = 0;
}
iSeq = -1;
segno0 = 0;
}
void loop() {
// polling della variabile a (rilevatore di scatto)
int a = digitalRead(clk);
if (a0 == HIGH && a == LOW) {// rilevatore di fronte di discesa
// controllo del verso
int b = digitalRead(dt);
if (b == HIGH) { // rilevatore di livello
segno = 1; // incremento positivo
Serial.println("senso orario");
} else {
segno = -1; // incremento negativo
Serial.println("senso antiorario");
}
if (iSeq < 3 ) {// contatore delle variazionin di verso
if (segno0 != segno) {// rilevatore di variazioni di verso
iSeq++;// indice della combinazione varia ad ogni inversione
Serial.print("cambio segno: "); Serial.println(iSeq);
}
// array di contatori
inserimento[iSeq] = inserimento[iSeq] + segno;
segno0 = segno;
Serial.print("inserimento ");
Serial.println(inserimento[iSeq]);
Serial.print("iSeq ");
Serial.println(iSeq);
}
}
a0 = a;
if (iSeq >= 2) {
int val = digitalRead(sw);
if (val == LOW) {// pull up
waitUntilInputHigh(sw, 50);
if (controllo()) {
Serial.println("cassaforte aperta");
digitalWrite(led2, HIGH);
digitalWrite(led, LOW);
} else {
Serial.println("cassaforte chiusa");
digitalWrite(led2, LOW);
digitalWrite(led, HIGH);
}
resetInserimento();
}
}
delay(2);
}