Démarage pompe en 433Mhz et par horloge

Tout d’abord bonjour à tous et merci de l’attention que vous porterez à mon problème.
Je suis nouveau sur le forum donc n’hésitez pas à me dire si je poste au mauvais endroit ou autre erreur… :slight_smile:
Alors voilà j’ai pour projet de pouvoir démarrer ma pompe d’arrosage à heure fixe via un module RTC associé à un Arduino nano, mais j’aurai également voulu la couper ou l’allumer au besoin avec ma télécommande chacon DI.O.
J’ai déjà fait deux codes qui fonctionnent indépendamment, un pour le démarrage-arrêt avec le module RTC et l’autre avec la télécommande 433Mhz mais je n’arrive pas à mixer ces deux codes pour en faire un seul qui ferais interagir les deux fonctions.

Je mets aussi un petit schéma de câblage, si vous avez besoin de plus d’information n’hésitez pas à me le dire.

Encore merci pour l’aide que vous m’apporterez.

Demarage_actionneur_module_rtc.ino (1.31 KB)

Commande_par_radio_433Mhz.ino (1 KB)

Commande_par_radio_433Mhz.ino (1 KB)

Demarage_actionneur_module_rtc.ino (1.31 KB)

je n’ai pas testé du tout mais un petit truc comme ça devrait vous donner des idées sur comment gérer les 2 en même temps en utilisant une variable qui mémorise l’état dans lequel on est.

j’ai pris comme hypothèse que si vous forcez l’extinction alors il faut attendre le prochain cycle pour recommencer et que si vous forcez l’allumage alors ça s’éteindra tout seul à la prochaine heure de fin.

à affiner.

l’autre modification structurelle est dans la gestion du temps: il vaut mieux compter en minutes depuis minuit pour ce genre de choses sinon quand vous comparez avec un && les heures et minutes ça ne fonctionne pas.

si (h > 10 ET min >22) par exemple n’est pas toujours vrai après 10h22… par exemple à 11h15 vous avez bien h>10 mais min <22 donc votre test dirait faux. c’est pour cela qu’il faut tout ramener dans un seul référentiel absolu qui mesure le temps depuis minuit.

enfin j’ai changé la variable qui lit le résultat du code reçu dans le bon format (unsigned long long) et donc les constantes doivent être déclarées avec ULL à la fin (regardez dans votre librairie le type retourné par l’appel à mySwitch.getReceivedValue() )

essayez ça et bien sûr corrigez les bugs!

// fonctions Date et heure en utilisant
// le RTC DS1307 RTC via bus I2C et librairie Wire

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

#include "RCSwitch.h"
RCSwitch mySwitch = RCSwitch();

const uint8_t heure_debut = 18;
const uint8_t minute_debut = 34;
const uint8_t heure_fin = 18;
const uint8_t minute_fin = 35;

const unsigned int t_debut = heure_debut * 60 + minute_debut; // nb minutes depuis minuit
const unsigned int t_fin   = heure_fin * 60 + minute_fin; // nb minutes depuis minuit

unsigned int t_maintenant;

const uint8_t relaisPin = 7;
enum {RELAI_OFF, RELAI_ON, RELAI_FORCED_OFF, RELAI_FORCED_ON}; // déclare des mots clés pour faciliter la lecture du code
uint8_t etatRelai;

void setup () {

  pinMode(7, OUTPUT);
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();

  mySwitch.enableReceive(0);  // Recepteur sur interuption 0 => arduino pin 2*
  digitalWrite(relaisPin, LOW);
  etatRelai = RELAI_OFF;

  if (! RTC.isrunning()) {
    Serial.println("RTC n est pas en cours de fonctionnement!");
    // La ligne suivante fixe la date et l'heure du RTC avec les date et heure de compilation du sketch
    // RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop ()
{
  DateTime now = RTC.now();
  Serial.print(now.hour());
  Serial.print(":");
  Serial.println(now.minute());

  t_maintenant = now.hour() * 60 + now.minute(); // temps en minutes depuis minuit

  if (mySwitch.available()) {
    unsigned long long code_recu = mySwitch.getReceivedValue();
    Serial.println((unsigned long) code_recu); // ne sait pas imprimer des unsigned long long... pas top...
    if (code_recu != 0) { // pas nécessaire mais vous l'aviez, c'est si vous voulez un else...
      if (code_recu == 4474193ULL) // bien mettre UUL pour forcer le type
      {
        digitalWrite(relaisPin, HIGH);
        etatRelai = RELAI_FORCED_ON;
      }
      else if (code_recu == 4474196ULL) // bien mettre UUL pour forcer le type
      {
        digitalWrite(relaisPin, LOW);
        etatRelai = RELAI_FORCED_OFF;
      }
    }
    mySwitch.resetAvailable();
  }

  switch (etatRelai) {
    case RELAI_OFF: // à affiner, on peut séparer les 2 cas... pour ne pas envoyer les messages en permanence au relai.. un peu flemmard ici. :-)
    case RELAI_ON:
      if ((t_maintenant >= t_debut) && (t_maintenant <= t_fin)) {
        digitalWrite(relaisPin, HIGH);
        etatRelai = RELAI_ON;
      } else {
        digitalWrite(relaisPin, LOW);
        etatRelai = RELAI_OFF;
      }
      break;
    case RELAI_FORCED_OFF: // on a forcé l'extinction, on attend le prochain cycle sans rien faire
      if ((t_maintenant < t_debut) || (t_maintenant > t_fin)) {
        etatRelai = RELAI_OFF; // on est à nouveau dispo pour le cycle normal
      }
      break;
    case RELAI_FORCED_ON:  // on a forcé l'allumage, on attend juste la fin du cycle sans tester le début
      if (t_maintenant > t_fin) {
        digitalWrite(relaisPin, LOW);
        etatRelai = RELAI_OFF;
      }
      break;
  }
}

Merci beaucoup pour votre aide il semblerai par contre que je vous ai fourni le mauvais code pour ma télécomande car j’en ai 2 différentes, voici le nouveau et désolé pour mon erreur.

Programme_reception_telecommande_chacon.ino.ino (723 Bytes)

Bonsoir - Le forum n’est pas la pour coder à votre place. Je vous ai donné une piste à Explorer

je vous suggère de comprendre ma proposition d’intégration précédente et de l’adapter votre code et de bosser un peu… si vous rencontrez des soucis postez votre code, expliquez votre approche et le pb que vous rencontrez