Auswahl von Board (D1 mini/NodeMCU) und RTC (DS3231/DS1307/keine) vor dem Kompilieren

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
lukarioandClaude Sonnet 5.5 committed 2026-10-19 19:07:09 +02:00
1 parent ca0e6afa8f
commit deb5f3e500
4 files changed
+152 -2

No files matched your search

+57
View File
@@ -5,6 +5,31 @@
#include <EEPROM.h>
#include <time.h>
#include <WiFiManager.h>
#include <Wire.h>
#include <sys/time.h>
// ================= RTC =================
// RTC-Modul waehlen (vor dem Kompilieren): RTC_MODUL_DS3231, RTC_MODUL_DS1307 oder RTC_MODUL_KEINE.
// PlatformIO: ueber die Umgebung (siehe platformio.ini). Arduino IDE: hier eintragen.
// Das Board (D1 mini / NodeMCU) waehlt man in der IDE bzw. ebenfalls ueber die Umgebung;
// die Pinnamen D1/D2/D4 sind bei beiden identisch.
#if !defined(RTC_MODUL_DS3231) && !defined(RTC_MODUL_DS1307) && !defined(RTC_MODUL_KEINE)
#define RTC_MODUL_DS3231
#endif
#if defined(RTC_MODUL_DS3231) || defined(RTC_MODUL_DS1307)
#include <RTClib.h>
#define RTC_VORHANDEN
#endif
#if defined(RTC_MODUL_DS3231)
RTC_DS3231 rtc;
#elif defined(RTC_MODUL_DS1307)
RTC_DS1307 rtc;
#endif
#define RTC_SDA D2
#define RTC_SCL D1
bool rtcOk = false;
volatile bool ntpJustSynced = false;
void onTimeSet(){ ntpJustSynced = true; }
// ================= LED =================
#define LED_PIN D4
@@ -105,6 +130,35 @@ void loadSettings(){
configTime(tzString.c_str(), ntpServer.c_str());
}
// Zeit aus der RTC uebernehmen (bis NTP erreichbar ist). Die RTC laeuft in UTC.
void initRtc(){
#ifdef RTC_VORHANDEN
Wire.begin(RTC_SDA, RTC_SCL);
if(!rtc.begin()) return;
rtcOk = true;
#if defined(RTC_MODUL_DS3231)
bool valid = !rtc.lostPower();
#else
bool valid = rtc.isrunning();
#endif
DateTime n = rtc.now();
if(valid && n.year() >= 2024){
struct timeval tv = { (time_t)n.unixtime(), 0 };
settimeofday(&tv, nullptr);
ntpJustSynced = false; // der eigene Aufruf ist keine NTP-Zeit
}
#endif
}
// Nach jeder NTP-Synchronisation die RTC nachstellen.
void updateRtcFromNtp(){
#ifdef RTC_VORHANDEN
if(!ntpJustSynced) return;
ntpJustSynced = false;
if(rtcOk && timeSynced()) rtc.adjust(DateTime((uint32_t)time(nullptr)));
#endif
}
// ================= HELFER =================
bool isNightTime(struct tm *t){
if(!autoNight) return false;
@@ -431,7 +485,9 @@ void setup(){
pixels.clear();
pixels.show();
settimeofday_cb(onTimeSet);
loadSettings();
initRtc();
WiFiManager wm;
wm.autoConnect("Wortuhr");
@@ -455,6 +511,7 @@ void setup(){
void loop(){
server.handleClient();
updateRtcFromNtp();
// Erst anzeigen, wenn die Zeit per NTP synchronisiert ist
if(!timeSynced()) return;
+34 -2
View File
@@ -1,8 +1,40 @@
[env:d1_mini]
; Umgebung = Board + RTC-Modul waehlen, z.B.: pio run -e nodemcu_ds3231 -t upload
; Board: d1_mini | nodemcu RTC: ds3231 | ds1307 | keine
[common]
platform = espressif8266
board = d1_mini
framework = arduino
monitor_speed = 115200
lib_deps =
adafruit/Adafruit NeoPixel
tzapu/WiFiManager
adafruit/RTClib
[board_d1_mini]
board = d1_mini
[board_nodemcu]
board = nodemcuv2
[env:d1_mini_ds3231]
extends = common, board_d1_mini
build_flags = -DRTC_MODUL_DS3231
[env:d1_mini_ds1307]
extends = common, board_d1_mini
build_flags = -DRTC_MODUL_DS1307
[env:d1_mini_keine]
extends = common, board_d1_mini
build_flags = -DRTC_MODUL_KEINE
[env:nodemcu_ds3231]
extends = common, board_nodemcu
build_flags = -DRTC_MODUL_DS3231
[env:nodemcu_ds1307]
extends = common, board_nodemcu
build_flags = -DRTC_MODUL_DS1307
[env:nodemcu_keine]
extends = common, board_nodemcu
build_flags = -DRTC_MODUL_KEINE
+57
View File
@@ -5,6 +5,31 @@
#include <EEPROM.h>
#include <time.h>
#include <WiFiManager.h>
#include <Wire.h>
#include <sys/time.h>
// ================= RTC =================
// RTC-Modul waehlen (vor dem Kompilieren): RTC_MODUL_DS3231, RTC_MODUL_DS1307 oder RTC_MODUL_KEINE.
// PlatformIO: ueber die Umgebung (siehe platformio.ini). Arduino IDE: hier eintragen.
// Das Board (D1 mini / NodeMCU) waehlt man in der IDE bzw. ebenfalls ueber die Umgebung;
// die Pinnamen D1/D2/D4 sind bei beiden identisch.
#if !defined(RTC_MODUL_DS3231) && !defined(RTC_MODUL_DS1307) && !defined(RTC_MODUL_KEINE)
#define RTC_MODUL_DS3231
#endif
#if defined(RTC_MODUL_DS3231) || defined(RTC_MODUL_DS1307)
#include <RTClib.h>
#define RTC_VORHANDEN
#endif
#if defined(RTC_MODUL_DS3231)
RTC_DS3231 rtc;
#elif defined(RTC_MODUL_DS1307)
RTC_DS1307 rtc;
#endif
#define RTC_SDA D2
#define RTC_SCL D1
bool rtcOk = false;
volatile bool ntpJustSynced = false;
void onTimeSet(){ ntpJustSynced = true; }
// ================= LED =================
#define LED_PIN D4
@@ -105,6 +130,35 @@ void loadSettings(){
configTime(tzString.c_str(), ntpServer.c_str());
}
// Zeit aus der RTC uebernehmen (bis NTP erreichbar ist). Die RTC laeuft in UTC.
void initRtc(){
#ifdef RTC_VORHANDEN
Wire.begin(RTC_SDA, RTC_SCL);
if(!rtc.begin()) return;
rtcOk = true;
#if defined(RTC_MODUL_DS3231)
bool valid = !rtc.lostPower();
#else
bool valid = rtc.isrunning();
#endif
DateTime n = rtc.now();
if(valid && n.year() >= 2024){
struct timeval tv = { (time_t)n.unixtime(), 0 };
settimeofday(&tv, nullptr);
ntpJustSynced = false; // der eigene Aufruf ist keine NTP-Zeit
}
#endif
}
// Nach jeder NTP-Synchronisation die RTC nachstellen.
void updateRtcFromNtp(){
#ifdef RTC_VORHANDEN
if(!ntpJustSynced) return;
ntpJustSynced = false;
if(rtcOk && timeSynced()) rtc.adjust(DateTime((uint32_t)time(nullptr)));
#endif
}
// ================= HELFER =================
bool isNightTime(struct tm *t){
if(!autoNight) return false;
@@ -431,7 +485,9 @@ void setup(){
pixels.clear();
pixels.show();
settimeofday_cb(onTimeSet);
loadSettings();
initRtc();
WiFiManager wm;
wm.autoConnect("Wortuhr");
@@ -455,6 +511,7 @@ void setup(){
void loop(){
server.handleClient();
updateRtcFromNtp();
// Erst anzeigen, wenn die Zeit per NTP synchronisiert ist
if(!timeSynced()) return;