ciclo if-else come eseuire il comando una sola volta

Buongiorno a tutti, mi presento mi chiamo Vito e mi sono iscritto nel tentativo di risolvere un problemone che mi si è presentato durante questo progetto.
inizio dal principio, ho realizzato un timer a 4 canali con 4 relè che serve per pilotare ad orari programmati 4 lampade di sterilizzazione UVC, per motivi di cablaggio elettrico, visto che le stesse lampade sono fornite di telecomando a 315 Mhz, mi è venuta l’idea di pilotarle con un modulo trasmettitore alla stessa frequenza, fin qui nessun problema, con il modulo ricevente ho prelevato le stringe numeriche dei telecomandi e l’ho inserito nel codice solo nel primo canale per vedere se il tutto funziona, premesso che il telecomando utilizza lo stesso tasto sia per l’on che per l’off.
qui il problema il software cosi come è strutturato ha dei cicli if else per leggere l’ora impostata per gli start dei relè, ho aggiunto la stringa di comando della libreria RCSwitch" mySwitch.send(9399378, 24);"
ovviamente come immaginavo la lampada si accende e si spegne di continuo ad ogni lettura del ciclo.
ho tentato tutte le strade da me conosciute e prima di suicidarmi volevo chiedervi un piccolo aiutino
metto qui la sezione di codice relativo alla routine incriminata.
grazie a tutti

void One_Timer() {    //Custom function to check timer
if(onhour1 == offhour1 && onmin1==offmin1 && onsec1==offsec1){
   digitalWrite(Relay1, LOW);
}

if(on_Time1 < off_Time1){
  
             if(Time >= on_Time1 && Time < off_Time1){  //Start
             digitalWrite(Relay1, HIGH);
              mySwitch.send(9399378, 24);
             }
             else if(Time >= off_Time1) {
             digitalWrite(Relay1, LOW);
             }
             else{
             digitalWrite(Relay1, LOW);
             }
}
if (on_Time1 > off_Time1){

            if(Time >= on_Time1 && Time <= 235959){     //Start
            digitalWrite(Relay1, HIGH);  
            }
            else if(Time < off_Time1 ){
            digitalWrite(Relay1, HIGH);
            }
            else if(Time >= off_Time1 && Time < on_Time1){
            digitalWrite(Relay1, LOW);  
            }
}
}
void Two_Timer() {    //Custom function to check timer
if(onhour2 == offhour2 && onmin2==offmin2 && onsec2==offsec2){
   digitalWrite(Relay2, LOW);
}

if(on_Time2 < off_Time2){
  
             if(Time >= on_Time2 && Time < off_Time2){  //Start
             digitalWrite(Relay2, HIGH);
             }
             else if(Time >= off_Time2) {
             digitalWrite(Relay2, LOW);
             }
             else{
             digitalWrite(Relay2, LOW);
             }
}
if (on_Time2 > off_Time2){

            if(Time >= on_Time2 && Time <= 235959){     //Start
            digitalWrite(Relay2, HIGH);  
            }
            else if(Time < off_Time2 ){
            digitalWrite(Relay2, HIGH);
            }
            else if(Time >= off_Time2 && Time < on_Time2){
            digitalWrite(Relay2, LOW);  
            }
}
}

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Ciao Vito
per eseguire un comando una sola volta, puoi usare una variabile booleana, o anche una variabile byte a cui fai assumere solo 2 valori, 0=falso 1=vero.
La dichiari tra le variabili globali, nome a piacere, esempio statoRele, e la fai partire a 0 (falso) quindi byte statoRele=0;
Poi dove hai il comando da fare solo 1 volta, metti il comando dentro all'if

...
byte statoRele=0; // falso
...
if(statoRele==0)  // se falso
{ miocomando();    // rele a on
  statoRele=1; // vero
}

Ovviamente da qualche parte nel programma ci dovrà essere un evento, un posto nel codice, dove statoRele viene rimesso a 0 (presumo nel tuo caso sia quando mandi il comando/rele a off)

Aggiungo solo a quanto detto correttamente da nid, che puoi usare lo stesso sistema anche all'interno di cicli che hai gia ... basta che controlli la tua (o le tue) condizioni, E anche la flag ... un ciclo if infatti puo essere condizionato anche da piu di una variabile, quindi, sempre usando come esempio il rele' di nid, mettiamo che lo devi accendere ad una certa ora, ma solo se e' gia spento (tanto per dirne una), controlli nell'if sia l'ora che lo stato, tipo (al volo)

...
byte statoRele=0; // se parti con rele' spento

void loop()
{
   ... il tuo programma
   ... poi dove ti serve ...
   if ((oracorrente == oradiaccensione) && (statoRele=0)) // eseguo solo se entrambe le condizioni vere insieme
   {
      miocomando();    // rele a on
      statoRele=1; // indico che il rele' adesso e' acceso cosi il ciclo non viene rieseguito finche  non lo rimetti
                             a zero nel momento in cui spegnerai il rele 
   }
}

Ovviamente la stessa cosa funziona anche con tre o piu condizioni da controllare, e "viaggia in booleano", cioe' in parole povere, non solo "questo E questo", ma anche, combinando opportunamente i controlli, ad esempio, "se A oppure B, ma solo quando C", e cosi via ... :wink:

Grazie amici per il prezioso suggerimento, sapevo di poter contare sulla vostra competenza, ci provo subito e posto i risultati :wink:

Buongiorno a tutta la comunity, grazie ai consigli di nid69ita e Etemenanki sono riuscito a risolvere l’inghippo, metto di seguito la porzione di codice funzionante al 100%.
Ovviamente il mio problema non era sui relè perchè nel progetto non esistono più, sono rimasti nel programma per definire una condizione, infatti ora le lampade vengono pilotate dal modulo a 315 Mhz collegato sul pin 9 dell’arduino.
Grazie a tutti

byte RelayState1 =0;
byte RelayState2 =0;
byte RelayState3 =0;
byte RelayState4 =0;
.............
.............


void One_Timer() {    //Custom function to check timer
if(onhour1 == offhour1 && onmin1==offmin1 && onsec1==offsec1){
 digitalWrite(Relay1, LOW);
}

if(on_Time1 < off_Time1){

           if((Time >= on_Time1 && Time < off_Time1) && ( RelayState1 ==0)){  //Start
           digitalWrite(Relay1, HIGH);
           mySwitch.send(9399378, 24);
            delay(1000);
            RelayState1 =1;
           }
           else if((Time >= off_Time1) && ( RelayState1 ==1)) {
           digitalWrite(Relay1, LOW);
           mySwitch.send(9399378, 24);
            delay(1000);
            RelayState1 =0;
           }
           else{
           digitalWrite(Relay1, LOW);
           }

vitopetaroscia: Due cose …

  1. non si aprono più thread sullo stesso argomento, ma si continua sul thread già aperto. Ho riunito io il tuo vecchio thread con il nuovo che hai aperto e che era solo la continuazione dl vecchio.

  2. ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).
    In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo.

Grazie,

Guglielmo

Chiedo pazienza, in futuro cercherò do non commettere errori
grazie di tutto