Bonjour à tous.
Je rencontre un petit problème lors de la lecture de ma EEPROM.
Pour faire court : j’ai enregistré des valeurs sur une eeprom à partir de l’adresse 0.
Ces valeurs sont des horaires d’ouverture et fermeture d’une porte , tout au long d’une année.
Ces valeurs dans l’ordre sont :
A l’adresse 0 : heure d’ouverture de la porte le 1er janvier.
A l’adresse 1 : minute d’ouverture de la porte le 1er janvier.
A l’adresse 2 : heure de fermeture le 1er janvier.
A l’adresse 3 : minute de fermeture du 1er janvier.
et l’adresse 4 c’est le 2 janvier, etc etc…
Mon code pour retrouver les adresses au jour j est donc :
adresse_de_lecture_heure_ouverture = (((now.month()-1) * 31 * 4) + (now.day() * 4) - 4); // (((mois-1) * 31 * 4) + (jour * 4)) - 4
adresse_de_lecture_minutes_ouverture = (((now.month()-1) * 31 * 4) + (now.day() * 4) - 3); // (((mois-1) * 31 * 4) + (jour * 4)) - 3
adresse_de_lecture_heure_fermeture = (((now.month()-1) * 31 * 4) + (now.day() * 4) - 2); // (((mois-1) * 31 * 4) + (jour * 4)) - 2
adresse_de_lecture_minutes_fermeture = (((now.month()-1) * 31 * 4) + (now.day() * 4) - 1); // (((mois-1) * 31 * 4) + (jour * 4)) - 1
J’utilise un DS3231 pour obtenir l’heure exacte. Mon now me viens de ce code :
DateTime now = RTC.now(); // Lecture de l'heure/date etc...
Il faut aussi savoir que j’allume la EEPROM et le DS3231 lorsque je les sollicites. Le reste du temps ils sont éteins.
Mon code complet pour la lecture de la EEPROM est donc le suivant :
digitalWrite (PIN_ALIM_TIMER, HIGH); // Alimentation carte gestion Temps on.
delay(20);
DateTime now = RTC.now(); // Lecture de l'heure/date etc...
digitalWrite (PIN_ALIM_TIMER, LOW); // Alimentation carte gestion Temps off.
adresse_de_lecture_heure_ouverture = (((now.month()-1) * 31 * 4) + (now.day() * 4) - 4); // (((mois-1) * 31 * 4) + (jour * 4)) - 4
adresse_de_lecture_minutes_ouverture = (((now.month()-1) * 31 * 4) + (now.day() * 4) - 3); // (((mois-1) * 31 * 4) + (jour * 4)) - 3
adresse_de_lecture_heure_fermeture = (((now.month()-1) * 31 * 4) + (now.day() * 4) - 2); // (((mois-1) * 31 * 4) + (jour * 4)) - 2
adresse_de_lecture_minutes_fermeture = (((now.month()-1) * 31 * 4) + (now.day() * 4) - 1); // (((mois-1) * 31 * 4) + (jour * 4)) - 1
if (!etatPorte.porte_ouverte)
{
Heures.heure_Ouverture = Lecture_Valeur(ADRESSE_EEPROM, adresse_de_lecture_heure_ouverture);
Heures.minutes_Ouverture = Lecture_Valeur(ADRESSE_EEPROM, adresse_de_lecture_minutes_ouverture);
temps_controle = ((Heures.heure_Ouverture * 3600) + (Heures.minutes_Ouverture * 60) * 1000) - ((now.hour() * 3600) + (now.minute() * 60) * 1000);
}
else
{
Heures.heure_Fermeture = Lecture_Valeur(ADRESSE_EEPROM, adresse_de_lecture_heure_fermeture);
Heures.minutes_Fermeture = Lecture_Valeur(ADRESSE_EEPROM, adresse_de_lecture_minutes_fermeture);
temps_controle = ((Heures.heure_Fermeture * 3600) + (Heures.minutes_Fermeture * 60) * 1000) - ((now.hour() * 3600) + (now.minute() * 60) * 1000);
}
.
Ma procédure Lecture_Valeur est la suivante :
byte Procedures::Lecture_Valeur(int deviceaddress, unsigned int eeaddress)
{
byte rdata = 0xFF;
digitalWrite (PIN_ALIM_EEPROM, HIGH); // Alimentation eeprom on.
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available())
rdata = Wire.read();
delay(20);
digitalWrite (PIN_ALIM_EEPROM, LOW); // Alimentation eeprom off.
return rdata;
}
Seulement ce code ne lit pas les valeurs ou alors de façons aléatoire.
Un moment il va me lire les minutes mais la valeur des heures est de 255 (NULL quoi) et la fois suivante il ne lira rien…
La ou je ne comprends pas c’est que ce code ci :
void setup()
{
Wifi.begin(); // Initialise le serveur wifi.
Wire.begin();
pinMode (PIN_ALIM_EEPROM, OUTPUT); // Definition de la broche de l'alimentation de l'EEPROM.
digitalWrite (PIN_ALIM_EEPROM, HIGH); // Alimentation eeprom on.
for(int i = 0 ; i < 1500 ; i++)
{
Wifi.print(i);
Wifi.print(" = ");
Wifi.println(Lecture_Valeur(ADRESSE_EEPROM, i));
}
digitalWrite (PIN_ALIM_EEPROM, LOW); // Alimentation eeprom off.
}
void loop()
{
}
byte Lecture_Valeur(int deviceaddress, unsigned int eeaddress)
{
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}
Fonctionne correctement…
Je sèche complet si quelqu’un à une idée merci par avance :).