Demande d'aide sur code d'un premier projet : limites intellectuelles atteintes

Bonjour à Tous,
Parfois des miracles se produisent ! le problème c'est qu'ils ne se répètent pas !
Je souhaite programmer une dizaine de prises selon des plages horaires définies.
J'ai donc acquis:
une Arduino Uno avec un kit de demarrage
Un module RTC DS1307
un emetteur et Recepteur 433 Mhz
et les prises radio commandées Phenix

Et c'est là que le miracle s'est produit car j'arrive à les commander selon mon besoin.

J'ai 2 questions:

  1. Ce code est il acceptable (La façon de faire est elle correcte ?)
  2. Je souhaiterai effectuer chaque jour à une heure donnée un décalage aléatoire de quelques minutes afin de ne pas avoir toujours les mêmes horaires.
    Je pense que pour les experts que vous êtes, c'est basique, mais pour moi, cela fait plus de 8 jours que je bute sur ce problème.
    Alors si vous pouviez m'aider à ce que le miracle se reproduise je vous en serai éternellement reconnaissant !
    Par avance Merci
    Romich
#include <RCSwitch.h> // Communication avec commande radiofrequence 433 mhz
#include <Wire.h> // echange avec Arduino
#include "RTClib.h" // 
RTC_DS1307 rtc;
RCSwitch mySwitch = RCSwitch();

void setup () {
  Serial.begin(57600);
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // la ligne suivante regle le RTC à la date et heure de compilation
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }

  
      // Emetteur 433 est connecte en Arduino Pin #10  
  mySwitch.enableTransmit(10);

  // Optional set pulse length.
  mySwitch.setPulseLength(320);
  
  // Optional set protocol (default is 1, will work for most outlets)
  // mySwitch.setProtocol(2);
  
  // Optional set number of transmission repetitions.
  mySwitch.setRepeatTransmit(150);
}
 //int jourdecontrole = 0;
 

  void loop () 
  {
    int  randNumber = random(0, 30);
    DateTime now = rtc.now();
   //int jouractuel = now.day(); // = jour du systeme
   //int queljour = weekday ();
   //Serial.println(jouractuel);
   //Serial.print (queljour);
  // Serial.println(jourdecontrole);
     //int  randNumber = random(0, 20);
  
      Serial.print("Le decalage aleatoire sera de : ");
      Serial.print(randNumber);
      Serial.println(" minutes");
  int tpsactuel = ((now.hour()*100)+ now.minute() ); // Affichage de l'heure actuelle en minutes
        // tpsactuel = tpsactuel + randNumber;
        Serial.println(tpsactuel); // retirer
        
    //if (jouractuel != jourdecontrole)
     
      tpsactuel = tpsactuel + randNumber;
      Serial.println(tpsactuel);

   
    // Plages pour P1
    int TPSONP1 =330; // heure ALLUMER Plage N°1 = 3 h 30
    int TPSOFFP1 =345; // heure ETEINDRE Plage N°1 = 3 h 45
    int TPSONP2 =555; 
    int TPSOFFP2 =605;     
    int TPSONP3 =1918; 
    int TPSOFFP3 =1930;  
    int TPSONP4 =1958; 
    int TPSOFFP4 =2012;    
    int TPSONP5 =2203; 
    int TPSOFFP5 =2213;    
    int TPSONP6 =0; 
    int TPSOFFP6 =1;   
    int TPSONP7 =0; 
    int TPSOFFP7 =1; 
    int TPSONP8 =0; 
    int TPSOFFP8 =1;   
    int TPSONP9 =0; 
    int TPSOFFP9 =1;   
    int TPSONP10 =0; 
    int TPSOFFP10 =1; 
 
 // Plages pour P2
    int TPSONP11 =630; // heure ALLUMER Plage N°1 convertie en minute
    int TPSOFFP11 =650; // heure ETEINDRE Plage N°1 convertie en minute
  
    
    
    int P1Allume = 0 ; int P2Allume = 0 ;int P3Allume = 0 ; int P4Allume = 0 ; int P5Allume = 0 ;

    int P6Allume = 0 ;
    int P7Allume = 0 ;
    int P8Allume = 0 ;
    int P9Allume = 0 ;
    int P10Allume = 0 ;
    
    Serial.println(now.day(), DEC);
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    Serial.println (tpsactuel); // en minutes
  
    
    

     // TRAITEMENT PRISE 1   
     // Verification SI la vateur tpsactuel  est comprise dans la fourchette de tps
    if ( (tpsactuel >= TPSONP1) && (tpsactuel <= TPSOFFP1) ||(tpsactuel >= TPSONP2) && (tpsactuel <= TPSOFFP2) ||(tpsactuel >= TPSONP3) && (tpsactuel <= TPSOFFP3)||(tpsactuel >= TPSONP4) && (tpsactuel <= TPSOFFP4)||(tpsactuel >= TPSONP5) && (tpsactuel <= TPSOFFP5)||(tpsactuel >= TPSONP6) && (tpsactuel <= TPSOFFP6)||(tpsactuel >= TPSONP7) && (tpsactuel <= TPSOFFP7)||(tpsactuel >= TPSONP8) && (tpsactuel <= TPSOFFP8)||(tpsactuel >= TPSONP9) && (tpsactuel <= TPSOFFP9)||(tpsactuel >= TPSONP10) && (tpsactuel <= TPSOFFP10) )
    {
      int P1Allume = 1;
      mySwitch.sendTriState("0FFF00FFFF0F");
          delay(500); 
      Serial.println("La prise N 1 est SOUS tension !");  // affiche l'etat ON de P1  
     
   }
     else
     {
       int P1Allume = 0;
     mySwitch.sendTriState("0FFF00FFFFF0");
     Serial.println("La prise N 1 est HORS tension !");  // affiche l'etat OFF de P1  
          delay(500);
     } 
   
   
   // // TRAITEMENT PRISE 2 
        // Verification SI la vateur tpsactuel  est comprise dans la fourchette de tps
    if ( (tpsactuel >= TPSONP11) && (tpsactuel <= TPSOFFP11) ||(tpsactuel >= TPSONP12) && (tpsactuel <= TPSOFFP12) ||(tpsactuel >= TPSONP13) && (tpsactuel <= TPSOFFP13)||(tpsactuel >= TPSONP14) && (tpsactuel <= TPSOFFP14)||(tpsactuel >= TPSONP15) && (tpsactuel <= TPSOFFP15)||(tpsactuel >= TPSONP16) && (tpsactuel <= TPSOFFP16)||(tpsactuel >= TPSONP17) && (tpsactuel <= TPSOFFP17)||(tpsactuel >= TPSONP18) && (tpsactuel <= TPSOFFP18)||(tpsactuel >= TPSONP19) && (tpsactuel <= TPSOFFP19)||(tpsactuel >= TPSONP20) && (tpsactuel <= TPSOFFP20) )
    {
      int P2Allume = 1;
      mySwitch.sendTriState("0FFF0F0FFF0F");
          delay(500); 
      Serial.println("La prise N 2 est SOUS tension !");  // affiche l'etat ON de P2  
     
   }
     else
     {
       int P2Allume = 0;
     mySwitch.sendTriState("0FFF0F0FFFF0");
     Serial.println("La prise N 2 est HORS tension !");  // affiche l'etat OFF de P2  
          delay(500);
     }  
   
  
  Serial.println();   
  Serial.println();  

  
  
delay(1000);
 // Fin du programme
  }

Pour de l'aléatoire tu peux utiliser la fonction Random:

Tu considère que c'est une constante à ajouter et tu l'intègre dans le code

Bonjour,
je n'ai pas tout lu mais il y a déjà au moins une chose qui ne me plaît pas et que j'aimerais que tu corrige avant d'aller plus loin :

int tpsactuel = ((now.hour()*100)+ now.minute() ); // Affichage de l'heure actuelle en minutes
tpsactuel = tpsactuel + randNumber;

Le commentaire doit correspondre au code, et inversement. Or dans ton cas la variable tpsactuel ne contient pas «l'heure actuelle en minutes», mais une représentation un peu bâtarde concaténant les heures et les minutes. À ton avis, si tpsactuel contient 650 (6H50 dans ta logique) et que randNumber contient 20 (minutes), que vaut la somme des deux ? Est-ce une heure valide ? Bien sûr la réponse est non :smiley:

Il y a 60 minutes dans une heure, et donc la façon correcte de convertir les «heures en minutes» est :

int tpsactuel = ((now.hour()*60)+ now.minute() );

De même il faut gérer le passage à minuit lors de l'addition :

tpsactuel = tpsactuel + randNumber;
if (tpsactuel >= 1440) {
  tpsactuel = tpsactuel - 1440;
}

Du coup, il faut bien sûr que tu recalcules toutes tes variables TPSON*/TPSOFF* avec ce nouveau schéma. Le résultat sera peut-être moins plaisant visuellement, mais sera plus juste.

Voilà commence déjà par ça, cela ne va sans doute pas régler ton soucis, mais je pense que ça fera une base de travail un peu plus saine 8)

Pour le côté aléatoire : ton programme doit être loin d'occuper de la place dans la flash. En utilisant PROGMEM, tu peux stocker une grande table de nombre aléatoire en mémoire. Evidemment ce n'est pas purement aléatoire, le but c'est qu'elle soit assez grande pour que ça prenne plusieurs semaines avant de retomber sur le même schéma :wink:

Merci haifger, pour cette rapide réponse.
C'est curieux mais c'est ce que j'avais fait dans un premier temps( hour* 60) et que j'avais changé en (hour*100 ) pour des raisons de lisibilité de l'heure et comme ma variable random n'était jamais négative cela ne posait pas de souci.
Mais merci car c'est exactement le type de conseil que je souhaite obtenir en m'adressant à votre communauté.
Pour ce qui est du décalage aléatoire, j'ai réussi à appliquer une variable randomNumber, mais celle-ci s'applique et change à chaque loop.
Il me semble préférable d'applique ce décalage qu'une fois par jour et que ce décalage reste valable et appliqué pour toute la journée.
Je m'en vais corriger la conversion des Heures en Minutes !
Merci

Merci john_lenfr,
J'ai déjà manipulé le Random, mais cela ne correspond pas à ce que je souhaite, en effet, avec une variable Random que j'ajoute à l'heure actuelle,cela change à chaque boucle du prgramme.
Ce que je souhaite c'est de d'appliquer une variable aléatoire qui ne changerait qu'une seule fois par jour et resterait appliquée pour la journée entière !
Merci par avance
Romich

Merci B@tto pour votre réponse,
Il me faut maintenant aller essayer de comprendre comment appliquer cette fonction PROGMEM !
et ça ce n'est pas gagné !
Merci
Romich

Autrement tu fais une condition if qui appelle random() à 0h00 et qui change la valeur d'un boléen.

Si 0h00 et boléen=0 >>> appelle la fonction radom et mets le boléen à 1
sinon passe
à 23h59 mets le boléen à 0

Merci
Jean-François, c'est exactement ce que j'ai essayé de faire car cela me semblait répondre à ce que je souhaitais mais je n'ai pas réussi à le faire:
c'est probablement là que se situent mes limites!
Je résume :
Je m'étais basé sur le jour : aujourd'hui le 22
Jouractuel = 22
Jourdecontrole = 1
Tant que Jouractuel = 22, " jourdecontrole = 1
Si jouractuel != alors " jourdecontrole = 0
Si " jourdecontrole = 0" alors on fait un random et on met "jourdecontrole = 1"

C'est ici que je me perds car je ne sais pas comment rédiger ni ou placer tout ça ???

If ( jourcontrole != jouractuel ) // si la variable du jour est différente de la date alors on fait random et on mets la valeur du jour à jour...
{ 
random();
 jourcontrole = jouractuel;
}

A mettre en début de loop()...

Jean-François:
on mets la valeur du jour à jour...

:grin:

Y en a qui suivent.... XD