Aide pour Timer + relais

Bonjour à tous,

Je cherche tout simplement à programmer un relais en fonction de l'heure.
Je precise les plages horaires se font sur 2 jours, par exemple :
Le relai sur ON de 13h00 à 04h00 le lendemain matin sinon sur OFF

Je récupère l'heure sur un serveur NTP, j'envisage par la suite d'y ajouter un DS3231, pour récupérer l'heure en cas de perte du wifi.

Voici le code utilisé pour l'heure ( le relais y est ajouté ) :

#include <Arduino.h>
#include "WiFi.h"
#include <time.h>

#define CONNECTION_TIMEOUT 10

const char* ssid = "HUAWEI-xxx";
const char* password = "xxxxx";

const int decalage = 1;  // la valeur dépend de votre fuseau horaire. Essayez 1 pour la France. 
const int delaiDemande = 5 * 60; // nombre de secondes entre deux demandes consécutives au serveur NTP
const int RELAY_Chauf = 14;

unsigned long derniereDemande = millis(); // moment de la plus récente demande au serveur NTP
unsigned long derniereMaJ = millis(); // moment de la plus récente mise à jour de l'affichage de l'heure
time_t maintenant;
struct tm * timeinfo;

void get_network_info(){
    if(WiFi.status() == WL_CONNECTED) {
        Serial.print("[*] Network information for ");
        Serial.println(ssid);

        Serial.println("[+] BSSID : " + WiFi.BSSIDstr());
        Serial.print("[+] Gateway IP : ");
        Serial.println(WiFi.gatewayIP());
        Serial.print("[+] Subnet Mask : ");
        Serial.println(WiFi.subnetMask());
        Serial.println((String)"[+] RSSI : " + WiFi.RSSI() + " dB");
        Serial.print("[+] ESP32 IP : ");
        Serial.println(WiFi.localIP());
    }
}

void afficheHeureDate() {

  timeinfo = localtime(&maintenant);

  Serial.print("Heure:   ");
  if ((timeinfo->tm_hour ) < 10) {
    Serial.print("0");
  }
  Serial.print(timeinfo->tm_hour );  // heure entre 0 et 23
  Serial.print(":");

  if (timeinfo->tm_min < 10) {
    Serial.print("0");
  }
  Serial.print(timeinfo->tm_min);   // timeinfo->tm_min: minutes (0 - 59)
  Serial.print(":");

  if (timeinfo->tm_sec < 10) {
    Serial.print("0");
  }
  Serial.print(timeinfo->tm_sec);   // timeinfo->tm_sec: secondes (0 - 60)

  Serial.print("        Date:    ");

  if (timeinfo->tm_mday < 10) {
    Serial.print("0");
  }

  Serial.print(timeinfo->tm_mday);  // timeinfo->tm_mday: jour du mois (1 - 31)
  Serial.print("-");

  if ((timeinfo->tm_mon + 1) < 10) {
    Serial.print("0");
  }

  Serial.print(timeinfo->tm_mon + 1);    // timeinfo->tm_mon: mois (0 - 11, 0 correspond à janvier)
  Serial.print("-");
  Serial.println(timeinfo->tm_year + 1900);  // timeinfo->tm_year: tm_year nombre d'années écoulées depuis 1900

}

void setup() {
  Serial.begin(115200);

    WiFi.begin(ssid, password);
    Serial.println("\nConnecting");
    int timeout_counter = 0;


    while(WiFi.status() != WL_CONNECTED){
        Serial.print(".");
        delay(200);
        timeout_counter++;
        if(timeout_counter >= CONNECTION_TIMEOUT*5){
        ESP.restart();
        }
    }

    Serial.println("\nConnected to the WiFi network");
    get_network_info();


  Serial.println();

  
  configTime(decalage * 3600, 0, "fr.pool.ntp.org");
       // en Europe, essayez europe.pool.ntp.org ou fr.pool.ntp.org
  
  Serial.print("Attente date et heure");

  while (time(nullptr) <= 100000) {
    Serial.print(".");
    delay(1000);
  }

  time(&maintenant);

  Serial.println("");

// Init;
  pinMode(RELAY_Chauf, OUTPUT);

}

void loop() {

  // est-ce le moment de demander l'heure NTP?
  if ((millis() - derniereDemande) >=  delaiDemande * 1000 ) {
    time(&maintenant);
    derniereDemande = millis();

    Serial.println("Interrogation du serveur NTP");
  }

  // est-ce que millis() a débordé?
  if (millis() < derniereDemande ) {
    time(&maintenant);
    derniereDemande = millis();
  }

  // est-ce le moment de raffraichir la date indiquée?
  if ((millis() - derniereMaJ) >=   1000 ) {
    maintenant = maintenant + 1;
    afficheHeureDate();
    derniereMaJ = millis();
  }
}

Pouvez vous me donner un coup de main pour le "si"

Merci à vous

Je répond à mon message pour proposer une alternative ...
J'envois certaines données de mon projet sur Influx, bien sur il y a lui même son NTP, que je pense est utilisable ... sans succès pour moi ...

Voici le code incluant la connexion à influx/grafana, et les données du wifi :

#include <Arduino.h>
#include <WiFiMulti.h>
  WiFiMulti wifiMulti;

#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>

#define DEVICE "ESP32"
#define WIFI_SSID "*********"
#define WIFI_PASSWORD "*********"

// Heure Paris : https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
#define TZ_INFO "CET-1CEST,M3.5.0,M10.5.0/3"

// WiFi & INFLUXDB
#define WIFI_SSID "*********"
#define WIFI_PASSWORD "*********"  
#define INFLUXDB_URL "*********"
#define INFLUXDB_TOKEN "*********"
#define INFLUXDB_ORG "*********"
#define INFLUXDB_BUCKET "*********"

// InfluxDB client instance with preconfigured InfluxCloud certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);

// Data point
Point sensor("wifi_status");

void setup() {
  Serial.begin(115200);

  // Setup wifi
  WiFi.mode(WIFI_STA);
  wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);

  Serial.print("Connecting to wifi");
  while (wifiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();

  // Add tags
  // sensor.addTag("device", DEVICE);
  sensor.addTag("SSID", WiFi.SSID());

  // Alternatively, set insecure connection to skip server certificate validation 
  //client.setInsecure();

  timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");

  // Check server connection
  if (client.validateConnection()) {
    Serial.print("Connected to InfluxDB: ");
    Serial.println(client.getServerUrl());
  } else {
    Serial.print("InfluxDB connection failed: ");
    Serial.println(client.getLastErrorMessage());
  }
}

void loop() {
  
  // Store measured value into point
  sensor.clearFields();
  // Report RSSI of currently connected network
  sensor.addField("rssi", WiFi.RSSI());
  // Print what are we exactly writing
  Serial.print("Writing: ");
  Serial.println(client.pointToLineProtocol(sensor));
  // If no Wifi signal, try to reconnect it
  if (wifiMulti.run() != WL_CONNECTED) {
    Serial.println("Wifi connection lost");
  }
  // Write point
  if (!client.writePoint(sensor)) {
    Serial.print("InfluxDB write failed: ");
    Serial.println(client.getLastErrorMessage());
  }

  //Wait 10s
  Serial.println("Wait 10s");
  delay(10000);
}

Je retrouve bien les infos du NTP mais je n'arrive pas à l'utiliser.

// Heure Paris : https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
#define TZ_INFO "CET-1CEST,M3.5.0,M10.5.0/3"
  timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");

Pour rappel :
Je cherche tout simplement à programmer un relais en fonction de l'heure.
Je precise les plages horaires se font sur 2 jours, par exemple :
Le relais sur ON de 13h00 à 04h00 le lendemain matin sinon sur OFF

Si en plus on peut m'aider à y intégrer un DS3231 pour faire la gestion de l'heure en cas de coupure de wifi ....

Merci pour ce simple bout de projet que je n'arrive pas à faire.

PS : merci pour la modification du post précédent j'avais oublié de cacher les MDP Wifi

Quand tu parle de perte de wifi, c'est sur plusieurs jours?
Tu as besoin que la dérive dans le temps soit si précis que ça pour vouloir y intégrer un DS3231?

En gros je ne suis pas sûr que ce soit nécessaire.

Effectivement sur plusieurs jours, c'est pour ça que j'ai pris le DS3231 avec pile.
Par exemple ça fait 1 mois que je n'ai plus internet ...
J'ai choisi celui ci pour la pile et tant qu'a faire avoir quelques choses de précis.

Effectivement au bout d'un mois, il y a aura une petite différence :slight_smile:
moi j'utilise cette librarie, ajouté via la manager de librairie, il y a pas mal d'exemple fournis.

Partez directement sur un ds3231 beaucoup moins de traca , sinon dans la loop :

 //si l'heure courante est comprise entre 13h00 et 04h00 le lendemain matin,
  if ((hour >= 13) || (hour < 4)) {
    digitalWrite(relayPin, HIGH);
  }
  // sinon, mettre le relais en état bas (OFF)
  else {
    digitalWrite(relayPin, LOW);
  }

Merci à toi mais j'avais essayé avec celle ci ou d'autres ... sans succès... :slight_smile:

@d_jo
Merci aussi pour ce petit bout de code, mais j'avais essayé et le "hour" n'ai pas déclaré, j'ai aussi testé avec le tm_hour ou le timeinfo

Pour cette solution (que je veux faire aussi) je voudrai que le DS3231gère l'heure et qu'une fois par semaine ( ou par jour ) il se synchronise sur un NTP (dans l'idéal celui d'Influx (mon second code dans le 2iem post) pour éviter les grosses dérive.

Comment ça sans succès, que ce passe t-il.
Tu as lancé les exemples?

A moins que tu veuille que l'on te fasse ton code, il faudrait que tu nous donne le code que tu as essayé et le problème rencontré.

Je n'arrivais pas à faire le réglage horaire, j'avais 3 ou 4 minutes de retards, le code était "gros" c'est pour cela que je me suis tourné vers autres choses.

Je reste sur l'idée d'avoir l'heure sur le DS3231 avec comme NTP celui d'influx

le DS3231 dérive de 60 secondes environ à l'année.

Pour mettre à l'heure les DS3231, j'indique la date avec 2 min d'avance dans :

 rtc.adjust(DateTime(2022, 12, 31, 15, 44, 0));

Je téléverse avec le code simple, et je reset l'Arduino une seconde avant la date renseignée.

1 Like

Du coup tu peux mettre ton code ?

#include <Arduino.h>
#include <WiFiMulti.h>
  WiFiMulti wifiMulti;

#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>

#define DEVICE "ESP32"
#define WIFI_SSID "*********"
#define WIFI_PASSWORD "*********"

const int RELAY_Eclai = 13;

// Heure Paris : https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
#define TZ_INFO "CET-1CEST,M3.5.0,M10.5.0/3"

// WiFi & INFLUXDB
#define WIFI_SSID "*********"
#define WIFI_PASSWORD "*********"  
#define INFLUXDB_URL "*********"
#define INFLUXDB_TOKEN "*********"
#define INFLUXDB_ORG "*********"
#define INFLUXDB_BUCKET "*********"

// InfluxDB client instance with preconfigured InfluxCloud certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);

// Data point
Point sensor("wifi_status");

void setup() {
  Serial.begin(115200);

  // Setup wifi
  WiFi.mode(WIFI_STA);
  wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);

  Serial.print("Connecting to wifi");
  while (wifiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();

  // Add tags
  // sensor.addTag("device", DEVICE);
  sensor.addTag("SSID", WiFi.SSID());

  // Alternatively, set insecure connection to skip server certificate validation 
  //client.setInsecure();

  timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");

  // Check server connection
  if (client.validateConnection()) {
    Serial.print("Connected to InfluxDB: ");
    Serial.println(client.getServerUrl());
  } else {
    Serial.print("InfluxDB connection failed: ");
    Serial.println(client.getLastErrorMessage());
  }
}

void loop() {
  
  // Store measured value into point
  sensor.clearFields();
  // Report RSSI of currently connected network
  sensor.addField("rssi", WiFi.RSSI());
  // Print what are we exactly writing
  Serial.print("Writing: ");
  Serial.println(client.pointToLineProtocol(sensor));
  // If no Wifi signal, try to reconnect it
  if (wifiMulti.run() != WL_CONNECTED) {
    Serial.println("Wifi connection lost");
  }
  // Write point
  if (!client.writePoint(sensor)) {
    Serial.print("InfluxDB write failed: ");
    Serial.println(client.getLastErrorMessage());
  }

  //Wait 10s
  Serial.println("Wait 10s");
  delay(10000);
}

Sur mon code complet je n'y est pas encore incorporé la partie Influxdb pour le monitoring.
Je mets une partie de code Influxdb avec le wifi et la constante du relais.
Ca me servira d'exemple pour la suite.

( je précise que je veux récupérer l'heure sur ce NTP car j'aurai des courbes avec cette horaire, tant qu'a faire je voudrai que mes appareils gérer par l'heure sois sur le même NTP )

Ce n'est pas le code avec le RTC, tu parlais de problème de différence de temps?

C’était justement sur la lib que tu as partagé un peu plus haut, mais je ne l’ai pas gardé comme je me suis dis que j’allais être « obligé » d’utiliser influxdb pour mes courbes, alors je me penche pour utiliser leur NTP

( Et bien sûr bonne année :bubbles::champagne::bubbles::champagne: )

Du coup je n'ai pas compris le problème que tu as avec le code que tu as donné ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.