Go Down

Topic: Problème de lecture d'une valeur sur EEPROM 24LC512. (Read 283 times) previous topic - next topic

Vidou12

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 :

Code: [Select]
  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 :

Code: [Select]
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 :

Code: [Select]
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 :

Code: [Select]
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 :

Code: [Select]
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 :).

Jambe

Comment as tu défini tes heures d'ouvertures et de fermeture? Et à quoi ça va servir?

Selon l'application souhaitée, par exemple une porte de poulailler, l'heure de lever et de coucher de soleil se calcule facilement

Vidou12

en fait l'ouverture et la fermeture auto sont en secours donc je les mets plus tard.
Et même si c'était simple (la le système que j'ai fonctionne parfaitement sans ça), je veux savoir faire ça :) et comprendre pourquoi ça fonctionne pas !

Zlika

Bonjour,

Je pense qu'il serait préférable de faire une petite pause entre le moment ou vous alimentez l'eeprom et le moment où vous communiquez avec elle. Cela a été fait sur le RTC mais pas pour celle-ci...

fdufnews

Je pense que ce n'est pas une bonne idée de couper l'alimentation de l'EEPROM.
  • Tu ne gagnes rien en consommation. L'EEPROM quand elle est inactive consomme en typique 100nA (1µA max). C'est sans doute moins que le courant de fuite au travers des diodes de clamp sur les entrées SDA et SCL qui sont tirées à Vcc par les résistances sur le bus I²C
  • En tenant SDA et SCL tirées à Vcc et la ligne d'alimentation de l'EEPROM en l'air tu alimentes (mal) le composant qui peut se retrouver dans un état indéfini

Vidou12

J'y ai pensé et j'ai essayé de mettre une tempo plus lente entre le moment où j'alume L'eeprom et celui où je l'interroge (jusqu'à 2 secondes) mais le résultat était le même. J'en ai déduit que ça venait pas de ça. J'essayerais en la laissant allumée pour en avoir le cœur net.

Vidou12

Bon je viens de faire l'essais et c'est pareil. Rien n'a changé en laissant la EEPROM sur le 5 V. C'est bizarre

Zlika

juste dans le doute, peux-tu importer le code qui fonctionne dans ton programme Arduino en l'adaptant sans trop le modifier plutôt que d'utiliser celui de ta librairie. Sinon, tu pars du code qui fonctionne et tu ajoutes au fur et a mesure par étape en testant. tu finiras bien par trouver le moment ou cela ne réagit plus correctement.

Vidou12

Bon j'ai pu avancer mais ça devient galère la pour moi :s

en fait j'ai un shield adafruit pour un moteur pas à pas : https://www.adafruit.com/product/1438.

sur lequel j'ai ajouté 2 servomoteurs pour maintenir la porte une fois ouverte afin d'éviter de laisser le moteur alimenté.

Et c'est lors de l'initialisation de la liaison avec les servos que ça déconne : si je commente ces ligne :
"servo_gauche.attach(9); // Définit la pin "9", comme etant la sortie du signal pour le servomoteur de gauche : "servo_gauche".
  servo_droit.attach(10); // Définit la pin "10", comme etant la sortie du signal pour le servomoteur de droite : "servo_droit"." dans mon setup, ça fonctionne. Il est possible d'outre passer ce problème du coup ? :$

Merci pour l'aide apportée jusque ici :).
 

Vidou12

Fausse alerte sujet résolu :).

N'ayant plus trop de pin dispo en dessous de 10 j'ai branché l'EEPROM sur la broche 10... sans capter que j'y avais aussi le servomoteur droit...

Merci à tous pour votre aide :).

Go Up