Strano problema su ciclo millis

Ciao ragazzi con il vostro aiuto sono riuscito a convertire un sketch con la funzione millis.
Ora però c’è un problema che a me sembra molto strano: lo sketch all’interno dei voip loop è formato da due cicli che vengono cambiati con l’input di un telecomando. i due cicli sono identici (a parte la tempistica) il secondo ciclo (dove c’è il tasto 2 del telecomando) funziona alla perfezione, nel primo (dove c’è il tasto 1 del telecomando) invece la tempistica sembra non funziona proprio (praticamente il motore gira all’infinito e non rispetta i tempi del millis). mi chiedevo dove poteva essere l’errore?
vi allego lo sketch

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include <IRremote.h> // usa libreria IR
int receiver = 7; // Ricevitore IR digital pin 7
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;


extern unsigned long timer0_millis;  // da elrospo
unsigned long timer_1_1 = 0 ; // da elrospo
unsigned long timer_1_2 = 0 ; // da elrospo
byte timer_signal_1_1 = 0 ; // da elrospo
byte timer_signal_1_2 = 0 ; // da elrospo


void setup()
{
  pinMode(8, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin
  pinMode(10,OUTPUT);//output
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  pinMode(13, OUTPUT); // Pin 13 output led
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print(" CIAO");
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(" SELEZIONA PROG");

}
void loop()

{

  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
  Serial.println(millis ());
  { 
    if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ; // da elrospo

      if ((millis () - timer_1_1) < 6000)// da elrospo
        digitalWrite(13, HIGH),   // set the LED on
        lcd.setCursor(0, 1), // (note: line 1 is the second row, since counting begins with 0):
        lcd.print("  PROGRAMMA 001"), // print the number of seconds since reset:
        //forward @ full speed
        digitalWrite(8, HIGH), //Establishes forward direction of Channel A
        digitalWrite(9, LOW),   //Disengage the Brake for Channel A
        analogWrite(10, 255);   //Spins the motor on Channel A at full speed
      //delay(600000); //gira 10 minuti orario
      if ((millis () - timer_1_1) > 6000 && (millis () - timer_1_1) < 7200 )// da elrospo
        digitalWrite(9, HIGH); //Eengage the Brake for Channel A
      // delay(120000); //freno motore per 2 minuti
      if ((millis () - timer_1_1) >  7200 && (millis () - timer_1_1) < 13200 )// da elrospo
        digitalWrite(8, LOW), //Establishes backward direction of Channel A
        digitalWrite(9, HIGH),   //Disengage the Brake for Channel A
        analogWrite(10, 255);   //Spins the motor on Channel A at half speed
      //delay(600000); //gira 10 minuti antiorario
      if ((millis () - timer_1_1) >  13200 && (millis () - timer_1_1) < 49200)// da elrospo
        digitalWrite(8, HIGH), //Eengage the Brake for Channel A
        digitalWrite(13, LOW);

      if (millis ()  > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ; //da el rospo
      //delay(3600000); //si ferma tutto per 1 ora
    }
  }
  { 
    if ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
    {
      if (timer_signal_1_2 == 0) timer_1_2 = millis(), timer_signal_1_2 = 1 ; // da elrospo

      if ((millis () - timer_1_2) < 3000)// da elrospo  
        digitalWrite(13, HIGH),   // set the LED on
        lcd.setCursor(0, 1), // (note: line 1 is the second row, since counting begins with 0):
        lcd.print("  PROGRAMMA 002"), // print the number of seconds since reset:
        //forward @ full speed
        digitalWrite(8, HIGH), //Establishes forward direction of Channel A
        digitalWrite(9, LOW),   //Disengage the Brake for Channel A
        analogWrite(10, 255);   //Spins the motor on Channel A at full speed
      //delay(300000); //gira 5 minuti orario
      if ((millis () - timer_1_2) > 3000 && (millis () - timer_1_2) < 3600 )// da elrospo
        digitalWrite(9, HIGH); //Eengage the Brake for Channel A
      //delay(60000); //freno motore per 1 minuti
      if ((millis () - timer_1_2) > 3600 && (millis () - timer_1_2) < 6600 )// da elrospo
        digitalWrite(8, LOW), //Establishes backward direction of Channel A
        digitalWrite(9, HIGH),   //Disengage the Brake for Channel A
        analogWrite(10, 255);   //Spins the motor on Channel A at half speed
      //delay(300000); //gira 10 minuti antiorario
      if ((millis () - timer_1_2) > 6600 && (millis () - timer_1_2) < 24600 )// da elrospo
        digitalWrite(8, HIGH), //Eengage the Brake for Channel A
        digitalWrite(13, LOW);
      //delay(1800000); //si ferma tutto per 30 minuti
      if (millis ()  > 24600 && timer_signal_1_2 == 1 ) timer0_millis = 0, timer_signal_1_2 = 0 ; //da el rospo
    }
  }
}

grazie e cordiali saluti

Personalmente mi sono perso dopo poche righe.... non riesco a seguire gli if i cui blocchi di codice non sono inclusi dentro a coppie di graffe.
Poi vedo che azzeri la variabile usata da millis per contare i millisecondi. Sii sicuro di quello che fai, perché che succede se la azzeri se hai un compito a metà? Hai previsto questo caso?

Buonasera le ho provate davvero tutte ma questo “pezzo” di codice sembra che non voglia proprio funzionare:

{ 
    if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ; // da elrospo

      if ((millis () - timer_1_1) < 6000)// da elrospo
        digitalWrite(13, HIGH),   // set the LED on
        lcd.setCursor(0, 1), // (note: line 1 is the second row, since counting begins with 0):
        lcd.print("  PROGRAMMA 001"), // print the number of seconds since reset:
        //forward @ full speed
        digitalWrite(8, HIGH), //Establishes forward direction of Channel A
        digitalWrite(9, LOW),   //Disengage the Brake for Channel A
        analogWrite(10, 255);   //Spins the motor on Channel A at full speed
      //delay(600000); //gira 10 minuti orario
      if ((millis () - timer_1_1) > 6000 && (millis () - timer_1_1) < 7200 )// da elrospo
        digitalWrite(9, HIGH); //Eengage the Brake for Channel A
      // delay(120000); //freno motore per 2 minuti
      if ((millis () - timer_1_1) >  7200 && (millis () - timer_1_1) < 13200 )// da elrospo
        digitalWrite(8, LOW), //Establishes backward direction of Channel A
        digitalWrite(9, HIGH),   //Disengage the Brake for Channel A
        analogWrite(10, 255);   //Spins the motor on Channel A at half speed
      //delay(600000); //gira 10 minuti antiorario
      if ((millis () - timer_1_1) >  13200 && (millis () - timer_1_1) < 49200)// da elrospo
        digitalWrite(8, HIGH), //Eengage the Brake for Channel A
        digitalWrite(13, LOW);

      if (millis ()  > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ; //da el rospo
      //delay(3600000); //si ferma tutto per 1 ora
    }

Sembra che il contatore non funzioni proprio: non si azzera mai al contrario di questo secondo ciclo che invece funziona perfettamente: EPPURE SEMBRANO ESSERE IDENTICI

{ 
    if ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
    {
      if (timer_signal_1_2 == 0) timer_1_2 = millis(), timer_signal_1_2 = 1 ; // da elrospo

      if ((millis () - timer_1_2) < 3000)// da elrospo  
        digitalWrite(13, HIGH),   // set the LED on
        lcd.setCursor(0, 1), // (note: line 1 is the second row, since counting begins with 0):
        lcd.print("  PROGRAMMA 002"), // print the number of seconds since reset:
        //forward @ full speed
        digitalWrite(8, HIGH), //Establishes forward direction of Channel A
        digitalWrite(9, LOW),   //Disengage the Brake for Channel A
        analogWrite(10, 255);   //Spins the motor on Channel A at full speed
      //delay(300000); //gira 5 minuti orario
      if ((millis () - timer_1_2) > 3000 && (millis () - timer_1_2) < 3600 )// da elrospo
        digitalWrite(9, HIGH); //Eengage the Brake for Channel A
      //delay(60000); //freno motore per 1 minuti
      if ((millis () - timer_1_2) > 3600 && (millis () - timer_1_2) < 6600 )// da elrospo
        digitalWrite(8, LOW), //Establishes backward direction of Channel A
        digitalWrite(9, HIGH),   //Disengage the Brake for Channel A
        analogWrite(10, 255);   //Spins the motor on Channel A at half speed
      //delay(300000); //gira 10 minuti antiorario
      if ((millis () - timer_1_2) > 6600 && (millis () - timer_1_2) < 24600 )// da elrospo
        digitalWrite(8, HIGH), //Eengage the Brake for Channel A
        digitalWrite(13, LOW);
      //delay(1800000); //si ferma tutto per 30 minuti
      if (millis ()  > 24600 && timer_signal_1_2 == 1 ) timer0_millis = 0, timer_signal_1_2 = 0 ; //da el rospo
    }
  }

possibile che sia un fatto di parentesi o proprio di codice?

Sii sicuro di quello che fai, perché che succede se la azzeri se hai un compito a metà? Hai previsto questo caso?

Il caso che mi consiglia lei in cosa consiste?

Azzerare la variabile timer0_millis si ripercuote negativamente sulle tempistiche calcolate prima, per cui non azzerarla. Cerca di scrivere il codice sorgente in modo più ordinato di modo che sia più leggibile.

Ciao.

penso di aver scritto il codice in maniera più ordinata, spero che adesso sia più leggibile e facile da comprendere

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include <IRremote.h> // usa libreria IR
int receiver = 7; // Ricevitore IR digital pin 7
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;


extern unsigned long timer0_millis;  // da elrospo
unsigned long timer_1_1 = 0 ; // da elrospo
unsigned long timer_1_2 = 0 ; // da elrospo
byte timer_signal_1_1 = 0 ; // da elrospo
byte timer_signal_1_2 = 0 ; // da elrospo


void setup()
{
  pinMode(8, OUTPUT); 
  pinMode(9, OUTPUT); 
  pinMode(10,OUTPUT);
  Serial.begin(9600); 
  irrecv.enableIRIn(); 
  pinMode(13, OUTPUT);
  lcd.begin(16, 2);
  lcd.print(" CIAO");
  lcd.setCursor(0, 1);
  lcd.print(" SELEZIONA PROG");

}
void loop()

{

  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
  Serial.println(millis ());
  { 
    if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ;
      if ((millis () - timer_1_1) < 6000)
        digitalWrite(13, HIGH),
        lcd.setCursor(0, 1),
        lcd.print("  PROGRAMMA 001"), 
        digitalWrite(8, HIGH), 
        digitalWrite(9, LOW),   
        analogWrite(10, 255);
      if ((millis () - timer_1_1) > 6000 && (millis () - timer_1_1) < 7200 )
        digitalWrite(9, HIGH); 
      if ((millis () - timer_1_1) >  7200 && (millis () - timer_1_1) < 13200 )
        digitalWrite(8, LOW), 
        digitalWrite(9, HIGH),  
        analogWrite(10, 255); 
      if ((millis () - timer_1_1) >  13200 && (millis () - timer_1_1) < 49200)
        digitalWrite(8, HIGH), 
        digitalWrite(13, LOW);
      if (millis ()  > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ;
    }
  }
  { 
    if ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
    {
      if (timer_signal_1_2 == 0) timer_1_2 = millis(), timer_signal_1_2 = 1 ;
      if ((millis () - timer_1_2) < 3000)  
        digitalWrite(13, HIGH),
        lcd.setCursor(0, 1),
        lcd.print("  PROGRAMMA 002"), 
        digitalWrite(8, HIGH),
        digitalWrite(9, LOW),
        analogWrite(10, 255);
      if ((millis () - timer_1_2) > 3000 && (millis () - timer_1_2) < 3600 )
        digitalWrite(9, HIGH);
      if ((millis () - timer_1_2) > 3600 && (millis () - timer_1_2) < 6600 )
        digitalWrite(8, LOW), 
        digitalWrite(9, HIGH),  
        analogWrite(10, 255); 
      if ((millis () - timer_1_2) > 6600 && (millis () - timer_1_2) < 24600 )
        digitalWrite(8, HIGH), 
        digitalWrite(13, LOW);
      if (millis ()  > 24600 && timer_signal_1_2 == 1 ) timer0_millis = 0, timer_signal_1_2 = 0 ;
    }
  }
}

non azzerando la variabile timer0_millis arduino non potrebbe andare in overflow?
perche’ azzerando la variabile millis si ripercuote negativamente sulle tempistiche calcolate prima?

Premessa che non sono in grado di comprendere il codice sorgente e ancora difficile da leggere.
Per cui, se azzeri timer0_millis devi farlo spegnendo gli interrupt globalmente, perché nel momento in cui l'azzeri si può verificare una richiesta di interruzione programmata dal core di Arduino. timer0_millis deve essere dichiarata volatile per poter essere modificata da più contesti
altrimenti la cpu mette timer0_millis su un registro. Non sappiamo cosa accade internamente, può essere che quando azzeri timer0_millis il valore precedente è ancora dentro un registro della cpu. Ti riesce difficile temporizzare il tutto in modo relativo?, cioè salvando il valore di millis() in una variabile e poi facendo sottrazione, insomma come c'è nell'esempio blink senza delay.

Ciao.

Azzerare timer0_millis è operazione, nel 99% dei casi, del tutto inutile e dimostra di non aver ben capito come utilizzare millis() nei propri programmi … :roll_eyes:

Consiglio un attento studio di QUESTO articolo di Leo e poi anche di QUESTO:wink:

Guglielmo

Piccola annotazione: quelle parentesi graffe prima del if( tasto non servono a una cippa.
Naturalmente anche la chiusura di quella graffa. Crei così un blocco di codice racchiuso tra due graffe senza nessuno scopo pratico.

Inoltre questo è veramente brutto da vedere, una forzatura:

if ((millis () - timer_1_1) >  7200 && (millis () - timer_1_1) < 13200 )
        digitalWrite(8, LOW), 
        digitalWrite(9, HIGH),  
        analogWrite(10, 255);

E’ più leggibile:

if ((millis () - timer_1_1) >  7200 && (millis () - timer_1_1) < 13200 )
{ digitalWrite(8, LOW);
  digitalWrite(9, HIGH); 
  analogWrite(10, 255); 
}

Si nid se ci fai caso ha usato l'operatore "," (comma binary operator) per legare due espressioni, probabilmente il codice fa quello che si aspetta, ma non è li che ci aspettiamo di vedere l'operatore "," cioè non c'è alcun motivo di usarlo, e questo complica la comprensione del codice, perché si da per scontato che il codice sia scritto come hai fatto tu. Poi guardando il codice la prima, la seconda ecc, ci sia accorge delle stranezze, e non si sa se il codice ne riserva delle altre che ancora non abbiamo notato.

Ciao.

Salve ragazzi, vi sono grato per tutti i vostri consigli ma a parte tutte le varie migliorie che si possono fare al codice la cosa più strana che c’è su questo codice, è che i due programmi all’interno del loop pur essendo identici, il primo a differenza del secondo non funziona.
questo è il primo

 void loop()

{

  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
  Serial.println(millis ());
  { 
    if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ;
      if ((millis () - timer_1_1) < 6000)
        digitalWrite(13, HIGH),
        lcd.setCursor(0, 1),
        lcd.print("  PROGRAMMA 001"), 
        digitalWrite(8, HIGH), 
        digitalWrite(9, LOW),   
        analogWrite(10, 255);
      if ((millis () - timer_1_1) > 6000 && (millis () - timer_1_1) < 7200 )
        digitalWrite(9, HIGH); 
      if ((millis () - timer_1_1) >  7200 && (millis () - timer_1_1) < 13200 )
        digitalWrite(8, LOW), 
        digitalWrite(9, HIGH),  
        analogWrite(10, 255); 
      if ((millis () - timer_1_1) >  13200 && (millis () - timer_1_1) < 49200)
        digitalWrite(8, HIGH), 
        digitalWrite(13, LOW);
      if (millis ()  > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ;
    }
  }

questo è il secondo

{ 
    if ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
    {
      if (timer_signal_1_2 == 0) timer_1_2 = millis(), timer_signal_1_2 = 1 ;
      if ((millis () - timer_1_2) < 3000)  
        digitalWrite(13, HIGH),
        lcd.setCursor(0, 1),
        lcd.print("  PROGRAMMA 002"), 
        digitalWrite(8, HIGH),
        digitalWrite(9, LOW),
        analogWrite(10, 255);
      if ((millis () - timer_1_2) > 3000 && (millis () - timer_1_2) < 3600 )
        digitalWrite(9, HIGH);
      if ((millis () - timer_1_2) > 3600 && (millis () - timer_1_2) < 6600 )
        digitalWrite(8, LOW), 
        digitalWrite(9, HIGH),  
        analogWrite(10, 255); 
      if ((millis () - timer_1_2) > 6600 && (millis () - timer_1_2) < 24600 )
        digitalWrite(8, HIGH), 
        digitalWrite(13, LOW);
      if (millis ()  > 24600 && timer_signal_1_2 == 1 ) timer0_millis = 0, timer_signal_1_2 = 0 ;
    }
  }
}

Come potete vedere sono identici a parte la tempistica. Non vi sembra strano che il primo non funzioni?
che cosa si potrebbe modificare per farlo funzionare?
GRAZIE

robpg:
Salve ragazzi, vi sono grato per tutti i vostri consigli ma a parte tutte le varie migliorie che si possono fare al codice la cosa più strana che c’è su questo codice, è che i due programmi all’interno del loop pur essendo identici, il primo a differenza del secondo non funziona.
questo è il primo

 void loop()

{

if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
  Serial.println(millis ());
  {
    if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ;
      if ((millis () - timer_1_1) < 6000)
        digitalWrite(13, HIGH),
        lcd.setCursor(0, 1),
        lcd.print("  PROGRAMMA 001"),
        digitalWrite(8, HIGH),
        digitalWrite(9, LOW),   
        analogWrite(10, 255);
      if ((millis () - timer_1_1) > 6000 && (millis () - timer_1_1) < 7200 )
        digitalWrite(9, HIGH);
      if ((millis () - timer_1_1) >  7200 && (millis () - timer_1_1) < 13200 )
        digitalWrite(8, LOW),
        digitalWrite(9, HIGH), 
        analogWrite(10, 255);
      if ((millis () - timer_1_1) >  13200 && (millis () - timer_1_1) < 49200)
        digitalWrite(8, HIGH),
        digitalWrite(13, LOW);
      if (millis ()  > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ;
    }
  }



questo è il secondo


{
    if ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
    {
      if (timer_signal_1_2 == 0) timer_1_2 = millis(), timer_signal_1_2 = 1 ;
      if ((millis () - timer_1_2) < 3000) 
        digitalWrite(13, HIGH),
        lcd.setCursor(0, 1),
        lcd.print("  PROGRAMMA 002"),
        digitalWrite(8, HIGH),
        digitalWrite(9, LOW),
        analogWrite(10, 255);
      if ((millis () - timer_1_2) > 3000 && (millis () - timer_1_2) < 3600 )
        digitalWrite(9, HIGH);
      if ((millis () - timer_1_2) > 3600 && (millis () - timer_1_2) < 6600 )
        digitalWrite(8, LOW),
        digitalWrite(9, HIGH), 
        analogWrite(10, 255);
      if ((millis () - timer_1_2) > 6600 && (millis () - timer_1_2) < 24600 )
        digitalWrite(8, HIGH),
        digitalWrite(13, LOW);
      if (millis ()  > 24600 && timer_signal_1_2 == 1 ) timer0_millis = 0, timer_signal_1_2 = 0 ;
    }
  }
}



Come potete vedere sono identici a parte la tempistica. Non vi sembra strano che il primo non funzioni?
che cosa si potrebbe modificare per farlo funzionare?
GRAZIE

bisogna tenere a mente un paio di cose,
1 se un pin lo metti HIGH rimarra HIGH SEMPRE :astonished: e qui intendo …

 if ((millis () - timer_1_1) > 6000 && (millis () - timer_1_1) < 7200 )
        digitalWrite(9, HIGH);

che il pin 9 resterà sempre acceso anche quando millis () supererà 7200,

anche se il loop inizia da capo ( o millis () viene azzerato) il un pin HIGH resterà sempre HIGH se non lo porti LOW con
digitalWrite(9, LOW);

se millis () viene azzerato o no lo sai solo se fai Serial.println(millis ()); e guardi il valore nel serial monitor senza dar troppo retta a gli altri,

quando uno sketc fa quello che deve fare sempre e comunque vuol dire che funziona bene … = mai tentare di “aggiustarlo”

il pin 13 HIGH viene messo LOW in questa fase:

if ((millis () - timer_1_1) >  13200 && (millis () - timer_1_1) < 49200)
        digitalWrite(8, HIGH), 
        digitalWrite(13, LOW);
      if (millis ()  > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ;
    }
  }

Ho provato anche con il Serial.println(millis ()) infatti il tempo continua sempre a scorrere mentre sul secondo programma si azzera a fine ciclo.
Sul primo programma funziona tutto fino a qui:

  if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ;
      if ((millis () - timer_1_1) < 6000)
        digitalWrite(13, HIGH),
        lcd.setCursor(0, 1),
        lcd.print("  PROGRAMMA 001"), 
        digitalWrite(8, HIGH), 
        digitalWrite(9, LOW),   
        analogWrite(10, 255);

praticamente funziona fino a qui all’infinito

robpg:
Salve ragazzi, vi sono grato per tutti i vostri consigli ma a parte tutte le varie migliorie che si possono fare al codice la cosa più strana che c'è su questo codice, è che i due programmi all'interno del loop pur essendo identici, il primo a differenza del secondo non funziona.

Robpg, scusa se sono diretto.
Come ti hanno spiegato, stai usando il linguaggio in un modo... fantasioso? Non è il termine più adatto ma è quello che mi passa in mente vedendo come scrivi...
In C/C++ a me hanno insegnato che ogni riga DEVE terminare con il ";". La virgola è un operatore in C, e non serve per mandare a capo le istruzioni. Non so se lo sai ma l'operatore virgola dice al codice: valuta le varie istruzioni ed assegna come risultato quella più a destra. A me pare che in questo caso l'unica istruzione di tutte le digitalWrite che si è certi sia eseguita è quindi l'ultima, quella col punto e virgola.

Rimetti il codice in bella, mettendo le varie parentesi graffe per suddividere i vari blocchi di codice in modo che il compilatore compili il programma per come lo vede e non per come pensa che debba compilarlo e poi ne riparliamo.

Ma infatti non mi ritengo un genio e non lo sarò mai, anzi sono alle prime “armi” e accetto i vostri consigli. Avevo realizzato uno sketch con delay e dovevo sostituirlo con la funzione millis e qualcuno mi aveva aiutato a fare lo sketch che avevo pubblicato prima. Spero che questo che sto pubblicando vada bene e sia compilato correttamente:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include <IRremote.h> // usa libreria IR
int receiver = 7; // Ricevitore IR digital pin 7
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;


extern unsigned long timer0_millis;  // da elrospo
unsigned long timer_1_1 = 0 ; // da elrospo
unsigned long timer_1_2 = 0 ; // da elrospo
byte timer_signal_1_1 = 0 ; // da elrospo
byte timer_signal_1_2 = 0 ; // da elrospo


void setup()
{
  pinMode(8, OUTPUT); 
  pinMode(9, OUTPUT); 
  pinMode(10,OUTPUT);
  Serial.begin(9600); 
  irrecv.enableIRIn(); 
  pinMode(13, OUTPUT);
  lcd.begin(16, 2);
  lcd.print(" CIAO");
  lcd.setCursor(0, 1);
  lcd.print(" SELEZIONA PROG");

}
void loop()

{

  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
  Serial.println(millis ());
  { 
    if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ;
      if ((millis () - timer_1_1) < 6000)
      {
        digitalWrite(13, HIGH);
        lcd.setCursor(0, 1);
        lcd.print("  PROGRAMMA 001"); 
        digitalWrite(8, HIGH); 
        digitalWrite(9, LOW);   
        analogWrite(10, 255);
      }
      if ((millis () - timer_1_1) > 6000 && (millis () - timer_1_1) < 7200 )
      {
        digitalWrite(9, HIGH); 
      }
      if ((millis () - timer_1_1) >  7200 && (millis () - timer_1_1) < 13200 )
      {
        digitalWrite(8, LOW); 
        digitalWrite(9, HIGH);  
        analogWrite(10, 255); 
      }
      if ((millis () - timer_1_1) >  13200 && (millis () - timer_1_1) < 49200)
      {
        digitalWrite(8, HIGH), 
        digitalWrite(13, LOW);
      }
      if (millis ()  > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ;
    }
  }
  { 
    if ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
    {
      if (timer_signal_1_2 == 0) timer_1_2 = millis(), timer_signal_1_2 = 1 ;
      if ((millis () - timer_1_2) < 3000)  
      {
        digitalWrite(13, HIGH);
        lcd.setCursor(0, 1);
        lcd.print("  PROGRAMMA 002");
        digitalWrite(8, HIGH);
        digitalWrite(9, LOW);
        analogWrite(10, 255);
      }
      if ((millis () - timer_1_2) > 3000 && (millis () - timer_1_2) < 3600 )
      {
        digitalWrite(9, HIGH);
      }
      if ((millis () - timer_1_2) > 3600 && (millis () - timer_1_2) < 6600 )
      {
        digitalWrite(8, LOW); 
        digitalWrite(9, HIGH); 
        analogWrite(10, 255); 
      }
      if ((millis () - timer_1_2) > 6600 && (millis () - timer_1_2) < 24600 )
      {
        digitalWrite(8, HIGH); 
        digitalWrite(13, LOW);
      }
      if (millis ()  > 24600 && timer_signal_1_2 == 1 ) timer0_millis = 0, timer_signal_1_2 = 0 ;
    }
  }
}

Ribadisco comunque il problema delle tempistiche. Con il delay funzionava tutto correttamente . se volete posso pubblicare anche quello se vi può essere d’aiuto.
grazie

if (millis ()  > 24600 && timer_signal_1_2 == 1 ) timer0_millis = 0, timer_signal_1_2 = 0 ;

C'è ancora qualcosa che non va.
Di quelle 2 istruzioni, come detto, viene eseguita solo la seconda.
Poi NON azzerare millis, non serve.

Quindi cosa dovrei cambiare sullo sketch?Si la seconda parte (quella del tasto 2 del telecomando) viene eseguita perfettamente, ho provato anche non azzerando millis ma nulla cambia la prima parte (quella del tasto 1 del telecomando) non funziona!!

robpg:
Quindi cosa dovrei cambiare sullo sketch?

Te l'abbiamo ripetuto diverse volte..... le virgole! :sweat_smile:
Quella che usi tu non va bene come sintassi C... non so più come fartelo capire... :stuck_out_tongue:

Si la seconda parte (quella del tasto 2 del telecomando) viene eseguita perfettamente, ho provato anche non azzerando millis ma nulla cambia la prima parte (quella del tasto 1 del telecomando) non funziona!!

Ti è stato anche detto di non azzerare millis, non serve. Però... a 'sto punto.. dopo 2 pagine di discussione... se continui a presentare codice scritto in maniera errata ed a chiedere come mai non funziona, vuol dire che ti sta bene così. E se ti sta bene a te, a me sta anche meglio. Saluti. :wink:

robpg:
il pin 13 HIGH viene messo LOW in questa fase:

if ((millis () - timer_1_1) >  13200 && (millis () - timer_1_1) < 49200)

digitalWrite(8, HIGH),
        digitalWrite(13, LOW);
      if (millis ()  > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ;
    }
  }



Ho provato anche con il Serial.println(millis ()) infatti il tempo continua sempre a scorrere mentre sul secondo programma si azzera a fine ciclo.
Sul primo programma funziona tutto fino a qui:


if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ;
      if ((millis () - timer_1_1) < 6000)
        digitalWrite(13, HIGH),
        lcd.setCursor(0, 1),
        lcd.print("  PROGRAMMA 001"),
        digitalWrite(8, HIGH),
        digitalWrite(9, LOW),   
        analogWrite(10, 255);



praticamente funziona fino a qui all'infinito

le mie “parole” hanno significato generale,… non specificatamente
se metti punto e virgola e ok racchiudere tra parentesi tutte le istruzioni da seguire con gli if
se millis () non si azzera vuol dire che e stato messo tra qualche parentesi di “troppo” e diventa un if nell’if :frowning:

una riga cosi
if (millis () > 49200 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ;

puoi metterla all’inizio del codice nel loop e farà lo stesso i suo lavoro

@ elrospo : continuo a vedere tuoi post in cui parli e suggerisci l’azzeramento di timer0_millis … questo, nel 99% dei casi è sbagliato ed è dettato da “ignoranza” nell’uso corretto della funzione millis() !

I casi in cui serve VERAMENTE azzerare timer0_millis sono molto rari e molto specifici quindi … se tu ti diverti a farlo fai pure, ma vorrei pregarti di dare evitare di continuare a dare questo suggerimento fuorviante agli altri … :slight_smile:

Guglielmo