LED a intermittenza

Salve a tutti!

Ho iniziato oggi ad utilizzare arduino e sono ancora alla fase di accendi/spegni un LED ma ho un piccolo problema con il seguente scketch:

const unsigned int LED_PIN = 13;
const unsigned int BAUD_RATE = 9600;
const unsigned int PAUSA=800;

 void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(BAUD_RATE);
 }

 void loop() {
   if (Serial.available() > 0) {
    int command = Serial.read();
    if (command == '1') {
     digitalWrite(LED_PIN, HIGH);
     Serial.println("LED acceso");
 } else if (command == '2') {
    digitalWrite(LED_PIN, LOW);
    Serial.println("LED spento");
 } else if (command=='3') {
    
      digitalWrite(LED_PIN, HIGH);
      delay(PAUSA);
      digitalWrite(LED_PIN, LOW); 
      delay(PAUSA);
    
   Serial.println("LED INTERMITTENTE");
   } else {
    Serial.print("comando non disponibile");
 //   Serial.println(command); 
  }
 }
 }

Il codice riportato sopra funziona in tutte le sue parti ma io vorrei che con il comando 3 il led lampeggiasse e non solo che si accendi e si spegni una volta.

Ho provato a inserire di nuovo la funzione void loop() {...} riporto la modifica che ho provato ad apportare:

void loop() {
      digitalWrite(LED_PIN, HIGH);
      delay(PAUSA);
      digitalWrite(LED_PIN, LOW); 
      delay(PAUSA);
   }

Ma in fase di compilazione mi dà un errore:

Led_Controllato_dal_PC.ino: In function 'void loop()':
Led_Controllato_dal_PC.ino:22:17: error: a function-definition is not allowed here before '{' token
Errore durante la compilazione

Cosa mi sfugge?

Astrat&Pina

Ma hai tolto l'altro void loop, spero.
Ne può esistere uno solo...

usa BlinkWithoutDelay che hai tra gli esempi dell'ide per far lampeggiare un led senza usare delay() che arresta lo svolgimento del programma

Ho provato il codice del Blink without Delay ma una volta data l'opzione 3 ovvero quella del led a intermittenza il LED rimane acceso:

//Dichiaro le variabili
const int LED_PIN = 13;
const unsigned int BAUD_RATE = 9600;

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

 void setup() {
  pinMode(LED_PIN, OUTPUT);//setto il pin 13
  Serial.begin(BAUD_RATE);//inizializzo la porta seriale
 }

 void loop() {
   if (Serial.available() > 0) {
    int command = Serial.read();//leggi da monitor seriale
    if (command == '1') { // se il valore è 1 allora
     digitalWrite(LED_PIN, HIGH);// accendi il pin
     Serial.println("LED acceso");// e scrivi LED acceso
 } else if (command == '2') { //Altrimenti se è 2
    digitalWrite(LED_PIN, LOW); //Spegni il LED
    Serial.println("LED spento");
 } else if (command=='3') { // Se il comando immesso è 3
     // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(LED_PIN, ledState);
  } 
      
   Serial.println("LED INTERMITTENTE");
   } else {
    Serial.print("comando non disponibile");
 //   Serial.println(command); 
  }
 }
 }

Perchè mi rimane acceso? è come se il controllo dell'intervallo non venisse fatto...

Certo perchè dal 3 ci passa solo una volta, quando premi 3 e invio dalla seriale poi resta di nuovo in ascolto e non fa altro

Quel pezzo di codice che fa lampeggiare il led va fuori dagli if (magari in un altra funzione) e la richiami sia dal loop() in modo continuo solo se il 3 ha dato un autorizzazione

Grazie della risposta! Credo di aver capito il problema… Cerco di risolverlo e vedo cosa riesco a combinare!

Grazie ancora pablos!

Usa una variabile di stato e memorizzane il valore ricevuto dalla seriale.

Il controllo lo fai su quella variabile.

Ciao Uwe

es :
bool autorizzaz_lampeggio=false;

---------- loop()--------------
if autorizzaz_lampeggio == true vai a funzione lampeggio()

  • leggo la seriale bla bla
    if = 1 accendo led) autorizzaz_lampeggio == false
    if = 0 spengo led) autorizzaz_lampeggio == false
    if = 3 autorizzaz_lampeggio == true

------- funzione lampeggio()---------
millis()
...
...

uwefed:
Usa una variabile di stato e memorizzane il valore ricevuto dalla seriale.

Il controllo lo fai su quella variabile.

se inserisce un 4 sulla seriale? il led smette di lampeggiare