Interruzioni e priorità

Buonasera a tutti, utilizzo da diverso tempo Arduino per semplici progetti e fino ad ora non ho avuto grandi problemi, ora vorrei fare lo step successivo e andare ad utilizzare delle funzioni un po’ particolari per migliorare il mio livello di programmazione. Premetto che non sono esperto quindi spero di non ricevere troppe critiche, sono qua per imparare. Detto questo vi spiego la mia idea, praticamente io utilizzo Arduino collegato tramite USB ad un raspberry pi, sul raspberry ho creato una pagina web e tramite python invio sul seriale delle lettere, a dipendenza della lettera che arriva Arduino la interpreta ed esegue delle operazioni. Questa comunicazione seriale non avviene spesso quindi mi sembra stupido continuare a controllare il seriale,rallenta il mio programma. Leggendo in internet ho visto che esistono degli interrupt, che possono essere generati esternamente tramite i pin. E possibile utilizzare gli interrupt con il seriale? Ad esempio quando arriva una lettera sul seriale attivo un’interrupt ed eseguo un’azione

Spero di essere stato chiaro, vi metto il programma che ho scritto cosi forse e più facile capire, se vedete errori o miglioramenti non esitate a dirmelo :slight_smile:

int Switch = 3;
int Schermo = 5;
int LuceEsterna = 7;
int Trasformatore = 8;
char Dati;
int StatoSeAcceso = 0;
char DatiSi = 'U';
int DelaySistema = 500;

void setup() {
  Serial.begin(9600);
  //-------------------------------
  pinMode(Trasformatore, OUTPUT);
  digitalWrite(Trasformatore, HIGH);
  //-------------------------------
  pinMode(LuceEsterna, OUTPUT);
  digitalWrite(LuceEsterna,HIGH);
  pinMode(Switch, OUTPUT);
  digitalWrite(Switch, HIGH);
  pinMode(Schermo,OUTPUT);
  digitalWrite(Schermo, HIGH);
}

void loop() { 
  if (Serial.available() > 0) {
    Dati = Serial.read();
    if(Dati == 'C'){
    Serial.print(DatiSi);
    }
    if(Dati == 'S'){//Acceso
    digitalWrite(Schermo, HIGH);
    DatiSi = 'Q';
    }
    if(Dati == 'R'){//Spento
    digitalWrite(Schermo, LOW);
    DatiSi = 'U';
    }
    //Accesa---------------------------- 
    if (Dati == 'N'){
      if(digitalRead(5)==HIGH){
      digitalWrite(Schermo, LOW);
      StatoSeAcceso == 1;
      }
    //----------------------------------
      digitalWrite(Trasformatore, LOW);
      delay(DelaySistema);
    //---------------------------------
      digitalWrite(Switch, LOW);
      if(StatoSeAcceso == 1){
      digitalWrite(Schermo, HIGH);
      StatoSeAcceso == 0; 
      }
    }
    //----------------------------------
    //Spenta----------------------------
    if (Dati == 'O') {//Spenta
      if(digitalRead(5)==HIGH){
      digitalWrite(Schermo, LOW);
      }
      digitalWrite(Switch, HIGH);
      delay(DelaySistema);
      //----------------------------------
      digitalWrite(Trasformatore, HIGH);
      //----------------------------------
      digitalWrite(Schermo, LOW); 
      DatiSi = 'U';
      StatoSeAcceso == 0;
    }
    //------------------------------------
    //LuceEsterna-------------------------
    if(Dati == 'A'){
      digitalWrite(LuceEsterna,LOW);
      delay(DelaySistema);
    }
    if(Dati == 'B'){
      digitalWrite(LuceEsterna,HIGH);
      delay(DelaySistema);
    }
}
}
type or paste code here

Sei sicuro? Non vedo cosa faccia per rallentare il programma, nel loop controlli se è presente un carattere, se non c’è non succede nulla, altrimenti entri in quella catena di if() che francamente sostituirei con uno switch/case, più pulito da leggere.

Ciao, Ale.

https://www.arduino.cc/reference/en/language/functions/communication/serial/serialevent/