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);
}
}