Problema utilizzo millis

Ciao a tutti!
Devo accendere e spegnere dei pin mediante un telecomando ir e fin qui va tutto bene, ma quando ho implementato la funzione millis per far si che se non spegnessi i pin entro 10 secondi loro si sarebbero spenti da soli ho riscontrato dei problemi sapete aiutarmi ne avrei davvero bisogno!! Grazie mille in anticipo!!

#include <IRremote.h>
#include <IRremoteInt.h>

int RECV_PIN = 11;
int polidoroPin = 13;                 
int forwardPin = 5;                
int playPin = 6;                
int pausePin = 7;  
int val = 0; //si userà per conservare lo stato del pin in input
int vecchio_val = 0; // si userà vecchio_val per conservare lo stato del pin di input al passo precedente
int stato = 0; //ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso
int statopin13 = 0;
int t = 0              

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(reversePin, OUTPUT);      // sets the digital pin as output
pinMode(forwardPin, OUTPUT);      // sets the digital pin as output
pinMode(playPin, OUTPUT);      // sets the digital pin as output
pinMode(pausePin, OUTPUT);      // sets the digital pin as output
t = millis();
}

void loop() {
if ((irrecv.decode(&results)) && (stato ==1)){
  t = millis ();
 
 long int decCode = results.value;
 Serial.println(decCode);
 switch (results.value) {
   case 1431986946:
     Serial.println("Forward");
     digitalWrite(forwardPin, HIGH);   // sets the LED on
     break;
   case 16738455:
     Serial.println("Reverse");
     digitalWrite(reversePin, HIGH);   // sets the LED on
     break;
   case -873913272:
     Serial.println("Play");
     digitalWrite(playPin, HIGH);   // sets the LED on
     break;
   case -1025287420:
     Serial.println("Pause");
     digitalWrite(pausePin, HIGH);   // sets the LED on
     break;  
   case 16750695:
     Serial.println("Stop");
     digitalWrite(forwardPin, LOW);   // sets the LED off
     digitalWrite(reversePin, LOW);   // sets the LED off
     digitalWrite(playPin, LOW);   // sets the LED off
     digitalWrite(pausePin, LOW);   // sets the LED off
     break;  
   default: 
     Serial.println("Waiting ...");
     digitalRead (statopin13);
     if ((statopin13 == 1) && (millis()-t > 10000)){
      digitalWrite(forwardPin, LOW);
      digitalWrite(polidroPin, LOW);
      digitalWrite(playPin, LOW);
      digitalWrite(pausePin, LOW);
     }
     break;
 }
}
 irrecv.resume(); // Receive the next value
}
}

ciao

dovresti spiegare anche quali siano quei problemi.

Intanto posso dirti che tutte le variabili che hanno a che fare con millis (nel tuo caso t) devono essere dichiarate come UNSIGNED LONG.

ciao pippo72

Mi da questi errori

IR_Reciver:15: error: expected ',' or ';' before 'IRrecv'

IRrecv irrecv(RECV_PIN);

^

D:\Arduino\IR_Reciver giusto prova millis\IR_Reciver\IR_Reciver.ino: In function 'void setup()':

IR_Reciver:22: error: 'irrecv' was not declared in this scope

irrecv.enableIRIn(); // Start the receiver

^

IR_Reciver:23: error: 'reversePin' was not declared in this scope

pinMode(reversePin, OUTPUT); // sets the digital pin as output

^

D:\Arduino\IR_Reciver giusto prova millis\IR_Reciver\IR_Reciver.ino: In function 'void loop()':

IR_Reciver:31: error: 'irrecv' was not declared in this scope

if ((irrecv.decode(&results)) && (stato ==1)){

^

IR_Reciver:43: error: 'reversePin' was not declared in this scope

digitalWrite(reversePin, HIGH); // sets the LED on

^

IR_Reciver:65: error: 'polidroPin' was not declared in this scope

digitalWrite(polidroPin, LOW);

^

IR_Reciver:72: error: 'irrecv' was not declared in this scope

irrecv.resume(); // Receive the next value

^

D:\Arduino\IR_Reciver giusto prova millis\IR_Reciver\IR_Reciver.ino: At global scope:

IR_Reciver:74: error: expected declaration before '}' token

}

^

exit status 1 expected ',' or ';' before 'IRrecv'

scusami ma non ho capito cosa dovrei fare della variabile t s

ciao.

Andiamo male....

IR_Reciver:15: error: expected ',' or ';' before 'IRrecv'
 IRrecv irrecv(RECV_PIN);
 ^

significa che alla riga 15 il compilatore si aspetta una , o un ; prima di IRrecv.

se guardi subito sopra vedrai che ti sei dimenticato un ; alla fine della riga.

Gli altri errori sono che le variabili usate non sono dichiarate.

scusami ma non ho capito cosa dovrei fare della variabile t s

devi dichiarare la variabile t come unsigned long:

unsigned long t = 0;

L'impressione che mi dai è che sei vittima del copia-incolla compulsivo ;)

ciao pippo72

Il IR_Reciver:22: error: 'irrecv' was not declared in this scope é probabilmente conseguenza del ; che manca prima. Ciao Uwe

L'impressione che mi dai è che sei vittima del copia-incolla compulsivo ;)

Ho avuto la stessa impressione, ci puoi dare conferma di copia ed incolla?

Le variabili globali con nome composto da meno di tre caratteri sono fonte di bug e confusione. Per le variabili globali usa nomi di variabile autoesplicative, es timeCheCosaTemporizza, al posto di CheCoseTemporizza ci metti qualcosa che lascia intendere a cosa serve. timeUpdateDisplay si capisce che gestisce il tempo di aggiornamento del display.

Prima di inserire millis in un programma copiato occorre studiare l'esempio BlinkWithoutDelay, capire il meccanismo e provare a creare un'altro in un programma separato in modo da prendere confidenza. Solo dopo quando si è più sicuri sul funzionamento si prova ad inserire millis in un programma copiato.

Ciao.

Il sistema iniziale senza millis era pressoché copiato con qualche modifica ma funzionava da quando ho provato ad inserirci millis mi da questi problemi... Funzionamento Io con un telcomando attivo un pin che mi attiva un relè se non lo spegno con un altro pulsante del telecomando il pin si disattiva da solo dopo 10 secondi per via di millis.

Io con un telcomando attivo un pin che mi attiva un relè se non lo spegno con un altro pulsante del telecomando il pin si disattiva da solo dopo 10 secondi per via di millis.

Quindi si riduce tutto a questa logica: IF PIN_A == ATTIVO IF TEMPO_PRECEDENTE + 10sec > MILLIS() DISATTIVA PIN_A

Quindi abbiamo le seguenti variabili a cui dare un nome autoesplicativo: - PIN_A Diventa 1 (se era 0) quando riceve un comando da IR Diventa 0 (se era 1) quando sono trascorsi 10 secondi dall'attivazione (cioè da quando da 0 è diventato 1) Durante i 10 secondi può o meno arrivare un comando di attivazione, se accade come ci si deve comportare? - TempoPrecedente Contiene il valore di millis(), salvato all'istante T in corrispondenza del cambiamento di stato da 0->1 di PIN_A - INTERVALLO Variabile che contiene il tempo in millesimi di secondo che esprime il tempo che deve trascorrere prima di eseguire codice temporizzato

TempoPrecedente inizialmente vale 0, che equivale a dire che il tempo non è ancora stato salvato. Dopo averlo salvato e dopo che il codice temporizzato è stato eseguito dobbiamo azzerare il suo valore.

unsigned long timerSwitchOff_PINA = 0;

void loop () {
    if (timerSwitchOff_PINA == 0)  {
         timerSwitchOff_PINA = millis();
    } else {
         if ( (timerSwitchOff_PINA + 10000U)  > millis() )  {
               timerSwitchOff_PINA = 0;
               // esegue codice ogni 10 secondi per sempre
         }  
    }
}

Lo stesso funzionamento del codice precedente ma anziché aggiungere 10000 a timerSwitchOff_PINA lo sottrae da millis().

unsigned long timerSwitchOff_PINA = 0;

void loop () {
    if (timerSwitchOff_PINA == 0)  {
         timerSwitchOff_PINA = millis();
    } else {
         if ( (millis() - 10000) > timerSwitchOff_PINA  )  {
               timerSwitchOff_PINA = 0;
               // esegue codice ogni 10 secondi per sempre
         }  
    }
}

Ora a te non serve eseguire codice ogni 10 secondi per sempre, ma solo quando PIN_A passa da 0 a 1 (0->1). Per sapere quando una variabile booleana cambia il suo stato occorre conservare lo stato attuale e quello precedente per poi confrontarli tramite una if.

Le due variabili potrebbero chiamarsi previousValueOf_PINA e currentValueOf_PINA e inizialmente valgono zero entrambe.

Quando da IR ricevi il comando in questione, es: IF IR_COMMAND==CODICE_ATTIVAZIONE_PINA currentValueOf_PINA = 1;

unsigned long timerSwitchOff_PINA = 0;

void loop () {

if ( (currentValueOf_PINA != previousValueOf_PINA) && (currentValueOf_PINA == 1) ) {
    if (timerSwitchOff_PINA == 0)  {
         timerSwitchOff_PINA = millis();
    } else {

         if ( (millis() - 10000) > timerSwitchOff_PINA  )  {
               timerSwitchOff_PINA = 0;
               // esegue codice ogni 10 secondi per sempre
         }  

    } // end if (timerSwitchOff_PINA... 
} // end if ( (currentValueOf_PINA != previousValueOf_PINA...
} // end loop

Sono indicazioni e non è codice da prendere e schiaffare nell'IDE sperando che funzioni, la spiegazione dovrebbe aiutare a scrivere di proprio pugno il codice. L'assegnazione del nome alle variabili è parte fondamentale della codifica del codice.

Spero di possa aiutare, ciao.

Grazie mille ho risolto con questo:

#include <IRremote.h>
#include <IRremoteInt.h>

int RECV_PIN = 11;
int Luce1 = 13;
int Motore1 = 9;
unsigned long time_start = 0;
unsigned long deltat = 0;

int flag = 0;
int intervallo = 5000;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // inizia a ricevere
  pinMode(Luce1, OUTPUT);      // settaggio come pin uscita
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value);
    irrecv.resume(); // Receive the next value
  }

  switch (results.value) {
    case 16738455:
      Serial.println("Luce1");
      digitalWrite(Luce1, HIGH);   // accendi luce uno
      flag = 1;
      time_start = millis();
      break;
    case 16756815:
      Serial.println("Motore1");
      digitalWrite(Motore1, HIGH);   // accendi luce uno
      break;
    case 16750695:
      Serial.println("Stop");
      digitalWrite(Luce1, LOW);   // spegni luce 1
      digitalWrite(Motore1, LOW);
      flag = 0;
    default:
      Serial.println("Waiting ...");
  }

  deltat = millis() - time_start;
  if (deltat > intervallo) {
  digitalWrite(Luce1, LOW);   // spegni luce 1
  flag = 0;

Però per caso qualcuno di voi sa se è possibile usare più volte millis nel programma in modo da avere piu contatori?

Si certo, ma di millis() c'è ne uno solo, devi battezzare altre variabili che portai chiamare ad es.: time_start_1 e deltat_1 che usi per gli altri timing.

Stefano

Ah ok, ho capito grazie mille!!!

Si certo, ma di millis() c'è ne uno solo, devi battezzare altre variabili che portai chiamare ad es.: time_start_1 e deltat_1 che usi per gli altri timing.

Bello mi piace il termine battezzare impiegato in questo contesto, calza proprio a pennello. ;)

Ciao.

Sounds good!

:)