non so usare nè millis nè sec timer

salve a tutti, sto provando a fare un pò di pratica con arduino uno.
ho preso degli esempi in rete e cerco di modificarli a piacere.
tramite seriale invio dei caratteri a arduino e con uno switch case esegue delle determinati operazioni e scrive delle cose su seriale.
vorrei provare a usare il "multitasking " di arduino ma non capisco come fare.

allora mentre è in ascolto sulla seriale voglio far lampeggiare un led ho provato con millis e il lampeggìo del led è a tempo però il programma non mi ascolta sulla seriale. mentre con secTimer anche con l'esempio base ho notato che il tempo non corrisponde.
Grazie a tutti delle risposte

#define luce1 11  // led connesso al pin n°10
#define luce2 10
#define luce3 9
#define luce4 8
#define luce5 6
#define luce6 7
byte rx = 0;    // variabile per contenere il carattere ricevuto
int stato1=0;
int stato2=0;
int stato3=0;
int stato4=0;
int stato5=0;
int stato6=0;
long previousMillis = 0; 
long interval = 5000;

void setup()
	{
	Serial.begin(9600); // imposto la UART per lavorare a 9600
        pinMode(luce1, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
	pinMode(luce2, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
	pinMode(luce3, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
	pinMode(luce4, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
	pinMode(luce5, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
	pinMode(luce6, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
		
        Serial.flush(); // svuoto il buffer di ricezione seriale
	}
void loop()
	{

	if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
		{
		rx = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
		Serial.flush(); // svuoto il buffer di ricezione seriale
   switch (rx) {
  case '1':    // your hand is on the sensor
    digitalWrite(luce1,HIGH);
    Serial.println("luce1 accesa");
    break;
  case '2':    // your hand is close to the sensor
    digitalWrite(luce2,HIGH);
    Serial.println("luce2 accesa");
    break;
  case '3':    // your hand is a few inches from the sensor
    digitalWrite(luce3,HIGH);
    Serial.println("luce3 accesa");
    break;
  case '4':    // your hand is nowhere near the sensor
    digitalWrite(luce4,HIGH);
    Serial.println("luce4 accesa");
    break;
  case '5':    // your hand is nowhere near the sensor
    digitalWrite(luce5,HIGH);
    Serial.println("luce5 accesa");
    break;
  case '6':    // your hand is nowhere near the sensor
    digitalWrite(luce6,HIGH);
    Serial.println("luce6 accesa");
    break;
    
  case 'a':    // your hand is on the sensor
    digitalWrite(luce1,LOW);
    Serial.println("luce 1 spenta");
    break;
  case 'b':    // your hand is close to the sensor
    digitalWrite(luce2,LOW);
    Serial.println("luce 2 spenta");
    break;
  case 'c':    // your hand is a few inches from the sensor
    digitalWrite(luce3,LOW);
    Serial.println("luce 3 spenta");
    break;
  case 'd':    // your hand is nowhere near the sensor
    digitalWrite(luce4,LOW);
    Serial.println("luce 4 spenta");
    break;
  case 'e':    // your hand is nowhere near the sensor
    digitalWrite(luce5,LOW);
    Serial.println("luce 5 spenta");
    break;
  case 'f':    // your hand is nowhere near the sensor
    digitalWrite(luce6,LOW);
    Serial.println("luce 6 spenta");
    break;
  
    case '0':
   stato1= digitalRead(luce1);
   if (stato1==1){
      Serial.println("luce1 accesa");
   }
      else{
      Serial.println("luce1 spenta");
      }
         stato2= digitalRead(luce2);
   if (stato2==1){
      Serial.println("luce2 accesa");
   }
      else{
      Serial.println("luce2 spenta");
      }
         stato3= digitalRead(luce3);
   if (stato3==1){
      Serial.println("luce3 accesa");
   }
      else{
      Serial.println("luce3 spenta");
      }
         stato4= digitalRead(luce4);
   if (stato4==1){
      Serial.println("luce4 accesa");
   }
      else{
      Serial.println("luce4 spenta");
      }
  } 

   }
     unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;
           stato6^=1;
        digitalWrite(luce6, stato6);
  }
}

Che versione del IDE usi? Le versioni IDE 1.X non supportano piú la funzione serial.flush().

Non so se la funzione

stato6^=1;

á ammessa con una variabile di tipo INT.
prova a sostituirlo con

stato6 =1-stato6;

Ciao Uwe

ciao e grz x la risp.
uso la 0023.

stato6^=1;

il fatto è che a me lampeggia ilk led, quindi lo stato6 me lo cambia di valore.

cmq con

     unsigned long currentMillis = millis();
     if(currentMillis - previousMillis > interval) {
    
     previousMillis = currentMillis;
     stato6^=1;
     digitalWrite(luce6, stato6);

adesso riesco a far lampeggiare il led e a comunicare con la seriale.
il problema mi resta solo con secTimer.

Uwe ma mi consigli di passare all'IDE 1.X ?

sto appna leggendo la discussione su leOS , credo che quello sia il nuovo modo di gestire il multitasking ...ke ne dite? quando eseguo una funzione con leOS posso leggere il risultato nel loop?

cirociro88:
il problema mi resta solo con secTimer.

secTimer l'ho scritta io. Che problemi hai con questa lib?

Uwe ma mi consigli di passare all'IDE 1.X ?

L'IDE 1.0 è buggata, il consiglio vivissimo è quello di passare alla 1.0.3.

cirociro88:
sto appna leggendo la discussione su leOS , credo che quello sia il nuovo modo di gestire il multitasking ...ke ne dite? quando eseguo una funzione con leOS posso leggere il risultato nel loop?

Altra mia libreria :wink:
Se in un task del leOS modifichi una variabile globale, essa può essere letta e gestita dal loop principale del programma senza problemi.

ok grazie leo. secTimer l'ho scaricata ieri sera , l'ho provata e anche con l'esempio base, il tempo non corrisponde, cioè la frequenza di lampeggìo del led non è di un secondo(almeno a me).
cmq a qst punto credo sia conveniente passare direttamente a leOS... lo vorrei utilizzare per leggere dati da arduino (sensori ecc) e poi qllo ke mi ritorna dalla funzione lo leggerò tramite seriale nel loop.
ad esempio: mentre nel loop tengo la seriale aperta per inviare comandi ad arduino e ricevere risposte, nell'evento schedulato vorrei leggere ogni 5 min la temperatura di un sensore, e gestirla nel loop...nel senso se valore troppo basso accendi led.
nn so se mi sn spiegato.
grazie

cirociro88:
ok grazie leo. secTimer l'ho scaricata ieri sera , l'ho provata e anche con l'esempio base, il tempo non corrisponde, cioè la frequenza di lampeggìo del led non è di un secondo(almeno a me).

E non potrebbe essere altrimenti visto che l'Arduino ha un risonatore ceramico che ha una tolleranza della frequenza rispetto al valore nominale molto alta per cui se vuoi un tempo esatto al secondo devi usare o un RTC termocompensato oppure un orologio atomico :wink:
Prendi 2 Arduino oppure 2 micro in standalone, caricaci sopra il Blink ed avviali insieme. Dopo 3/4 secondi noterai come ognuno lampeggia con una frequenza differente, indice delle tolleranze dei quarzi o risonatori.

cmq a qst punto credo sia conveniente passare direttamente a leOS... lo vorrei utilizzare per leggere dati da arduino (sensori ecc) e poi qllo ke mi ritorna dalla funzione lo leggerò tramite seriale nel loop.
ad esempio: mentre nel loop tengo la seriale aperta per inviare comandi ad arduino e ricevere risposte, nell'evento schedulato vorrei leggere ogni 5 min la temperatura di un sensore, e gestirla nel loop...nel senso se valore troppo basso accendi led.
nn so se mi sn spiegato.
grazie

[/quote]
Non leggere dati da sensori la cui lettura implica operazioni molto lunghe. Se devi leggere un pin è un conto, se devi fare richiesta via I2C o seriale è un altro paio di maniche. Il leOS (e tutte le operazioni basate sugli interrupt) devono sempre essere più semplici possibile, per evitare di rallentare l'Arduino.
In questo caso è meglio usare il looper, che è uno schedulatore non basato sugli interrupt per cui non soffre di questi problemi.

se all evento schedulato faccio fare solo temp=analogread(a0);
e poi la variabile temp la gestisco fuori dall'evento? cioè nel loop?
tipo la conversione del valore analogico in gradi e anche la trasmissione via seriale?
e nel loop metto la condizione che se temp è cambiato (ma cambierà solo se la vado a leggere ed io la leggerò tramite l'evento) fa cose tipo accendi led, comunicalo alla seriale ecc altrimenti passa avanti

Nel task puoi mettere la lettura del pin, così va bene.

ok grazie.