Problemino con millis [Risolto]

Buongiorno a tutti voi, vi sottopongo un piccolo problema che mi si è presentato sul mio progetto.
Ho realizzato per le mie esigenze un ricevitore con atTiny 85 e modulo ricevente a 433 Mhz, utilizzo un telecomando a 4 canali per pilotare un solo relè ma con tre temporizzazioni differenti ed il quarto canale come off diretto. Il primo ch. mi aziona il relè e lo disattiva dopo 15 min, il secondo lo disattiva dopo 30 min. il terzo dopo 60 min.Lo sketch funziona perfettamente ma solo dopo il primo azionamento, qualsiasi canale richiamo, il relè me lo disattiva dopo un tempo random di circa 60 min, dopo il quale ripeto funziona tutto regolarmente fino al distacco dell'alimentazione. Pur tentando varie alternative non ne sono venuto a capo, vi chiedo un suggerimento per uscire da questo impasse. Grazie a tutti

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
const long runTime1 = 900000;
const long runTime2 = 1800000;
const long runTime3 = 3600000;
const long runTimeOFF = 1000;
const int relayPin = 0;

unsigned long startMs1 = 0;
unsigned long startMs2 = 0;
unsigned long startMs3 = 0;
unsigned long startMsoff = 0;


void setup() {
  digitalWrite(relayPin,LOW);
  
  pinMode(relayPin, OUTPUT);
  mySwitch.enableReceive(0);
}

void loop() {
  unsigned long curMs = millis();
  if (curMs - startMs1 >= runTime1 && curMs - startMs2 >= runTime2 && curMs - startMs3 >= runTime3)
  {
    digitalWrite(relayPin,LOW);
  }
 
  
 
  if (mySwitch.available()){
    switch (mySwitch.getReceivedValue()) {
      case 16776969:
      digitalWrite(relayPin,HIGH);
      startMs1 = millis();
      break;
      case 16776967:
      digitalWrite(relayPin,HIGH);
      startMs2 = millis();
      break;
      case 16776965:
      digitalWrite(relayPin,HIGH);
      startMs3 = millis();
      break;
      case 16776971:
      digitalWrite(relayPin,LOW);
      startMsoff = millis();
      break;
    }
    mySwitch.resetAvailable();
}
}

@vitopetaroscia : In conformità al REGOLAMENTO, fosse anche per una sola riga, il codice va racchiuso negli appositi tag ... :roll_eyes:

... cortesemente, quindi, edita il tuo post più sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice.

Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'intero del IDE). Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo anche che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Il problema è nella condizione dell'if che spegne andrebbe cambiata in modo sostanziale.
Ma la modifica che ti proporrei è quella di semplificare il tutto con l'uso di due variabili, una che contiene l'istante di avvio e l'altra che contiene il tempo che deve trascorrere.
Quando ti arriva la comunicazione dal telecomando nello switch farai una cosa del tipo:

switch (mySwitch.getReceivedValue()) {
      case 16776969:
        nTempo = runTime1;
      break;
      case 16776967:
        nTempo = runTime2;
      break;
      ...
    }
    nAvvio = millis()
    digitalWrite(relayPin,HIGH);

a questo punto l'if del loop potrebbe diventare

if(nAvvio>0 && millis()-nAvvio>=nTempo)
{
    digitalWrite(relayPin,LOW);
    nAvvio=0;
}

Grazie del suggerimento, mi metto subito all'opera

Buongiorno a tutto il forum, grazie ai suggerimenti di Fabpolli sono riuscito ed eliminare l'anomalia sulla temporizzazione iniziale, posto il codice corretto.
ciao a tutti.

  #include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
const long runTime1 = 900000;
const long runTime2 = 1800000;
const long runTime3 = 3600000;
const int relayPin = 0;

unsigned long startMs1 = 0;
unsigned long startMs2 = 0;
unsigned long startMs3 = 0;



void setup() {
  digitalWrite(relayPin,LOW);
  
  pinMode(relayPin, OUTPUT);
  mySwitch.enableReceive(0);
}

void loop() {
  unsigned long curMs = millis();
  if (curMs - startMs1 >= runTime1)
  {
    digitalWrite(relayPin,LOW);
  }
 if (curMs - startMs2 >= runTime2)
  {
    digitalWrite(relayPin,LOW);
  }
 if (curMs - startMs3 >= runTime3)
  {
    digitalWrite(relayPin,LOW);
  }
  if (mySwitch.available()){
    switch (mySwitch.getReceivedValue()) {
      case 16776969:
      digitalWrite(relayPin,HIGH);
      startMs1 = millis();
      break;
      case 16776967:
      digitalWrite(relayPin,HIGH);
      startMs2 = millis();
      break;
      case 16776965:
      digitalWrite(relayPin,HIGH);
      startMs3 = millis();
      break;
      case 16776971:
      digitalWrite(relayPin,LOW);
      break;
    }
    mySwitch.resetAvailable();
}
}