Avvio diversi loop tramite input dal monitor seriale

Buongiorno a tutti, sto facendo un programma dove ci sono diversi loop da avviare singolarmente, attraverso degli input di lettera/numero dal monitor seriale.
Esempio: void A avvia lampeggio di un led e void B avvia un'altra sequenza sempre da ripetersi, questi due void sono da avviare con un carattere da monitor seriale.
Ho bisogno di una mano in questo codice.

:grinning: grazie

void setup() {                
pinMode(11,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
Serial.begin(9600);
 
}

void A(){ 
//...
}

void B(){
//...
}
  
void loop () {

val = Serial.read();
 
 if (val== 'A'){ //se legge A si avvia il void A
}

if (val== 'B') { //se legge B si avvia il void B
}
}

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

Noto inoltre che NON è la prima volta e che NON hai ancora fatto quanto ti è stato chiesto a suo tempo QUI!

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti).

Letta la presentazione non sono riuscito a ricavare informazioni circa la tua esperienza e comprensione del codice C di arduino.

Ho questo pezzetto di sketch scritto al volo che fa quello che desideri.
Se non è comprensibile, ci sono alternative che potrebbero essere più comprensibili.

// premi:
// a invio; stampa a all'infinito
// b invio; stampa b all'infinito
// c invio; non stampa nulla 

uint8_t dataByte;

void setup() {
    Serial.begin(115200);
    Serial.println("start");
     
} // end void setup()

void loop() {

  switch (dataByte) {
    case 'a':
      Serial.println("a");
      break;
    case 'b':
      Serial.println("b");
      break;
    
  }
      
} // end void loop()

void serialEvent() {
    uint8_t c = Serial.read();
    if (c >= 'a' && c <= 'c') 
        dataByte = c;
}

Ciao.

Mauro ... NON fare affidamento su questa vecchia funzione presente nel "core" dei vecchi AVR ... in parecchi nuovi "core" NON è più implementata!

Guglielmo

Ok, non lo sapevo. Versione senza serialEvent:

// premi:
// a invio; stampa a all'infinito
// b invio; stampa b all'infinito
// c invio; non stampa nulla 

uint8_t dataByte;

void setup() {
    Serial.begin(115200);
    Serial.println("start");
     
} // end void setup()

void leggiDaSeriale() {
    uint8_t c = Serial.read();
    if (c >= 'a' && c <= 'c') 
        dataByte = c;
}

void loop() {
  if (Serial.available()) {
      leggiDaSeriale();
  }

  switch (dataByte) {
    case 'a':
      Serial.println("a");
      break;
    case 'b':
      Serial.println("b");
      break;
    
  }
      
} // end void loop()

Ciao.

1 Like

Non è più semplice e comprensibile per un principiante senza usare una funzione che viene chiamata una volta sola?...

// premi:
// a invio; stampa a all'infinito
// b invio; stampa b all'infinito
// c invio; non stampa nulla 

uint8_t dataByte;

void setup() {
    Serial.begin(115200);
    Serial.println("start");
} // end setup()

void loop() {
  if (Serial.available()) {
     uint8_t c = Serial.read();
     if (c >= 'a' && c <= 'c') 
       dataByte = c;
  }

  switch (dataByte) {
    case 'a':
      Serial.println("a");
      break;
    case 'b':
      Serial.println("b");
      break;
  }
} // end loop()
1 Like

Buona sera, grazie a tutti per l'aiuto lo proverò assolutamente

P.S.: Serial.println funziona anche con ('a')?...

sisì assolutamente!

Ovvio

Si tratta di un overload

Lo chiedi a me o a te stesso?
Io non so rispondere, su arduino la tendenza è di scrivere tutto dentro il loop che si ingrassa, quindi la tua versione è di tendenza.

PS: Io non condivido questa tendenza che forse deriva dai tutorial e manuali cartacei o meno che per questioni tipografiche e didattiche tendono a condensare. Il principiante dopo i tipi di dati, studia (dovrebbe) le funzioni e quindi le sa definire e chiamare.

Dal punto di vista della efficienza, c'è una chiamata a funzione ( leggiDaSeriale() ) quando il buffer ha dei dati. Nella versione di tendenza non c'è chiamata a funzione.

Ciao.