/*
#define led1Pin 15
#define led2Pin 2
#define led3Pin 4
#define led4Pin 16
#define led5Pin 17
#define led6Pin 5
#define led7Pin 18
*/
// !!!!!!!!!!!! Les librairies !!!!!!!!!!!!!!
#include <WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <TimeLib.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// !!!!!!!!!!!!!!Déclarer variables PERSO!!!!!!!!!!!!!!!
// Coordonnées géographiques de votre emplacement
const float latitude = 44.889153;
const float longitude = 4.652633;
// Configuration des broches utilisées
const int ALIM_RELAY_PIN = 2; // Broche du contacteur de l'alim
const int MOTOR_RELAY_PIN = 4; // Broche du contacteur du moteur
const int END_SWITCH_PIN = 15; // Broche de l'interrupteur de fin de course
// Définissez les dates de début et de fin de l'heure d'été en France (année en cours)
const int daylightBeginDay = 28;
const int daylightBeginMonth = 3; // Mars
const int daylightEndDay = 31;
const int daylightEndMonth = 10; // Octobre
const int timeToOpen_ms = 2000; // Le temps que le moteur doit tourner pour ouvrir totalement la porte
// !!!!!!!!!!!!!!!! Variables pour le code, perso !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Remplacez les valeurs suivantes par votre SSID et votre mot de passe WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Définissez l'adresse IP et le port du serveur NTP
const char* ntpServer = "pool.ntp.org";
// Définir l'adresse IP et le port du serveur sunrise-sunset
const char* serverIP = "api.sunrise-sunset.org";
const int serverPort = 80;
// Valeurs de temps et Offsets
int gmtOffset_sec = 3600; // Décalage horaire en secondes (UTC+1 pour la France)
int gmtOffset_hour ; // Décalage horaire en Heures (UTC+1 pour la France)
time_t yearVar = 0;
time_t monthVar = 0;
int dayVar = 0;
bool doorIsOpen = true;
bool isItDaytime ;
// Déclarez un objet NTPClient pour récupérer l'heure du serveur NTP
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, ntpServer, gmtOffset_sec);
void setup() {
Serial.begin(9600);
// Connexion au réseau WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connexion au WiFi en cours...");
}
Serial.println("Connexion au WiFi établie");
// Initialisation de l'objet NTPClient
timeClient.begin();
// Initialisation des relais et de l'interrupteur de fin de course
pinMode(ALIM_RELAY_PIN, OUTPUT); // Broche du contacteur de l'alim
pinMode(MOTOR_RELAY_PIN, OUTPUT); // Broche du contacteur du moteur
pinMode(END_SWITCH_PIN, INPUT_PULLUP);
}
void getDate() {
// Mise à jour de l'heure depuis le serveur NTP
timeClient.update();
int epoch = 0;
epoch = timeClient.getEpochTime();
dayVar = day(epoch);
monthVar = month(epoch);
yearVar = year(epoch);
}
bool isDaylightTime( int month, int day) {
if ((month > daylightBeginMonth && month < daylightEndMonth) ||
(month == daylightBeginMonth && day >= daylightBeginDay) ||
(month == daylightEndMonth && day <= daylightEndDay)) {
return true;
} else {
return false;
}
}
void isDaylightTimeCheckup_gmtOffset() {
bool isDST = isDaylightTime(monthVar, dayVar);
if (isDST) {
// Serial.println("La date d'aujourd'hui est à passer à l'heure d'été");
gmtOffset_sec = 3600;
gmtOffset_hour = 2;
}
else {
//Serial.println("La date d'aujourd'hui est à laisser en heure d'hiver");
gmtOffset_sec = 0;
gmtOffset_hour = 1;
}
}
void openDoorFunction() {
digitalWrite(MOTOR_RELAY_PIN, LOW);
delay (1000);
digitalWrite(ALIM_RELAY_PIN, HIGH);
delay (timeToOpen_ms);
digitalWrite(ALIM_RELAY_PIN, LOW);
}
void closeDoorFunction() {
digitalWrite(MOTOR_RELAY_PIN, HIGH);
delay (1000);
digitalWrite(ALIM_RELAY_PIN, HIGH);
while (END_SWITCH_PIN == HIGH) {
delay (100);
}
digitalWrite(ALIM_RELAY_PIN, LOW);
}
void loop() {
getDate();
isDaylightTimeCheckup_gmtOffset();
int epoch = 0;
epoch = timeClient.getEpochTime()+gmtOffset_sec;
// Appel de l'API sunrise-sunset pour récupérer les données
String url = "/json?lat=" + String(latitude) + "&lng=" + String(longitude) + "&formatted=0";
HTTPClient http;
http.begin(serverIP, serverPort, url);
int httpResponseCode = http.GET();
if (httpResponseCode == 200) {
String payload = http.getString();
// Parse la réponse JSON
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
const char* sunrise = doc["results"]["sunrise"];
const char* sunset = doc["results"]["sunset"];
// Store et extrait les valeurs aux bons noms
int currentHour = hour(epoch);
int currentMin = minute(epoch);
int sunriseHour = atoi(&sunrise[11]) + gmtOffset_hour;
int sunsetHour = atoi(&sunset[11])+ gmtOffset_hour;
int sunriseMin = atoi(&sunrise[14]);
int sunsetMin = atoi(&sunset[14]);
// DEBUGGING ON SERIAL MONITOR
Serial.print("CurrentHour : ");
Serial.println(currentHour);
Serial.print("CurrentMin : ");
Serial.println(currentMin);
Serial.println("________________________________");
Serial.print("Heure sunset : ");
Serial.println(sunsetHour);
Serial.print("Min sunset : ");
Serial.println(sunsetMin);
Serial.println("________________________________");
Serial.print("Sunset complet: ");
Serial.println(sunset);
Serial.println("________________________________");
Serial.print("Heure sunrise : ");
Serial.println(sunriseHour);
Serial.print("Min sunrise : ");
Serial.println(sunriseMin);
Serial.println("________________________________");
Serial.print("Sunrise complet: ");
Serial.println(sunrise);
Serial.println("________________________________");
Serial.print("Heure actuelle Timeclient: ");
Serial.println(timeClient.getFormattedTime());
Serial.println("________________________________");
Serial.print("Date actuelle calculée: ");
Serial.print(dayVar);
Serial.print("/");
Serial.print(monthVar);
Serial.print("/");
Serial.println(yearVar);
Serial.println("________________________________________________");
if (currentHour >= sunriseHour && currentHour < sunsetHour) {
isItDaytime = true; // Il fait jour
Serial.println("Il fait jour ");
Serial.println("________________________________");
} else {
isItDaytime = false; // Il fait nuit
Serial.println("Il fait nuit ");
Serial.println("________________________________");
}
} else {
Serial.println("Erreur lors de l'appel de l'API sunrise-sunset");
Serial.println("_____________!!!!!!!!!!!!!!!!!!!!!!!!!!!!!___________________");
}
if (isItDaytime != doorIsOpen) {
if (doorIsOpen) {
closeDoorFunction();
doorIsOpen = false;
Serial.println("La porte a été fermée");
Serial.println("________________________________");
}
else {
openDoorFunction();
doorIsOpen = true;
Serial.println("La porte a été ouverte");
Serial.println("________________________________");
}
}
else {
Serial.println("La porte reste dans son état précédent");
Serial.println("________________________________");
}
delay(1000); // Attendre 1 seconde avant la prochaine mise à jour
}
/*
void loop() {
digitalWrite(led1Pin, HIGH);
delay(1000);
digitalWrite(led2Pin, HIGH);
delay(1000);
digitalWrite(led3Pin, HIGH);
delay(1000);
digitalWrite(led4Pin, HIGH);
delay(1000);
digitalWrite(led5Pin, HIGH);
delay(1000);
digitalWrite(led6Pin, HIGH);
delay(1000);
digitalWrite(led7Pin, HIGH);
delay(2000);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
digitalWrite(led4Pin, LOW);
digitalWrite(led5Pin, LOW);
digitalWrite(led6Pin, LOW);
digitalWrite(led7Pin, LOW);
delay(1000);
}*/