Semplice calcolatrice basata su Arduino MEGA

Introduzione

Al giorno d’oggi fare calcoli non è affatto un problema. Una potente calcolatrice scientifica costa pochi euro oppure può essere facilmente installata su telefoni o computer.
Noi di Techrm abbiamo comunque deciso di trasformare Arduino in una calcolatrice. La nostra è una calcolatrice molto semplice, ad esempio accetta in input solo numeri interi e non abbiamo implementato la possibilità di inserire numeri decimali e/o negativi.
Tuttavia, lo sketch che abbiamo creato non è banale, e andando avanti nella lettura ve ne renderete conto. Il circuito invece è piuttosto semplice ed anche la lista dei componenti che abbiamo usato è essenziale.

Nel video seguente potete osservare la calcolatrice in funzione:

La calcolatrice in funzione

Potete scaricare il progetto da qui:

Di che componenti abbiamo bisogno?

La lista dei componenti non è particolarmente lunga:

  • una breadboard per connettere la scheda Arduino MEGA agli altri componenti
  • alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
  • 12 resistori da 10kΩ o, in alternativa, da 12kΩ
  • un potenziometro da 10kΩ
  • un display LCD 2 x 16
  • 12 interruttori a pulsante
  • e, ovviamente, una scheda Arduino MEGA!

Come potete vedere, per creare la tastiera non abbiamo usato un tastierino numerico già pronto ma dei singoli pushbutton.

Se il vostro display LCD non ha il connettore da 16 pin saldato e non sapete come fare, il nostro tutorial Un altro tutorial su come saldare può fare al caso vostro.


NOTA: se non possedete un display potrete comunque seguire il tutorial visualizzando i dati sul serial monitor invece che sul display LCD, usando la funzione Serial.print() invece che la lcd.print().

Manuale d’uso…in altre parole, come usare la calcolatrice di Techrm

Questa calcolatrice può fare le quattro operazioni fondamentali: addizione, sottrazione, moltiplicazione e divisione. Accetta in input due numeri positivi di grandezza non superiore a 99999. Anche il risultato non può essere superiore a questo valore.
Nel caso della sottrazione se il secondo numero inserito è maggiore del primo, la calcolatrice restituirà un numero negativo.


NOTA: tenendo un pulsante premuto per un po’ di tempo si avrà l’inserimento del numero più volte!

Come funziona

La prima schermata permette all’utente di scegliere una delle quattro sopracitate operazioni matematiche. La scelta avviene premendo:

  • 0, per l’addizione (ADDition)
  • 1 per la sottrazione (SUBtraction)
  • 2 per la moltiplicazione (MULtiplication)
  • 3 per la divisione (DIVision)

 

Premendo un tasto diverso da questi la calcolatrice non procede, chiedendo all’utente di inserire un numero valido.
Una volta selezionata l’operazione, la calcolatrice consente l’inserimento della prima cifra. Quando si ha finito con l’inserimento del primo numero si deve premere il tasto OK in modo che la calcolatrice richieda l’inserimento del secondo. Quando si finisce con l’inserimento del secondo numero, si deve premere il tasto OK per far sì che la calcolatrice esegua il calcolo.
Come detto sopra, il numero inseribile può avere massimo 5 cifre. Quando l’utente inserisce un numero che ha 5 cifre la calcolatrice va al passo successivo. Nel caso del primo numero, la calcolatrice chiederà l’inserimento del secondo. Invece, se si inserisce il numero massimo di cifre durante l’immissione del secondo, la calcolatrice eseguirà il calcolo precedentemente selezionato. Una volta che la calcolatrice ha svolto il calcolo, il risultato rimarrà visualizzato a schermo finché l’utente non premerà DEL.
In ogni momento è possibile premere il tasto DEL per interrompere l’operazione corrente e tornare alla schermata iniziale.
Non è possibile cancellare l’ultimo numero o digit inserito. 

Schermata iniziale della calcolatrice
Schermata iniziale della calcolatrice

 

Messaggio di errore mostrato quando si preme un tasto sbagliato
Messaggio di errore mostrato quando si preme un tasto sbagliato

 

Schermata di inserimento del primo numero
Schermata di inserimento del primo numero

Schermata di inserimento del secondo numero
Schermata di inserimento del secondo numero

 

Messaggio mostrato quando si preme il tasto DEL
Messaggio mostrato quando si preme il tasto DEL

 

Schermata che mostra il risultato di una operazione (in questo caso una divisione)
Schermata che mostra il risultato di una operazione (in questo caso una divisione)

Lo schema di realizzazione

Qui sotto possiamo osservare lo schematico Fritzing della calcolatrice:

 

Lo schema Fritzing del collegamento
Lo schema Fritzing del collegamento

Chiaramente il primo passo da fare è connettere i pushbuttons in modo da creare una tastiera. Il loro collegamento è molto semplice e basta seguire lo schema allegato a questo passo per realizzarlo.

NOTA: ricordate che i pushbutton devono necessariamente essere posti a cavallo delle due sezioni della breadboard per evitare di cortocircuitare i loro PIN. Quindi, per questo esperimento ci dovremo accontentare di sistemare i bottoni su una linea e non su un rettangolo. 

Non indispensabile ma davvero molto utile è scrivere i nomi dei tasti su un pezzo di carta.

Lo sketch

Associare i pushbutton ai numeri e ai tasti di controllo

La tastiera è composta da 12 tasti: 10 sono necessari per la rappresentazione delle cifre da 0 a 9 mentre due servono per il controllo delle operazioni. Tramite la definizione #define abbiamo associato a ciascun pushbutton un determinato PIN.
I pushbutton sono normalmente aperti. Questo significa che il loro stato di default è LOW e quando vengono premuti si portano su HIGH. E’ proprio quando i pulsanti sono su HIGH che a questo evento viene associato una cifra (se si tratta di un pulsante usato per la rappresentazione delle cifre) o un evento (nel caso dei tasti di controllo DEL e OK). Abbiamo realizzato questo con la funzione readKey.
I due stati sopra citati sono dovuti alla soluzione circuitale adottata in questo schema. Infatti, avendo una resistenza di pull down a massa, il livello in uscita dal pushbutton è 0 col pulsante rilasciato (interruttore aperto) e 1 (5V) col pulsante premuto (interruttore chiuso).
La tastiera è lo strumento con cui noi impartiamo i comandi ad Arduino e per questo i pushbutton sono stati impostati come INPUT nella funzione void setup ().
Come sappiamo le due funzioni fondamentali di Arduino sono setup e loop. La prima viene eseguita una sola volta e fa sostanzialmente dei controlli e/o inizializza gli eventuali componenti e PIN. La seconda invece esegue ripetutamente il codice in essa contenuto. Quindi, per bloccare indefinitamente l’esecuzione del loop abbiamo creato la funzione wait. Quando Arduino esegue questa funzione entra in uno stato di attesa; infatti essa contiene solo un ciclo while vuoto che è vero quando nessun tasto è premuto. Quando un qualsiasi tasto viene premuto, Arduino esce da questo loop eseguendo l’istruzione successiva.

La funzione di inserimento dati insertNumb() 

La porzione di codice più complessa è quella contenuta nella funzione insertNumb. La parte principale di questa funzione sono i due cicli for. Il primo ciclo for è dedicato all’acquisizione delle cifre del primo numero mentre il secondo ciclo for annidato serve all’acquisizione del secondo.
La funzione di acquisizione dei numeri è ulteriormente complicata dalla presenza di numerose strutture condizionali. Queste strutture sono necessarie a gestire il flusso di acquisizione. Esse fanno si che la funzione si interrompa quando l’utente preme DEL o che vada avanti quando il tasto OK viene premuto. Per esempio, quando si preme OK nel primo ciclo, le strutture condizionali portano il valore del contatore i a 5. Perciò, la condizione if che precede il secondo ciclo for diventa vera permettendo l’esecuzione del secondo ciclo for e quindi l’acquisizione delle cifre del secondo numero.
Leggendo il codice sorgente ci si accorge dei numerosi delay sparsi qua e là apparentemente senza una logica precisa. In realtà essi sono necessari per la sincronizzazione delle operazioni di lettura della tastiera. Per esempio il primo delay all’interno della funzione insertNumb serve ad evitare che il tasto di selezione dell’operazione venga interpretato come la prima cifra del primo numero. 

 

La funzione loop

Il codice all’interno di questa funzione potrebbe apparentemente sembrare complesso. In realtà ciò che succede è abbastanza semplice.
La variabile principale è operation. Essa può assumere solo 4 valori, corrispondenti alle sopracitate operazioni fondamentali. Poi, in funzione del valore assunto e grazie a una struttura condizionale, l’algoritmo seleziona il blocco di codice necessario ad eseguire l’operazione scelta dall’utente.

Conversione di una parte dello sketch in libreria 

Nello sketch ci sono alcune parti che devono necessariamente essere ripetute più volte. Questo è dovuto alla natura della tastiera. Per questa ragione ci è sembrato opportuno scrivere una libreria in modo da avere un codice più pulito e la possibilità di modificare lo sketch o aggiungere nuove funzione senza dover rivoluzionare il codice base.
Non spiegheremo qui come creare una libreria per Arduino sia perché esiste già un ottima guida ufficiale disponibile qui e sia perché questo comporterebbe un allungamento inutile nonché eccessivo del tutorial.
Ciò che faremo è una lista delle sue funzioni e dei parametri richiesti in ingresso. Non spiegheremo neanche i metodi e ciò che fanno perchè lo abbiamo fatto già in precedenza.

NOTA: la libreria funziona solo con display LCD 16×2 quindi non può essere usata per stampare messaggi sul serial monitor.

Come usare la libreria

 TechrmKeypad è il nome della classe.

La prima cosa che facciamo è quella di instanziare un oggetto della classe passandogli i parametri relativi ai pulsanti.

Esempio

TechrmKeypad keypad (key0, key1, key2, key3, key4, key5, key6, key7, key8, key9, DEL, ENTER);

Le istruzioni seguenti sono i metodi disponibili:

  • keypad.wait(): è un metodo che non restituisce niente (void) e non richiede alcun parametro
  • keypad.readkey(): come il metodo precedente, non restituisce niente (void) e non richiede alcun parametro
  • keypad.insertNumb(&lcd, &control, &error, &number_1, &number_2, &MAXVALUE): neanche questo metodo restituisce qualcosa (void) ma prende in ingresso alcuni parametri.

L’ultimo metodo prima di tutto prende un puntatore ad una istanza della classe del display LCD e poi i puntatori alle seguenti variabili globali:

  • control_
  • error_
  • number_1_
  • number_2_
  • MAXVALUE

Oltre a questi metodi, potete implementarne un altro che inglobi le righe di codice seguenti che sono ripetute molte volte:

void printOpenmesg (char* myString1, char* myString2) {
    lcd_.clear();
    lcd_.setCursor(0, 0);
    lcd_.print(myString1);
    lcd_.setCursor(0, 1);
    lcd_.print(myString2);
}

Considerazioni finali

Al momento la calcolatrice può fare solo le quattro operazioni fondamentali prendendo in input due soli numeri positivi e interi. Aggiungendo altri tasti è possibile fare in modo che svolga calcoli più complessi. Ad esempio, aggiungere un tasto dedicato alla virgola e uno al segno “-” renderebbe la calcolatrice molto più versatile. Oppure, sfruttando la libreria math.h si potrebbero implementare molti altri tipi di calcoli come i logaritmi, calcoli trigonometrici, radici ed elevazioni a potenza ecc ecc.
Però ​queste scelte porterebbero ad un codice estremamente più complesso. Come abbiamo visto, per le sole 4 operazioni fondamentali si hanno 300 righe di codice (500 senza l’uso di alcuna libreria!).
Quindi, se siete abbastanza coraggiosi, sentitevi liberi di modificare la nostra libreria per aggiungere nuove funzionalità o semplicemente migliorarla!

Newsletter

Se vuoi essere aggiornato sui nuovi articoli, iscriviti alla newsletter. Prima dell’iscrizione alla newsletter leggi la pagina Privacy Policy (UE)

Se ti vuoi disiscrivere dalla newsletter clicca sul link che troverai nella mail della newsletter.

Inserisci il tuo nome
Inserisci la tua email
Torna in alto