Questo è il primo esercizio di Arduino, dove lo scopo è quello di simulare le 7 porte logiche AND, NAND, OR, NOR, XOR, XNOR e NOT. Per scegliere quale porta usare ci pensa il potenziometro. Il numero della porta che si sta utilizzando viene messo ad un displaay a 7 segmenti. Con due bottoni si può cambiare lo stato di due led gialli con cui si va a calcolare il risultato nel led rosso.
Il montaggio è abbastanza complesso, vengono attaccati 10 fili verdi per i vari led, 2 fili blu per i bottoni, 1 filo giallo per il potenziometro e dei fili rossi e neri per i vari componenti. 1 resistenza da 220 Ohm viene attaccata al display 7 segmenti al catodo e le altre 3 ai led. Le 2 resistenze da 1 KOhm vanno attaccate ai due bottoni.
Questa immagine è stata fatta grazie a fritzing.
Questa è l'immagine del montaggio acceso e con la porta logica scelta OR, si può vedere dal numero mostrato dal display 7 segmenti. Con i due led di calcolo spenti, cioè 0 e 0, il led di risultato infatti è spento, 0.
Immagine del montaggio.
Prima della parte di setup del programma, vengono definite alcune variabili che definiranno quali sono i pin su cui si deve leggere/scrivere. le variabili booleane servono a sapere lo stato precedente dei bottoni.
//Dichiaro le variabili dei pin che andro a utilizzare
//pin dei bottoni
int pushButton1 = 2;
int pushButton2 = 3;
//pin dei led per il calcolo
int led1 = 4;
int led2 = 5;
//pin del led di risultato
int led3 = 6;
//pin dei led del 7 segmenti che andranno a indicare
//che tipo di porta si sta usando
int e = 7;
int d = 8;
int c = 9;
int b = 10;
int a = 11;
int f = 12;
int g = 13;
//variabili d'aiuto per definire lo stato dei led
bool cambia1 = false;
bool cambia2 = false;
Nel metodo setup viene iniziata una connessione al display seriale integrato e vengono attivati i pin su cui leggere/scrivere
void setup() {
//inizio una connessione con la porta seriale
Serial.begin(9600);
//definisco quali pin saranno da usare per l'input o l'output
pinMode(pushButton1, INPUT);
pinMode(pushButton2, INPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
Nel metodo loop, dove verranno eseguite in modo infinito le istruzioni presenti, si comincia a leggere lo stato dei bottoni, il numero da 0 a 1023 del potenziometro e vengono salvate in delle variabili gli stati dei led per poi andare ad attivarli poi.
void loop() {
//leggo lo stato dei bottoni
int buttonState1 = digitalRead(pushButton1);
int buttonState2 = digitalRead(pushButton2);
//leggo lo stato del potenziometro
int sensorValue = analogRead(A0);
//leggo lo stato dei led per il calcolo
int le1 = digitalRead(led1);
int le2 = digitalRead(led2);
Ora si passa al controllo del range in cui il potenziometro si trova, in base alla posizione si entra in una diversa porta logica:
Se il potenziometro è nel primo range, verrà effettuata la porta logica AND e di conseguenza verranno accesi i led giusti del display 7 segmenti.
if(sensorValue >= 0 && sensorValue <= 146){
//se si si eseguirà la porta logica and
//setto quali led del 7 segmenti verranno accesi
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
Serial.println("and");
//eseguo il calcolo ed esprimo il risultato
if(le1 == 1 && le2 == 1){
digitalWrite(led3, HIGH);
}
else{
digitalWrite(led3, LOW);
}
}
L'azione del controllo del valore che ha il potenziometro viene ripetuta altre 6 volte per le restanti porte. Per ogni lettura del potenziometro viene messo un delay per far in modo che la lettura non sia troppo veloce.
//controllo se il potenziometro è nel secondo range
else if(sensorValue >= 146 && sensorValue <= 292){
...
//controllo se il potenziometro è nel terzo range
else if(sensorValue >= 292 && sensorValue <= 438){
...
//controllo se il potenziometro è nel quarto range
else if(sensorValue >= 438 && sensorValue <= 630){
...
//controllo se il potenziometro è nel quinto range
else if(sensorValue >= 630 && sensorValue <= 746){
...
//controllo se il potenziometro è nel sesto range
else if(sensorValue >= 746 && sensorValue <= 892){
...
//controllo se il potenziometro è nel settimo range
else if(sensorValue >= 892 && sensorValue <= 1023){
...
//tempo che si aspetta per la prossima lettura
delay(10);
In questa fase si controlla lo stato dei bottoni, se il bottono viene premuto per la prima volta, di conseguenza si accenderà il led e resterà acceso. Se si preme per la seconda volta, il led verrà spento.
//controllo lo stato del bottone e di conseguenza accendo o spengo il led
if(buttonState1 == 1 && cambia1 == false){
digitalWrite(4, LOW);
cambia1 = true;
}
else if(buttonState1 == 1 && cambia1 == true){
digitalWrite(4 , HIGH);
cambia1 = false;
}
//controllo lo stato del bottone e di conseguenza accendo o spengo il led
if(buttonState2 == 1 && cambia2 == false){
digitalWrite(5, LOW);
cambia2 = true;
}
else if(buttonState2 == 1 && cambia2 == true){
digitalWrite(5 , HIGH);
cambia2 = false;
}
delay(1);
}
Per il download del codice clicca qui