Bonjour, j'ai pu avancer sur le code mais j'ai quand même quelques questions.
#include <FastLED.h>
#include "RTClib.h"
RTC_DS1307 rtc;
#define NUM_LEDS 1
#define DATA_PIN 15
#define CLOCK_PIN 13
int Duree_abonnement = 90;
bool Etat_Abonnement = true;
bool Date_Fin_Definie = false;
bool Date_Fin_Proche_Definie = false;
int Jours_avant_fin = 10;
DateTime Debut;
DateTime Fin;
DateTime Proche_Fin;
CRGB leds[NUM_LEDS];
void setup() {
Serial.begin(9600);
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
}
void loop() {
// calculate a date which is 7 days, 12 hours, 30 minutes, and 6 seconds into the future
DateTime now = rtc.now();
Calcul_Date_Fin();
Calcul_Date_Fin_Proche();
/*if(Date_Fin_Definie == false && Etat_Abonnement == true){
Fin = (now + TimeSpan(0,0,0,60));
Date_Fin_Definie = true;
}*/
/*while(Etat_Abonnement == false ){
leds[0] = CRGB::Yellow;
FastLED.show();
delay(500);
leds[0] = CRGB::Black;
FastLED.show();
delay(500);
}*/
/*if(Etat_Abonnement == true){
Serial.println("Abonnement actif");
}
if(Duree_abonnement != 0 && Etat_Abonnement == true && now < Fin && now < Proche_Fin){
leds[0] = CRGB::Green;
FastLED.show();
Serial.println("Abonnement en cours");
}
if(now > Proche_Fin && now < Fin){
Serial.println("Proche de la fin");
leds[0] = CRGB::Orange;
FastLED.show();
delay(650);
leds[0] = CRGB::Black;
FastLED.show();
delay(650);
}
if(now > Fin){
Serial.println("Abonnement dépassé");
leds[0] = CRGB::Red;
FastLED.show();
}
*/
Serial.print("Date actuelle: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.println();
Serial.print("Date de Fin Proche: ");
Serial.print(Proche_Fin.year(), DEC);
Serial.print('/');
Serial.print(Proche_Fin.month(), DEC);
Serial.print('/');
Serial.print(Proche_Fin.day(), DEC);
Serial.print(' ');
Serial.print(Proche_Fin.hour(), DEC);
Serial.print(':');
Serial.print(Proche_Fin.minute(), DEC);
Serial.print(':');
Serial.print(Proche_Fin.second(), DEC);
Serial.println();
Serial.println();
Serial.println();
delay(1000);
}
void Calcul_Date_Fin(){
DateTime now = rtc.now();
if(Date_Fin_Definie == false && Etat_Abonnement == true){
Fin = (now + TimeSpan(0,0,0,60));
Date_Fin_Definie = true;
saveDateTimeToNVRAM(Fin);
saveBoolToNVRAM(Date_Fin_Definie);
}
}
void Calcul_Date_Fin_Proche(){
if(Date_Fin_Proche_Definie == false && Etat_Abonnement == true){
Proche_Fin = (Fin - TimeSpan(0,0,0,50));
Date_Fin_Proche_Definie = true;
saveDateTimeToNVRAM(Proche_Fin);
saveBoolToNVRAM(Calcul_Date_Fin_Proche);
}
}
void saveDateTimeToNVRAM(DateTime dt) {
// Convertir l'objet DateTime en un tableau d'octets
uint8_t data[sizeof(DateTime)];
uint8_t* ptr = (uint8_t*)&dt; // Obtenez un pointeur vers l'objet DateTime
memcpy(data, ptr, sizeof(DateTime)); // Copiez les données de l'objet DateTime dans le tableau d'octets
// Écrire les données dans la NVRAM du DS1307
rtc.writenvram(0, data, sizeof(data));
}
void saveBoolToNVRAM(bool value) {
// Convertir la variable booléenne en un tableau d'octets
uint8_t data[sizeof(bool)];
memcpy(data, &value, sizeof(bool)); // Copier la valeur de la variable booléenne dans le tableau d'octets
// Écrire les données dans la NVRAM du DS1307
rtc.writenvram(sizeof(DateTime), data, sizeof(data)); // Utiliser une adresse différente pour éviter les conflits avec les autres données
}
Pour l'instant j'ai juste à réussi à ajouter deux fonctions pour écrire les données dans la Ram de l'horloge, sauf que j'ai pas mal utilisé Chat GPT en essayant quand même de faire attention, et aussi car je ne trouve pas trop de vidéo/tuto sur le sujet. Donc déjà est ce que la manière dont fonctionnent les fonctions : " saveBoolToNVRAM" et "saveDateTimeToNVRAM" vous semble bonne ? Car j'avoue que je n'ai pas encore tout compris de ce qui est utilisé.
Maintenant, j'ai aussi essayer avec Chat GPT de créer une fonction qui vérifierai si il y a des données présentent dans la RAM et qui renverrai une valeur booléenne en fonction, voilà le résultat:
bool Verification_NVRam() {
const int NVRAM_SIZE = 64; // Taille de la mémoire NVRAM du DS1307
uint8_t data[NVRAM_SIZE]; // Tableau pour stocker les octets lus depuis la NVRAM
// Lire les octets depuis la NVRAM
rtc.readnvram(0, &data[0], NVRAM_SIZE); // Passer un pointeur vers le premier élément du tableau
// Vérifier si les octets contiennent des données significatives
for (int i = 0; i < NVRAM_SIZE; i++) {
if (data[i] != 0) {
return true; // Données significatives trouvées
}
}
return false; // Aucune donnée significative trouvée
}
Déjà cela vous semble correct ?
Car j'ai l'impression que ça l'est mais j'ai quand même une petite erreur à la compilation: invalid conversion from 'uint8_t*' {aka 'unsigned char*'} to 'uint8_t' {aka 'unsigned char'} [-fpermissive]
Pour laquelle je ne trouve pas de solutions et d'ailleurs, Chat GPT n'en trouve pas non plus... Donc je ne sais pas si ça vaut le coup de garder ça.
Puis ensuite je vais avoir besoin de lire les infos dans la RAM pour pouvoir logiquement les utiliser dans le code, je n'ai pas encore fait cette partie mais après quelques tests pour voir ce que ça donnait, j'ai fait quelques bout de code, bien sûr avec l'aide de Chat GPT, mais j'ai des erreurs similaires à celle d'avant donc j'ai l'impression que le problème revient assez souvent.
Voilà tout, j'espère ne pas vous avoir perdu, et je suis ouvert toute aide ou proposition.