Simulatore di porte logiche

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.

Lista materiale:

Descrizione del codice:

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.

Schema:

Codice:

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