Pages: [1]   Go Down
Author Topic: non so usare nè millis nè sec timer  (Read 1183 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:

#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);
  }
}


Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21936
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Non so se la funzione
Code:
stato6^=1;
á ammessa con una variabile di tipo INT.
prova a sostituirlo con
Code:
stato6 =1-stato6;

Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao e grz x la risp.
uso la 0023.

Code:
stato6^=1;
il fatto è che a me lampeggia ilk led, quindi lo stato6 me lo cambia di valore.

cmq con
Code:
     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 ?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

il problema mi resta solo con secTimer.
secTimer l'ho scritta io. Che problemi hai con questa lib?

Quote
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.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
Se in un task del leOS modifichi una variabile globale, essa può essere letta e gestita dal loop principale del programma senza problemi.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-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.

Quote
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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie.
Logged

Pages: [1]   Go Up
Jump to: