Problema sostituzione funzione Delay con Millis

Buonasera ho bisogno del vostro aiuto per modificare il mio codice che serve per azionare un motore. Sto compilando un programma con ARDUINO UNO. Sono riuscito a fare il mio programma e funziona tutto, l’unico problema che non riesco a risolvere è che una volta avviato lo sketch (per farlo utilizzo un telecomando) dove all’interno si trova la funzione delay l’arduino non accetta più nessun tipo di input da parte del telecomando. A me servirebbe poter interrompere o modificare il programma iniziato, tramite telecomando. Ho trovato delle guide in cui è possibile fare tutto sostituendo la funzione “delay” con la funzione “millis” ,purtroppo non riesco ad inserirla nel linguaggio.
Spero di aver esposto bene il mio problema…
Questo è il codice in questione:

// 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;

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
  }

  { while ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
  {
  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
  
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A
  delay(120000); //freno motore per 2 minuti
  
  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
  
  digitalWrite(8, HIGH); //Eengage the Brake for Channel A
  digitalWrite(13, LOW);
  delay(3600000); //si ferma tutto per 1 ora
  }
  }
 { while ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
 {
 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
  
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A
  delay(60000); //freno motore per 1 minuti
  
  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
  
  digitalWrite(8, HIGH); //Eengage the Brake for Channel A
  digitalWrite(13, LOW);
  delay(1800000); //si ferma tutto per 30 minuti
  }
  }
  }

Cordiali saluti

robpg:
Buonasera ho bisogno del vostro aiuto per modificare il mio codice che serve per azionare un motore. Sto compilando un programma con ARDUINO UNO. Sono riuscito a fare il mio programma e funziona tutto, l’unico problema che non riesco a risolvere è che una volta avviato lo sketch (per farlo utilizzo un telecomando) dove all’interno si trova la funzione delay l’arduino non accetta più nessun tipo di input da parte del telecomando. A me servirebbe poter interrompere o modificare il programma iniziato, tramite telecomando. Ho trovato delle guide in cui è possibile fare tutto sostituendo la funzione “delay” con la funzione “millis” ,purtroppo non riesco ad inserirla nel linguaggio.
Spero di aver esposto bene il mio problema…
Questo è il codice in questione:

// 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;

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
  }

{ while ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
  {
  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
 
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A
  delay(120000); //freno motore per 2 minuti
 
  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
 
  digitalWrite(8, HIGH); //Eengage the Brake for Channel A
  digitalWrite(13, LOW);
  delay(3600000); //si ferma tutto per 1 ora
  }
  }
{ while ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
{
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
 
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A
  delay(60000); //freno motore per 1 minuti
 
  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
 
  digitalWrite(8, HIGH); //Eengage the Brake for Channel A
  digitalWrite(13, LOW);
  delay(1800000); //si ferma tutto per 30 minuti
  }
  }
  }



Cordiali saluti

se al primo post non si fanno le presentazioni ci saranno sempre problemi ]:smiley:
prova questo e dimmi se risolvi non ho potuto testarlo perché non ho l’ardware
le righe che ho aggiunto (// elrospo)
alla fine dei due cicli millis viene riportato a zero,
se levi timer0_millis = 0, millis continua normalmente ma dopo un po di giorni potrebbe andare in overflow

// 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
  }

  { while ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
  {
  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
 if (timer_signal_1_1 == 0) timer_1_1 = millis(), timer_signal_1_1 = 1 ; // da elrospo
 
   if ((millis () - timer_1_1) < 600000)// da elrospo
  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) > 600000 && (millis () - timer_1_1) < 720000 )// da elrospo
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A
  // delay(120000); //freno motore per 2 minuti
if ((millis () - timer_1_1) >  720000 && (millis () - timer_1_1) < 1320000 )// 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) >  1320000 && (millis () - timer_1_1) < 4920000)// da elrospo
  digitalWrite(8, HIGH), //Eengage the Brake for Channel A
  digitalWrite(13, LOW);
  
 if (millis ()  > 4920000 && timer_signal_1_1 == 1 ) timer0_millis = 0, timer_signal_1_1 = 0 ; //da el rospo
  //delay(3600000); //si ferma tutto per 1 ora
  }
  }
 { while ( 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) < 300000)// 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) > 300000 && (millis () - timer_1_2) < 360000 )// da elrospo
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A
  //delay(60000); //freno motore per 1 minuti
  if ((millis () - timer_1_2) > 360000 && (millis () - timer_1_2) < 660000 )// 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) > 660000 && (millis () - timer_1_2) < 2460000 )// da elrospo
  digitalWrite(8, HIGH), //Eengage the Brake for Channel A
  digitalWrite(13, LOW);
  //delay(1800000); //si ferma tutto per 30 minuti
   if (millis ()  > 2460000 && timer_signal_1_2 == 1 ) timer0_millis = 0, timer_signal_1_2 = 0 ; //da el rospo
  }
  }
  }

Buonasera di nuovo e scusate per le presentazioni, se mi date il link le faccio subito.
Per prima cosa grazie per l'impegno che ci ha messo.
Ho caricato lo sketch sopra descritto, purtroppo si presenta lo stesso problema: una volta che il programma parte ARDUINO non accetta più nessun tipo di input. Il programma comunque funziona come con la funzione delay.

elrospo:
....
alla fine dei due cicli millis viene riportato a zero,
se levi timer0_millis = 0, millis continua normalmente ma dopo un po di giorni potrebbe andare in overflow
...

Ho la vaga idea che non hai capito come usare la millis() ...
... se i confronti sono ben fatti, a te NON interessa minimamente che dopo poco più di 49 giorni la millis() torni a zero, è una cosa ininfluente !

Consiglio sia di studiare QUESTO articolo che di capire come utilizzarla in QUEST'altro, che spiega la cosa ... :slight_smile:

Guglielmo

robpg:
Buonasera di nuovo e scusate per le presentazioni, se mi date il link le faccio subito.
Per prima cosa grazie per l'impegno che ci ha messo.
Ho caricato lo sketch sopra descritto, purtroppo si presenta lo stesso problema: una volta che il programma parte ARDUINO non accetta più nessun tipo di input. Il programma comunque funziona come con la funzione delay.

ok ... che lo sketc funziona senza delay siamo sulla buona strada 8) forse devi dare un "aggiustatina" al ricevitore"
nel senso che una volta che ha ricevuto il primo comando di preciso come si comporta ?
si mette in attesa da capo ad aspettare un nuovo comando come all'inizio ?
se non ci sono delay il micro e operativo a tutti gli effetti

comunque devi lo stesso sistemarlo un po meglio lo sketc il caso si verificano delle condizioni particolari, es se si è in mezzo a un "ciclo"
e si vuole cambiare con l'altra versione del ciclo devi "dirglielo tu" con un if esempio ,
purtroppo come ti ho detto prima non ho il tuo telecomando,

e migliorare sketc senza l'ardware è una cosa quasi impossibile (per me)

Una volta ricevuto il primo comando dal telecomando, parte il programma selezionato e il ciclo funziona praticamente all’infinito, perché a quel punto il telecomando risulta inesistente.
L’unico modo per farlo uscire dal ciclo è spegnere o resettare la scheda dell’ARDUINO, a quel punto è possibile selezionare un nuovo programma. Il telecomando funziona correttamente, forse dovrebbe essere sostituita qualche espressione all’interno dello sketch dato che una volta che inizia un ciclo non esce più. Quale potrebbe essere?

personalmente …imposterei cosi, quando ricevo un comando valido dal telecomando porto una variabile byte da zero a uno,
e adopererei la verifica su questa variabile per poter eseguire il ciclo n°1
es
nel setup
byte sistema_1 = 0;
byte sistema_2 = 0;

void loop

if ( ricevuto dato 1 da telecomando) sistema_1 = 1, byte sistema_2 = 0, “dato ricevuto telecomando” = 0;
if (sistema_1 == 1) si esegue il primo ciclo;

if ( ricevuto dato 2 da telecomando) sistema_2 = 1, byte sistema_1 = 0, “dato ricevuto telecomando” = 0;
if (sistema_2 == 1) si esegue il secondo ciclo;

da notare che quando si riceve un dato da telecomando si ferma l’altro ciclo disattivando la variabile byte sistema…
e si porta a zero il dato ricevuto dal telecomando (la sua variabile)

E' possibile che questa istruzione debba essere contenuta all'interno del ciclo while? O che nello sketch completo ci sia qualche problema con le parentesi?

{
  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
  }

lo strumento principale per il debug è il serial print con quello puoi vedere "tutto" cio che accade

elrospo:
lo strumento principale per il debug è il serial print con quello puoi vedere "tutto" cio che accade

Ho la vaga idea che tu non sappia cosa è un debugger...
Magari è lo strumento di debug più utilizzato su Arduino perché non necessita di hardware dedicato...

Il Serial print è un sistema di ripiego proprio perché su Arduino non c'è un debugger.

L'unico modo, tra l'altro limitato, è usare (solo su Windows) AVR Studio, un debugger AVR come il Dragon e il protocollo debug-wire (proprietario) abilitatile sul micro tramite fuse.

Ciao ragazzi ho risolto il problema dell'input verso arduino durante un ciclo. E' bastato cambiare l'istruzione While con un if proprio qui: (lo sketch è quello pubblicato da elrospo )
PRIMA

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
  }

  { while ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
  {

DOPO

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
  }

  { if ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
  {

Ora però c'è un problema di tempistica, forse a fine ciclo il contatore millis non si azzera!
Poi con l'istruzione if il ciclo viene ripetuto all'infinito?

se vuoi vedere che tempo ha millis
basta che aggiungi la riga Serial.println(millis ());

apri il serial monitor e vedi se alla fine delle attivazioni dei motori riparte da capo

per la seconda domanda (sempre se ho capito) gli if vengono sempre verificati "se si arriva al punto di verificarli"

es se ci sono if precedenti che riguardano il tutto

@Elrospo, quando scivi codice dei inserirlo negli appositi tag altrimenti la leggibilità va a farsi benedire.

Inoltre

Serial.println(millis());

non serve assolutamente perché vedresti solo quanti millisecondi sono trascorsi dall’accensione, e visto che, come ti hanno già detto sopra, buona programmazione è NON azzerare il timer di millis(), quella riga non serve a niente.

@robpg
Millis non si deve resettare, come ti hanno giò indicato sopra…

gpb01:
Consiglio sia di studiare QUESTO articolo che di capire come utilizzarla in QUEST’altro, che spiega la cosa … :slight_smile:

robpg:
Buonasera ho bisogno del vostro aiuto ...

Saresti da fustigare sulla pubblica piazza per come hai scritto il codice. :grin:
Devi usare l'indentazione. Fatti aiutare dall'IDE, usa il tasto CTRL+T (formattazione automatica) :wink:

Ciao ragazzi accetto molto volentieri tutti questi aiuti e chiarimenti, ma c’è qualcuno in grado di modificare questo sketch dove è usata la funzione delay in uno identico usando la funzione millis? Questo mi serve per poter far accettare degli input ad ARDUINO UNO tramite telecomando.

// 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;

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(" IL PASSATEMPO");
  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
  }

  { 
    while ( results.value == 0xFF30CF ||  results.value == 0xFF30CF ) //tasto 1 sul telecomando
    {
      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

      digitalWrite(9, HIGH); //Eengage the Brake for Channel A
      delay(120000); //freno motore per 2 minuti

      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

      digitalWrite(8, HIGH); //Eengage the Brake for Channel A
      digitalWrite(13, LOW);
      delay(3600000); //si ferma tutto per 1 ora
    }
  }
  { 
    while ( results.value == 0xFF18E7 ||  results.value == 0xFF18E7 ) //tasto 2 sul telecomando
    {
      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

      digitalWrite(9, HIGH); //Eengage the Brake for Channel A
      delay(60000); //freno motore per 1 minuti

      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

      digitalWrite(8, HIGH); //Eengage the Brake for Channel A
      digitalWrite(13, LOW);
      delay(1800000); //si ferma tutto per 30 minuti
    }
  }
  { 
    while ( results.value == 0xFF7A85 ||  results.value == 0xFF7A85 ) //tasto 3 sul telecomando
    {
      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 003"); // 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, 200);   //Spins the motor on Channel A at full speed
      delay(600000); //gira 10 minuti orario

      digitalWrite(9, HIGH); //Eengage the Brake for Channel A
      delay(120000); //freno motore per 2 minuti

      digitalWrite(8, LOW); //Establishes backward direction of Channel A
      digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
      analogWrite(10, 200);   //Spins the motor on Channel A at half speed
      delay(600000); //gira 10 minuti antiorario

      digitalWrite(8, HIGH); //Eengage the Brake for Channel A
      digitalWrite(13, LOW);
      delay(3600000); //si ferma tutto per 1 ora
    }
  }
  { 
    while ( results.value == 0xFF10EF ||  results.value == 0xFF10EF ) //tasto 4 sul telecomando
    {
      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 004"); // 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, 200);   //Spins the motor on Channel A at full speed
      delay(300000); //gira 5 minuti orario

      digitalWrite(9, HIGH); //Eengage the Brake for Channel A
      delay(60000); //freno motore per 1 minuti

      digitalWrite(8, LOW); //Establishes backward direction of Channel A
      digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
      analogWrite(10, 200);   //Spins the motor on Channel A at half speed
      delay(300000); //gira 10 minuti antiorario

      digitalWrite(8, HIGH); //Eengage the Brake for Channel A
      digitalWrite(13, LOW);
      digitalWrite(15, LOW);
      delay(1500000); //si ferma tutto per 25 minuti
    }
  }
}

Grazie.

Non è così banale e immediato, devi usare la millis() dentro una macchina a stati. Una macchina a stati è un'ingegnoso sistema per divivere il funzionamento della tua macchina in blocchi (stati). Ad esempio:

Stato 1: Vai avanti, aspetta 60 secondi e poi vai allo stato 2
Stato 2: Attiva il freno e aspetta 1 minuto prima di andare allo stato 3
Stato 3: etc.....

Ti faccio un esempio, poi vedi te come inserirlo nel tuo codice, ma prima leggiti l'istruzione switch

int stato;
unsigned long timePrec;

void loop() {
  switch (stato) {
    case 0:  //Lo switch esegue a partire da qui quando stato vale 0
    //lo stato di riposo, dove è tutto fermo. Parti da qui e quando vuoi partire metti stato = 1
    if ( quello che ti pare) {
      timePrec = millis();
      stato = 1;
    }
    break;
    
    case 1:  //Lo switch esegue a partire da qui quando stato vale 1
    //vai avanti motore
    //etc...
    if (millis() - timePrec >= xxxx) {
      timePrec = millis();
      stato = 1;
    }
    break;
    
    case 2: //Lo switch esegue a partire da qui quando stato vale 2
    //ferma motore
    //attiva freno
    //etc...
    if (millis() - timePrec >= xxxx) {
      timePrec = millis();
      stato = 2;
    }
    break;
    
    case 3:
    //
    
    //...
    //...
    //...
    
    case n:
    //quando hai finito il ciclo devi tornare allo stato 0 (a riposo)
    if (millis() - timePrec >= xxxx) {
      timePrec = millis();
      stato = 0;
    }
    break;
  }
}