Ciao a tutti,
premesso che sono all'inizio della mia avventura in questo mondo vorrei sottoporvi un quesito per risolvere un progetto che sto cercando di portare avanti.
A livello hardware ho un display lcd 16x2 e due pulsanti.
Vorrei inserire username in codice morse dove il pulsante A rappresenta il "." e il pulsante B rappresenta il "" e sul display deve apparire la corrispondente lettera (quindi se premo . sul display dovrà apparire A).
La lunghezza deve essere al massimo di 4 caratteri e deve corrispondere con un utente (caricato in fase di programmazione) se così fosse devo inserire la password in codice binario dove pulsante A corrisponde a "0" e il pulsante B a "1", questa volta però sul display devono comparire gli "*".
Non riesco a capire se esistono delle librerie di conversione dal morse all'alfabetico o come devo fare per fare il match tra i pulsanti premuti e le lettere dell'alfabeto.
Spero di aver fornito tutte le informazioni necessarie.
Grazie
Chrstian
Prova a dare un'occhiata qui.
Ciao,
P.
Ciao P.,
ho provato a prendere spunto dal link che mi hai mandato ma faccio fatica a gestirlo.
Io in pratica ho il pulsante A che se premuto rappresenta il ".", ed il pulsante B il "-".
Se faccio la sequenza di inserimento premendo i pulsanti a meno di due secondi l'uno dall'altro il sistema deve andare a mettere la sequenza di . e - in un unico carattere, passati i due secondi deve visualizzare la lettera sul display e devo riniziare il processo di inserimento della seconda lettera e così via fino ad aver raggiunto la lunghezza di 4 lettere.
A volte prende lettere a caso, altre volte non prende nulla.
Ti allego l'estratto del codice che ho scritto.
Progetto_Gabry-file_prove.ino (3.94 KB)
Ho difficoltà a decifrare il tuo codice perché non rispetta le convenzioni (non scritte) sull'indentazione delle istruzioni.
Usando "Strumenti=>Formattazione automatica" e togliendo le righe vuote la situazione migliora.
Alcune osservazioni:
Non capisco il significato delle istruzioni: A == LOW e B == LOW, che il compilatore traduce con un "true" e basta
Il pin pirPin è definito, inizializzato e non usato.
La variabile pirValue è definita e non usata.
L'istruzione delay(10000); all'interno del loop blocca l'esecuzione per 10 secondi, spegne il display che verrà immediatamente riacceso dalla prima istruzione del loop stesso.
Io non ho mai usato il tipo di dato "String" e non so darti aiuto in questo campo.
Per il difetto che lamenti penso che i pulsanti non abbiano adeguati meccanismi antirimbalzo. In generale un pulsante viene inizializzato con "INPUT_PULLUP" in modo da ancorarlo a HIGH per evitare disturbi vaganti, e viene testato se == LOW, cioè connesso a massa. Con questo sistema si evitano resistenze esterne e disturbi vaganti.
Prova a cambiare il funzionamento dei tuoi pulsanti come indicato e vedi se cambia qualcosa.
Ti consiglierei poi di commentare le fasi del programma in modo da rendere la lettura meno critica per un estraneo.
Ciao,
P.
pgiagno:
Io non ho mai usato il tipo di dato "String" e non so darti aiuto in questo campo.
Per il difetto che lamenti penso che i pulsanti non abbiano adeguati meccanismi antirimbalzo. In generale un pulsante viene inizializzato con "INPUT_PULLUP" in modo da ancorarlo a HIGH per evitare disturbi vaganti, e viene testato se == LOW, cioè connesso a massa. Con questo sistema si evitano resistenze esterne e disturbi vaganti.
Prova a cambiare il funzionamento dei tuoi pulsanti come indicato e vedi se cambia qualcosa.
Ti consiglierei poi di commentare le fasi del programma in modo da rendere la lettura meno critica per un estraneo.
Ciao,
P.
Concordo che il problema dei pulsanti possa essere ricondotto al debounce che non è presente nel software e molto probabilmente neppure nel lato hardware, essendo meglio farlo lato hardware allego gli schemi per effettuare il debounce del pulsante, nel tuo caso potrebbero andare bene il primo o il secondo in base a come decidi di agire (pullup interno oppure esterno).
Per la questione dell'uso della classe String come andiamo ripetendo molto molto molto spesso sul forum per quanto possibile, evita sempre la classe "String" ... difatti NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!! 
Quindi ti consiglio di imparare ad usare le stringhe classiche del C ... ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h> 
debouncing_hw.pdf (22.8 KB)
Grazie ragazzi,
mi sto avvicinando ora a questo mondo e sto facendo da autodidatta,per cui mi scusa per gli errori banali che faccio.
Metto in pratica i vostri suggerimenti e vi tengo aggiornati.
Grazie
Christian