Leggere stato LED

Salve a tutti, mi è da poco arrivato un'Arduino UNO e quindi ci sto smanettando parecchio. Mi servirebbe trovare un modo per leggere lo stato di un LED (acceso/spento), ho provato a "improvvisare" un programmino che se riceve un segnale via seriale controlla il led e inverte lo stato (se acceso lo spegne, se spento lo accende), ma non funziona. Ho fatto qualche bestemmia elettronica? Grazie mille in anticipo.

int LED = 13;
void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);   // init serial
  Serial.println("PortaSerialePython_AscoltoLEDIO v.0.1"); 
  digitalWrite(LED,HIGH);
}

void loop() {
  if (Serial.available()) {   // compare serial input 
    if (LED == HIGH) {
      digitalWrite(LED, LOW);
      Serial.println("Led OFF");
    }
    else if (LED == LOW) {
      digitalWrite(LED, HIGH);
      Serial.println("Led ON");
     }
  }
}

Halogyro:
...Ho fatto qualche bestemmia elettronica?

No, solo un tot di errori di logica XD

Allora, con questo statement tu ti segni che il pin del LED è il numero 13, ma non ti salvi lo stato del LED ...

int LED = 13;

... per salvarti lo stato dovrai dichiarare un'altra variabile per conservarlo :

byte ledStato = LOW;

e nel codice dovrai usare quella, non il numero del pin, che è fisso e immutabile :wink:

In pratica :

const byte LED = 13;
byte ledStato = LOW;

void setup() {
  pinMode(LED, OUTPUT);
  digitalWrite(LED, ledStato);
  Serial.begin(9600);   // init serial
  Serial.println("PortaSerialePython_AscoltoLEDIO v.0.1"); 
}

void loop() {
  if (Serial.available()) {   // compare serial input 
    if (ledStato == HIGH) {
      ledStato = LOW
      digitalWrite(LED, ledStato);
      Serial.println("Led OFF");
    }
    else if (ledStato == LOW) {
      ledStato = HIGH;
      digitalWrite(LED, ledStato);
      Serial.println("Led ON");
     }
  }
}

Ti faccio notare che :

  1. il numero del pin LED, dato che sempre lo stesso, può essere dichiarato const e inoltre inutile dichiaralo int, basta byte

  2. Se lo riguardi, t'accorgi che il programma può essere ottimizzato e di parecchio ... vedi se riesci a farlo in una forma più compatta ... :wink:

Guglielmo

Immaginavo ci fosse un problema logico :slight_smile: sicuramente può essere ottimizzato, l'ho buttato giù in 5 minuti :grin:

EDIT: ho copiato/incollato il codice che hai scritto, ma va in loop brutale... vedo se riesco a sistemarlo.
EDIT bis: ho risolto, grazie mille

 const byte LED = 13;
byte ledStato = LOW;

void setup() {
  pinMode(LED, OUTPUT);
  digitalWrite(LED, ledStato);
  Serial.begin(9600);   // init serial
  Serial.println("PortaSerialePython_AscoltoLEDIO v.0.1"); 
}

void loop() {
  if (Serial.available()) {   // compare serial input 
    char c = Serial.read();
    if (c != '+') {
  
    if (ledStato == HIGH) {
      ledStato = LOW;
      digitalWrite(LED, ledStato);
      Serial.println("Led OFF");
      delay(500);
    }
    
    
    else if (ledStato == LOW) {
      ledStato = HIGH;
      digitalWrite(LED, ledStato);
      Serial.println("Led ON");
     }
     
    }  
  }
}

Si, scusa, mi ero preoccupato solo della logica del LED senza guardare cosa facevi con la seriale ...

... ovviamente devi togliere il carattere dal buffer della seriale (leggendolo) o il Serial.available() sarà sempre > 0 e quindi TRUE XD

Guglielmo