Un’alternativa alla classica serratura dotata di codice di sicurezza inseribile tramite una tastiera, una chiave codificata o un RFID, è quella di utilizzare un encoder a quadratura, dotato di interruttore a pulsante.
un sistema paragonabile a quello di una cassaforte, apribile, ruotando a destra e a sinistra, una manopola numerata, con l’obbiettivo di indovinare i codici di apertura.
Il programma descritto di seguito utilizza un encoder a quadratura, per l’individuazione di due codici, limitati a due per semplicità di descrizione; aumentando le opzioni di “Switch Case”, è possibile rendere più difficile l’identificazione dei codici.
Il programma prevede la possibilità di commettere un errore su tre tentativi di inserimento, prima che scatti l’allarme, disinseribile unicamente con l’intervento di un operatore esterno.
variabili
La variabile SwA di tipo Bool ha solo due stati, uno e zero; è assegnata al pulsante utilizzato per acquisire il valore dell’encoder.
La variabile CountSwA di tipo Byte, valori compresi tra 0 e 255; è utilizzata per lo Switch Case.
La variabile Count, di tipo Int, con valori compresi tra -32768 e + 3276; contiene il valore del contatore dell’encoder utilizzato dal Component Macro Count=QuadEncoder::ReadCounter().
La variabile Changed, di tipo Bool, contiene il valore della lettura dell’encode; utilizzato dal Component Macro Changed=QuadEncoder::CheckForChanges().
Le variabili COD1 e COD2, di tipo Int; utilizzate per gestire l’allarme e l’apertura della serratura.
La variabile Delay, di tipo Uint, valore compreso tra 0 e 65535; è utilizzata, alla fine del programma, in sostituzione della funzione Delay.
Pannello simulazione: 2D Dashboard Panel
dal menu Inputs, inserisco l’encoder a quadratura della 2D Dashboard e tramite il pannello properties, lo collego ai bit 0 e 1 della porta D.
Dal menu Inputs, inserisco nella 2D dashboard il pulsante e lo collego al bit 6 della porta D.
Dal menu Outputs, inserisco nella 2D dashboard il led e lo collego al pin 7 della porta D.
Dal menu Displays, inserisco nella 2D Dashboard un pannello gLCD_ILI9341_SPI, e tramite il pannello Properties, verifico il collegamento MOSI, MISO e CLK alla porta B e imposto la visualizzazione in Bitmap
Diagramma di flusso
inizializzazione:
Azzero le variabili con la funzione Calcolo:
Imposto i codici per l’apertura della serratura:
funzione Calcolo:
Ciclo principale
Controllo il movimento dell’encoder.
Changed=QuadEncoder::CheckForChange()
Con il Component Macro QuadEncoder::CheckForChange(), verifico se l’encoder è stato mosso controllando lo stato logico della variabile Changed.
controllo se il pulsante è premuto.
La variabile SwA, di tipo Bool, ha due possibili valori: 1 (tasto premuto) o 0 (tasto non premuto); è associata al pulsante Push, collegato al pin 6 della porta D.
Pulsante Push non premuto:If SwA ≠ 1?
Il programma prosegue diritto, dopo la funzione Decisione.
gLCD_ILI9341_SPI::ClearDisplay()
Count=QuadEncoder::ReadCounter()
gLCD_ILI9341_SPI::printNumber(Count,100,10,12,0)
Delay 100ms
if SwA = 1?: pulsante premuto.
Delay 100 ms: ritardo antirimbalzo; serve per eliminare falsi segnali provenienti dall’encoder.
Il programma prosegue seguendo il percorso a destra della funzione Decisione.
Switch Case
La variabile CountSwA, è incrementata ogni volta che si preme il pulsante Push.
SetForegroundColour: imposta il colore del testo
DrawCircle: disegna un punto colorato alla posizione indicata da X,Y.
Linee di codice comuni alle tre opzioni: lettura Encoder
if Count ≠ Codice 1? (inserimento Codice1 errato)
if Count = Codice 1?
il numero inserito corrisponde al codice1
COD1 = COUNT
se il numero inserito corrisponde al primo codice, assegna a COD1 il valore di Count.
if COD1? No: primo numero inserito è errato
Funzione Decisione: if Count = Codice1 ?: secondo tentativo
COD1 = COUNT
Funzione Decisione: if Count = Codice2 ?:
COD2 = COUNT
se il numero inserito corrisponde al secondo codice, assegna a COD2 il valore di Count.
if COD1? No e if Count Codice2 ? No
Dopo il terzo inserimento, corretto o errato che sia, non è possibile indovinare il codice rimanente.
if COD1?Yes: primo numero inserito è corretto.
if count diverso da Codice2?
il secondo numero inserito è errato.
Dopo il terzo inserimento, corretto o errato che sia, non è possibile indovinare il codice rimanente.
if count = Codice2?
il secondo numero inserito è corretto.
COD2 = Count
se il numero inserito corrisponde al secondo codice, assegna a COD2 il valore di Count.
il programma esce da SwitchCase ed esegue il programma di verifica codici:
Se i due codici sono corretti, chiama la macro “APERTO”
Esegue l’utimo programma di Delay quindi il ciclo ricomincia dall’inizio
if COD1? = No
chiama la macro “ALLARME”
il programma si blocca con il display lampeggiante.
if COD1? = Yes
if Count = Codice2: no
Call Macro “ALLARME”
if Count = Codice2: yes
COD2 = Count
Il programma esce da SwitchCase ed esegue il programma di verifica codici:
Se i due codici sono corretti, chiama la macro “APERTO”
Esegue l’utimo programma di Delay quindi il ciclo ricomincia dall’inizio.
programma di verifica Codici:
If COD1 = Codice1 AND COD2 = Codice2:
if COD1 ≠ Codice1 AND COD2 ≠ Codice2
La Macro “APERTO”, è richiamata unicamente quando si verificano, ambedue, le condizioni.
COD1 = 1 e COD2 = 1 (AND booleano)
Termine Ciclo principale.
Il ciclo principale riparte dall’inizio.
Loop macro “ALLARME”
La macro “Allarme,” è un ciclo che si ripete continuamente, facendo lampeggiare i tre i punti e la scritta ALLARME con la cadenza di un secondo.
Macro “APERTO”
Output 1 -> D7: accende il led collegato al pin 7 della porta D.
Delay: 3 secondi: il led rimane acceso per 3 secondi.
Output 0 -> D7: spegne il led collegato al pin 7 della porta D.
C Code
test serratura con encoder
Riccardo Monti