RTC+relais: éclairage et arrosage aléatoire

Bonjour à tous,
J'aimerai parvenir à éclairer et arroser des plantes.
Pour les lampes, 10heures par jour mais de manières aléatoires, c'est à dire que la lampe s'allumera une heure par exemple, puis s'éteindra 30 min, s'allumera 14min etc... De même pour l'arrosage mais avec une durée moindre.
J'ai un arduino nano, couplé à un RTC DS3231, et 2 relais 220V. (Panneau LEDs, Pompe hydraulique)
j'ai un code pour programmer l'allumage et l'éteindre à des heures précises, mais de manière systématique. Ce que je ne souhaite pas.

Quelqu'un aurait il une piste? j'imagine que je dois passer par RANDOM, mais je n'en sais pas davantage.

Merci.

commencez par poster le code qui allume à heures précises... ça sera une base de travail.

#include <DS3231.h>

#include <Wire.h>

DS3231 clock;
RTCDateTime dt;
int led = 8;
int relay = 9;

void setup()
{
  Serial.begin(9600);
  
  // Initialize DS3231
  Serial.println("Initialize DS3231");;
  clock.begin();

  // Disarm alarms and clear alarms for this example, because alarms is battery backed.
  // Under normal conditions, the settings should be reset after power and restart microcontroller.
  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();

  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
 
  // Manual (Year, Month, Day, Hour, Minute, Second)
 

  // Set Alarm - Every second.
  // DS3231_EVERY_SECOND is available only on Alarm1.
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(0, 0, 0, 0, DS3231_EVERY_SECOND);

  // Set Alarm - Every full minute.
  // DS3231_EVERY_MINUTE is available only on Alarm2.
  // setAlarm2(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm2(0, 0, 0, 0, DS3231_EVERY_MINUTE);
  
  // Set Alarm1 - Every 20s in each minute
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  clock.setAlarm1(0, 0, 0, 20, DS3231_MATCH_S);

  // Set Alarm2 - Every 01m in each hour
  // setAlarm2(Date or Day, Hour, Minute, Mode, Armed = true)
  clock.setAlarm2(0, 0, 1,     DS3231_MATCH_M);

  // Set Alarm - Every 01m:25s in each hour
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(0, 0, 1, 25, DS3231_MATCH_M_S);

  // Set Alarm - Every 01h:10m:30s in each day
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(0, 1, 10, 30, DS3231_MATCH_H_M_S);

  // Set Alarm - 07h:00m:00s in 25th day in month
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(25, 7, 0, 0, DS3231_MATCH_DT_H_M_S);

  // Set Alarm - 10h:45m:30s in every Friday (1 - Mon, 7 - Sun)
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  // clock.setAlarm1(5, 10, 40, 30, DS3231_MATCH_DY_H_M_S);
  
  // Check alarm settings
  checkAlarms();
}

void checkAlarms()
{
  RTCAlarmTime a1;  
  RTCAlarmTime a2;

  if (clock.isArmed1())
  {
    a1 = clock.getAlarm1();

    Serial.print("Alarm1 is triggered ");
    switch (clock.getAlarmType1())
    {
      case DS3231_EVERY_SECOND:
        Serial.println("every second");
        break;
      case DS3231_MATCH_S:
        Serial.print("when seconds match: ");
        Serial.println(clock.dateFormat("__ __:__:s", a1));
        break;
      case DS3231_MATCH_M_S:
        Serial.print("when minutes and sencods match: ");
        Serial.println(clock.dateFormat("__ __:i:s", a1));
        break;
      case DS3231_MATCH_H_M_S:
        Serial.print("when hours, minutes and seconds match: ");
        Serial.println(clock.dateFormat("__ H:i:s", a1));
        break;
      case DS3231_MATCH_DT_H_M_S:
        Serial.print("when date, hours, minutes and seconds match: ");
        Serial.println(clock.dateFormat("d H:i:s", a1));
        break;
      case DS3231_MATCH_DY_H_M_S:
        Serial.print("when day of week, hours, minutes and seconds match: ");
        Serial.println(clock.dateFormat("l H:i:s", a1));
        break;
      default: 
        Serial.println("UNKNOWN RULE");
        break;
    }
  } else
  {
    Serial.println("Alarm1 is disarmed.");
  }

  if (clock.isArmed2())
  {
    a2 = clock.getAlarm2();

    Serial.print("Alarm2 is triggered ");
    switch (clock.getAlarmType2())
    {
      case DS3231_EVERY_MINUTE:
        Serial.println("every minute");
        break;
      case DS3231_MATCH_M:
        Serial.print("when minutes match: ");
        Serial.println(clock.dateFormat("__ __:i:s", a2));
        break;
      case DS3231_MATCH_H_M:
        Serial.print("when hours and minutes match:");
        Serial.println(clock.dateFormat("__ H:i:s", a2));
        break;
      case DS3231_MATCH_DT_H_M:
        Serial.print("when date, hours and minutes match: ");
        Serial.println(clock.dateFormat("d H:i:s", a2));
        break;
      case DS3231_MATCH_DY_H_M:
        Serial.println("when day of week, hours and minutes match: ");
        Serial.print(clock.dateFormat("l H:i:s", a2));
        break;
      default: 
        Serial.println("UNKNOWN RULE"); 
        break;
    }
  } else
  {
    Serial.println("Alarm2 is disarmed.");
  }
}

void loop()
{
  dt = clock.getDateTime();

  Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));

  // Call isAlarm1(false) if you want clear alarm1 flag manualy by clearAlarm1();
  if (clock.isAlarm1())
  {
    Serial.println("ALARM 1 TRIGGERED!");
    digitalWrite(led, HIGH);
    delay(5000);
    digitalWrite(relay, HIGH);
    delay(1000);
   
  }
  else 
digitalWrite(led, LOW);
digitalWrite(relay, LOW);

  // Call isAlarm2(false) if you want clear alarm1 flag manualy by clearAlarm2();
  if (clock.isAlarm2())
  {
    Serial.println("ALARM 2 TRIGGERED!");
    
 }
 
  delay(1000);
}

Je me baserai sur ce code pour programmer une alarm à telle heure, arrosage puis éclairage avec delay.
Ca, c'est si je veux me contenter de cycle systématique. Au contraire je voudrai, que par tranche de 24heures, il y est 10heures d'éclairages et 5min d'arrosage aléatoires.

Ce projet pique ma curiosité: c'est absolument pas naturel comme type d'éclairage, pauvres plantes...

Il y a t'il un quelconque intérêt pour la plante?

Bonjour,
C'est intéressant ce projet :slight_smile:
pour générer des nombres aléatoires,j'ai trouvé ce bout de code

long randNumber; // déclaration d'une variable long

void setup(){
  Serial.begin(9600); // initialise la connexion série vers le PC à 9600 bauds

  // si la broche analogique 0 n'est pas connectée, le bruit analogique aléatoire
  // provoquera l'appel de l'instruction randomSeed() pour générer
  // différent nombre de départ à chaque exécution du programme. 
  // randomSeed() brouillera alors la fonction aléatoire

  randomSeed(analogRead(0));
}

void loop() {
  // affiche un nombre aléatoire entre 0 et 299
  randNumber = random(300);
  Serial.println(randNumber);  

  // affiche un nombre aléatoire entre 10 et 19 
  randNumber = random(10, 20);
  Serial.println(randNumber);

  delay(50); // pause de 50 ms
}

une solution aussi ,consiste à récupérer l'information d'un compteur geiger.Et là,c'est véritablement aléatoire.Chaque fois qu'une particule traverse le capteur,un bip est émis,ce peut être le top départ ,et la durée serait déterminée par le nombre aléatoire issu du bruit de fond d'une entrée analogique.Après tu comptabilises tes temps on et off pour rester dans ton cahier des charges de 10h sur 24 h.Je ne pense pas que l'utilisation d'un module rtc soit necessaire sauf si tu veux déclencher quelque chose à un moment précis(mais ce n'est plus aléatoire) ...