1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <time.h>
#include "FS.h"
#include "SPIFFS.h"
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Wi-Fi
const char* ssid = "xxxxxx";
const char* password = "xxxxxxx";
// Coordonnées GPS
const float latitude = 45.658952;
const float longitude = 5.27877;
// Fuseau horaire local (ex: Paris = UTC+2 en été)
const long gmtOffset_sec = 2* 3600; // <====
const int daylightOffset_sec = 0;
// NTP
const char* ntpServer = "pool.ntp.org"; // <====
String sunriseLocal, sunsetLocal, dateStr;
int dernierJour = -1;
void setup() {
Serial.begin(115200);
if (!SPIFFS.begin(true)) {
Serial.println("Erreur SPIFFS");
}
// OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Écran OLED non détecté"));
while (true);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Connexion WiFi...");
display.display();
// Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println(WiFi.localIP());
// NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// Première récupération et affichage
updateEph();
// Attente pour éviter redémarrage rapide
delay(2000);
}
void loop() {
// Vérifie si un nouveau jour a commencé
struct tm timeinfo;
if (getLocalTime(&timeinfo)) {
if (timeinfo.tm_mday != dernierJour) {
updateEph(); // Nouveau jour → maj
}
}
delay(60000); // Vérifie toutes les minutes
}
void updateEph() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Erreur temps local");
return;
}
char dateBuf[20];
strftime(dateBuf, sizeof(dateBuf),"%d-%m-%Y", &timeinfo);
dateStr = String(dateBuf);
dernierJour = timeinfo.tm_mday;
getSunriseSunset(latitude, longitude);
updateDisplay();
saveToHistory(dateStr, sunriseLocal, sunsetLocal);
}
void getSunriseSunset(float lat, float lon) {
HTTPClient http;
String url = "https://api.sunrise-sunset.org/json?lat=" + String(lat, 6) + "&lng=" + String(lon, 6) + "&formatted=0";
http.begin(url);
int httpCode = http.GET();
if (httpCode == 200) {
String payload = http.getString();
DynamicJsonDocument doc(2048);
DeserializationError error = deserializeJson(doc, payload);
if (!error) {
String sunriseUTC = doc["results"]["sunrise"];
String sunsetUTC = doc["results"]["sunset"];
sunriseLocal = convertToLocal(sunriseUTC);
sunsetLocal = convertToLocal(sunsetUTC);
}
}
http.end();
}
String convertToLocal(String iso8601) {
struct tm t;
int year, month, day, hour, minute, second;
sscanf(iso8601.c_str(), "%d-%d-%dT%d:%d:%d", &year, &month, &day, &hour, &minute, &second);
t.tm_year = year - 1900;
t.tm_mon = month - 1;
t.tm_mday = day;
t.tm_hour = hour;
t.tm_min = minute;
t.tm_sec = second;
t.tm_isdst = -1;
time_t utcTime = mktime(&t); // UTC
utcTime += gmtOffset_sec; // Décalage vers local
struct tm *local = localtime(&utcTime);
char buf[6];
sprintf(buf, "%02d:%02d", local->tm_hour, local->tm_min);
return String(buf);
}
void updateDisplay() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Eph. (heure locale)");
display.println("Date : " + dateStr);
display.println("Lever : " + sunriseLocal);
display.println("Coucher: " + sunsetLocal);
display.display();
Serial.println("Affichage mis a jour");
}
void saveToHistory(String date, String sunrise, String sunset) {
File file = SPIFFS.open("/histo.txt", FILE_APPEND);
if (!file) {
Serial.println("Erreur ouverture fichier histo.txt");
return;
}
String line = date + " | Lever : " + sunrise + " | Coucher : " + sunset + "\n";
file.print(line);
file.close();
Serial.println("Historique sauvegardé : " + line);
} |
Partager