In questo progetto simuliamo le 7 porte logiche con l’Arduino utilizzando un potenziometro. Girando il potenziometro potremo selezionare una delle 7 porte logiche: and, nand, or, nor, xor, xnor e not tramite due led di intput e un led di output. Schiacciando il primo pulsante esso cambierà lo stato in "1" e si accenderà il primo led. Premendo invece il secondo pulsante anche questo cambierà il suo stato in "1" e si accenderà il secondo led. In base a quale funzione logica abbiamo selezionato il led d'output potrebbe accendersi o rimanere spento.
Inizialmente dichiariamo le variabili per i led, i bottoni e il potenziometro associandoli ai rispettivi pin. Successivamente indichiamo che i led definiscono un OUTPUT e sono inizialmente spenti, mentre i bottoni indicano un INPUT. Nel loop dichiariamo quattro nuove variabili che leggono lo stato dei due bottoni e dei due led blu. La varibile whichPort contiene un numero da 1 a 7 che indica quale porta logica è selezionata. Ora ci sono 7 if che si attivano uno per ognuna delle 7 porte logiche. In ogni if inizialmente stampiamo quale porta logica abbiamo selezionato e poi abbiamo altri if che servono per rappresentarel'output della porta logica corrente tramite un led rosso d'output che si accenderà quando vorrà rappresentare l'1 e rimarrà spento quando vorrà indicare lo 0.
/** * Simula con dei led (2 INPUT e 1 OUTPUT) il funzionamento delle porte logiche. * @author Mattia Lazzaroni & Peter Catania * @version 14/11/2017 */ /** * Dichiaro i led di input, sulle porte 8 in 9. */ int ledIn1 = 8; int ledIn2 = 9; /** * Dichiaro il led di output, sulla porta a0. */ int ledOut = 11; /** * Dichiaro i bottoni di input, sulle porte 2 e 3. */ int button1 = 2; int button2 = 3; /** * Dichiaro il potenziometro, sulla porta A0. */ int potenz = A0; int oldButtonState1 = LOW; int oldButtonState2 = LOW; int x = 1; /** * Imposto le porte di lettura e di scrittura, e lo stato dei led. */ void setup(){ Serial.begin(9600); pinMode(ledIn1, OUTPUT); pinMode(ledIn2, OUTPUT); pinMode(ledOut, OUTPUT); pinMode(button1, INPUT); pinMode(button2, INPUT); digitalWrite(ledIn1, LOW); digitalWrite(ledIn2, LOW); digitalWrite(ledOut, LOW); } void loop() { /** * Dichiaro delle nuove variabili per lo stato dei bottoni. */ int newButtonState1 = digitalRead(button1); int newButtonState2 = digitalRead(button2); int ledIn1State = digitalRead(ledIn1); int ledIn2State = digitalRead(ledIn2); /** * Dichiaro una variabile per lo stato del potenziometro. */ int whichPort = map(analogRead(potenz),0,1023,1,7); /** * L'if fa accendere il led se il bottone è premuto * L'else fa spegnere il led se il bottone è premuto */ if (newButtonState1 == HIGH && oldButtonState1 == LOW) { if (x == 0) { digitalWrite(ledIn1, HIGH); x = 1; } else { digitalWrite(ledIn1, LOW); x = 0; } } delay(100); oldButtonState1 = newButtonState1; if (newButtonState2 == HIGH && oldButtonState2 == LOW) { if (x == 0) { digitalWrite(ledIn2, HIGH); x = 1; } else { digitalWrite(ledIn2, LOW); x = 0; } } delay(100); oldButtonState1 = newButtonState2; /** * Lo stato del potenziometro è 1, seleziono la porta and e la simulo. */ if(whichPort == 1){ Serial.println("Porta Logica selezionata: AND"); if(ledIn1State == LOW && ledIn2State == LOW){ digitalWrite(ledOut, LOW); } else if(ledIn1State == LOW && ledIn2State == HIGH){ digitalWrite(ledOut, LOW); } else if(ledIn1State == HIGH && ledIn2State == LOW){ digitalWrite(ledOut, LOW); } else if(ledIn1State == HIGH && ledIn2State == HIGH){ digitalWrite(ledOut, HIGH); } } else if(whichPort != 1){ digitalWrite(ledOut, LOW); } /** * Lo stato del potenziometro è 2, seleziono la porta nand e la simulo. */ if(whichPort == 2){ Serial.println("Porta Logica selezionata: NAND"); if(ledIn1State == LOW && ledIn2State == LOW){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == LOW && ledIn2State == HIGH){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == HIGH && ledIn2State == LOW){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == HIGH && ledIn2State == HIGH){ digitalWrite(ledOut, LOW); } } else if(whichPort != 2){ digitalWrite(ledOut, LOW); } /** * Lo stato del potenziometro è 3, seleziono la porta or e la simulo. */ if(whichPort == 3){ Serial.println("Porta Logica selezionata: OR"); if(ledIn1State == LOW && ledIn2State == LOW){ digitalWrite(ledOut, LOW); } else if(ledIn1State == LOW && ledIn2State == HIGH){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == HIGH && ledIn2State == LOW){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == HIGH && ledIn2State == HIGH){ digitalWrite(ledOut, HIGH); } } else if(whichPort != 3){ digitalWrite(ledOut, LOW); } /** * Lo stato del potenziometro è 4, seleziono la porta nor e la simulo. */ if(whichPort == 4){ Serial.println("Porta Logica selezionata: NOR"); if(ledIn1State == LOW && ledIn2State == LOW){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == LOW && ledIn2State == HIGH){ digitalWrite(ledOut, LOW); } else if(ledIn1State == HIGH && ledIn2State == LOW){ digitalWrite(ledOut, LOW); } else if(ledIn1State == HIGH && ledIn2State == HIGH){ digitalWrite(ledOut, LOW); } } else if(whichPort != 4){ digitalWrite(ledOut, LOW); } /** * Lo stato del potenziometro è 5, seleziono la porta xor e la simulo. */ if(whichPort == 5){ Serial.println("Porta Logica selezionata: XOR"); if(ledIn1State == LOW && ledIn2State == LOW){ digitalWrite(ledOut, LOW); } else if(ledIn1State == LOW && ledIn2State == HIGH){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == HIGH && ledIn2State == LOW){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == HIGH && ledIn2State == HIGH){ digitalWrite(ledOut, LOW); } } else if(whichPort != 5){ digitalWrite(ledOut, LOW); } /** * Lo stato del potenziometro è 6, seleziono la porta xnor e la simulo. */ if(whichPort == 6){ Serial.println("Porta Logica selezionata: XNOR"); if(ledIn1State == LOW && ledIn2State == LOW){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == LOW && ledIn2State == HIGH){ digitalWrite(ledOut, LOW); } else if(ledIn1State == HIGH && ledIn2State == LOW){ digitalWrite(ledOut, LOW); } else if(ledIn1State == HIGH && ledIn2State == HIGH){ digitalWrite(ledOut, HIGH); } } else if(whichPort != 6){ digitalWrite(ledOut, LOW); } /** * Lo stato del potenziometro è 7, seleziono la porta not e la simulo. */ if(whichPort == 7){ Serial.println("Porta Logica selezionata: NOT"); if(ledIn1State == LOW){ digitalWrite(ledOut, HIGH); } else if(ledIn1State == HIGH){ digitalWrite(ledOut, LOW); } } else if(whichPort != 7){ digitalWrite(ledOut, LOW); } }