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