Quest'esercitazione prevede che abbia già un po' di familiarità con la porta seriale.

Risultati immagini per arduino blink

Nel caso specifico si vuole comandare l'accensione e lo spegnimento di led posizionato sul piedino 13 scrivendo rispettivamente "1" e "0" sulla prima riga del monitor seriale premendo poi il tasto "Send" o "Invia" a seconda della lingua impostata.

N.B. È necessario disattivare l'inserimento dei caratteri di fine riga che vengono inviati quando alla fine dell'inserimento viene premuto il tasto "invio".

Lo sketch da caricare è il seguente:

#define ledpin 13

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  
  pinMode(ledpin, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  if (Serial.available() > 0){
    EseguiComandoSeriale();
  }
}

// funzioni 
void EseguiComandoSeriale(){
  char inputByte = Serial.read();
  while (Serial.available() > 0) Serial.read();  // svuoto buffer
  switch (inputByte){
      case '1':     // se in seriale c'è "1" accendo il led
            digitalWrite(ledpin, HIGH);
            Serial.println("Led acceso");
            break;
      case '0':    // se in seriale c'è "0" spengo il led
            digitalWrite(ledpin, LOW);
            Serial.println("Led spento");            
            break; 
default:
Serial.println("Comando errato");
 } }

Il listato merita qualche spiegazione.

In primo luogo si nota che la gestione dei dati in arrivo dalla seriale viene eseguita dalla funzione EseguiComandoSeriale( ) che viene richiamata ogni volta che la funzione Serial.available( ) restituisce un valore maggiore di 0.

Nota: la funzione Serial.available( ) restituisce il numero di caratteri presenti nel buffer di ricezione della porta seriale di Arduino.

Qualora vi sia un dato in seriale viene eseguita la funzione di controllo EseguiComandoSeriale( ) nella quale la prima riga è:

char inputByte = Serial.read();

Che ha l'effetto di caricare nella variabile inputByte (della dimensione di 1 carattere pari a 8 bit) il primo valore presente nel buffer di ricezione della porta seriale.

Nota: Un buffer è una zona di memoria usata per compensare differenze di velocità nel trasferimento o nella trasmissione di dati.

La successiva linea di codice:

while (Serial.available() > 0) Serial.read();

ha l'effetto di svuotare il buffer di ricezione nel caso di invii multipli di dati tramite il terminale di controllo.

Per finire il comando switch ha il compito di interpretare i dati che arrivano e svolgere le operazioni necessarie.


Ultime modifiche: lunedì, 21 marzo 2022, 16:57