Go Down

Topic: AQUABOUN'S /// GESTION D'AQUARIUM RECIFAL (Read 71211 times) previous topic - next topic

djbouns

Bonjour,

lorsque j'ai fait l'aquabouns, j'ai recopier une partie du code exemple de la bibliothèque RTClib et ajouter un message d'erreur si pas initialiser (non connecté par exemple)
Code: [Select]
if (! rtc.begin()) { // si l'horloge n'est pas initialisé
    texteProgmemAuNextion(texte2, texteNextion4, rouge); // champ, texte, couleur
  }
  else { // si horloge bien initialisé
    texteProgmemAuNextion(texte2, texteNextion5, vert); // champ, texte, couleur

Cela a toujours bien fonctionner jusque la.

Un utilisateur ma fait remarquer que chez lui brancher ou non, l'initialisation était toujours ok.
J'ai donc pris fait le test avec l'aquabouns et un Arduino "vide" et effectivement l'initialisation est ok
j'ai pris le code exemple, et même chose
Code: [Select]
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif

  Serial.begin(9600);

  delay(3000); // wait for console opening

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
    DateTime now = rtc.now();
   
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
   
    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
   
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));
   
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
   
    Serial.println();
    delay(3000);
}


y a un truc qui a changer ou j'ai faux depuis le debut ?


J-M-L

#1066
May 17, 2019, 11:34 pm Last Edit: May 18, 2019, 01:04 am by J-M-L
Oui si vous regardez le code de begin() il retourne toujours vrai....

Il y a une fonction isRunning()  sur la DS1307 mais pas sur DS3231 sans la librairie

Vous pourriez tester si lire le bit OSF (oscillator stopped flag) du Control/Status Register à l'adresse 0x0F et voir s'il est à 0 est suffisant comme test.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

J'avais vu pour isRunning()  mais pas dispo pour le DS3231
Quote
Vous pourriez tester si lire le bit OSF (oscillator stopped flag) du Control/Status Register à l'adresse 0x0F et voir s'il est à 0 est suffisant comme test.
Oula …
mais j'ai repèrerez lostPower
https://github.com/adafruit/RTClib/blob/5ddcf7c4d8aefa4286874426b158d7f3e0ec2b26/RTClib.cpp#L439
et si je fait
Code: [Select]
  if (rtc.lostPower()) {
    Serial.println("RTC  non connecté LOST POWER"); 
  }

quand le module n'est pas connecté il me retourne bien l'info mais peut être que dans certaine condition il peut retourner non connecté alors qu'il y est ?

J-M-L

#1068
May 18, 2019, 07:49 pm Last Edit: May 18, 2019, 07:52 pm by J-M-L
Cette fonction va lire le bit du registre en question :)

Regardez le code source de cette méthode vous verrez que lire un registre et un bit de ce registre n'est pas compliqué.

L'OSF est le bit 7 du registre à l'adresse 0x0F (Status Register - cf doc page 14) et ils disent à propos de ce bit
Quote
Bit 7: Oscillator Stop Flag (OSF).
A logic 1 in this bit indicates that the oscillator either is stopped or was stopped for some period and may be used to judge the validity of the timekeeping data. This bit is set to logic 1 any time that the oscillator stops. The following are examples of conditions that can cause the OSF bit to be set:
1) The first time power is applied.
2) The voltages present on both VCC and VBAT are insufficient to support oscillation.
3) The EOSC bit is turned off in battery-backed mode.
4) External influences on the crystal (i.e., noise, leak-
age, etc.).
This bit remains at logic 1 until written to logic 0.
Cependant les RTC qui n'ont pas de batterie ou dont la batterie est vide ou dont l'heure n'a jamais été initialisée vont dire par cet appel que la RTC a perdu l'alimentation et donc qu'il ne faut pas faire confiance à l'heure en mémoire au boot, même si le composant est présent.

Une solution propre est de scanner le bus I2C et voir s'il y a un device à l'adresse  attendue et ensuite voir s'il répond correctement à une requête
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

effectivement ca pourrait porter a confusion.

Pour le scan du bus I2C, l'adresse de l'horloge sera toujours la même pour tout le monde ?
Pour moi :
Code: [Select]
Scanning...
I2C device found at address 0x68  !
done


D'un autre coté, étant le seul périphérique I2C de l'aquabouns on peut se dire que si une adresse est trouvé c'est que l'horloge est la, non ?

J-M-L

Oui sur une ds3231 c'est l'adresse que vous trouverez et c'est celle qui est codée en dur dans la librairie
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

Yes, donc je scan et si je trouve 0x68 c'est OK sinon message d'erreur.
Et du coup si l'horloge et détecté, je peux pousser un peu plus loin avec isRunning()  pour afficher un message du genre "heure non réglé ou problème de batterie"

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

#1073
May 18, 2019, 09:43 pm Last Edit: May 18, 2019, 10:04 pm by djbouns
tindin :)
Code: [Select]
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  rtc.begin();
}
void loop() {
  byte error, stocadress = 0x68;
  bool horlogeDS3231 = false;
  for (byte address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      if (address == stocadress) {
        Serial.println("DS3231 connecté");
        horlogeDS3231 = true;
        if (rtc.lostPower()) {
          Serial.println("le DS3231 n'as jamais été mis a l'heure ou n'as plus de batterie");
        }
        else {
          Serial.println("DS3231 initialision OK");
        }
      }
    }
  }
  if (horlogeDS3231 == false) {
    Serial.println("DS3231 non connecté");
  }
  delay(5000);           // wait 5 seconds for next scan
}


soit sympa il m'en manque que deux




J-M-L

#1074
May 19, 2019, 11:20 am Last Edit: May 19, 2019, 11:20 am by J-M-L
Ah ces jeunes, toujours pressés...

ça arrive ça arrive, j'étais sur mon portable :)

Bravo :)



Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

J-M-L

Je ne donne qu'un seul bon point parce que:

le Serial qui communique à 9600 bauds, faut arrêter de montrer cela aux petits nouveaux... passons à 115200 les arduinos et ordinateurs supportent ça sans souci.

Vous définissez
Code: [Select]
stocadress = 0x68;. Non seulement ça devrait être un const byte mais comme je vous l'ai indiqué plus haut, c'est déjà défini par une define sous le nom de DS3231_ADDRESS dans le .h que vous importez.... donc pas la peine de le dupliquer, autant utiliser DS3231_ADDRESS ce qui permettra si on change la librairie de ne pas changer votre code.

Une fois trouvée l'horloge, pas la peine de continuer à scanner le bus - il manque un break pour sortir de la boucle for... Et en pratique, ça sert un peu à rien de tout scanner le bus, il suffit juste d'interroger si DS3231_ADDRESS répond puisque de toutes façons si la RTC était à une adresse différente votre code ne saurait pas la gérer puisque la librairie câble en dur DS3231_ADDRESS...

Bel effort cependant :)

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Breisleach

Bouns, JML bonjour,

Manque 1 tit bon point pour l'image.


J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

Manque 1 tit bon point pour l'image.
Non …
Je lui rend même celui que j'ai eu a tord ;)


le Serial qui communique à 9600 bauds, faut arrêter de montrer cela aux petits nouveaux... passons à 115200 les arduinos et ordinateurs supportent ça sans souci.
J'suis partie du code exemple. Et tout les exemple sont en Bauds 9600 :/
Faut contacter le bibliothécaire lol

Quote
Vous définissez
Code: [Select]
stocadress = 0x68;. Non seulement ça devrait être un const byte mais comme je vous l'ai indiqué plus haut, c'est déjà défini par une define sous le nom de DS3231_ADDRESS dans le .h que vous importez.... donc pas la peine de le dupliquer, autant utiliser DS3231_ADDRESS ce qui permettra si on change la librairie de ne pas changer votre code.
Quote
Une fois trouvée l'horloge, pas la peine de continuer à scanner le bus - il manque un break pour sortir de la boucle for... Et en pratique, ça sert un peu à rien de tout scanner le bus, il suffit juste d'interroger si DS3231_ADDRESS répond puisque de toutes façons si la RTC était à une adresse différente votre code ne saurait pas la gérer puisque la librairie câble en dur DS3231_ADDRESS...
j'aurais toujours 12 trains de retard pour se genre de reflex :)

je vais modifier tout cela ;)

J'récupèrerait mon point comme ca :)

J-M-L

Non non vous l'avez déjà car il y a de l'idée :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up