Réglage RTC 3231

Bonjour,

Voila j’ai un aquarium d’eau de mer et un jour je me suis dis. Tien pourquoi pas le gérer via arduino ^^
J’ai donc acheté un peut de matériel après m’être informé.
J’ai reçu ma carte méga 2560 et mon RTC 3231. Le but pour moi est de gérer mon éclairage (on/off) via l’heur. Première étape j’ai voulu régler l’heur. J’ai donc fait quelque recherche et j’ai testé. Mais dans le moniteur serie j’ai pas la bonne date. J’ai:

RTC lost power, lets set the time!
2165/165/165 (Sunday) 165:165:85
since midnight 1/1/1970 = 2090164689s = 24191d
now + 7d + 30s: 2036/4/3 5:48:15

Voila, si vous pouvez m’aider :slight_smile:
Merci d’avance

// 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(2018, 10, 20, 12, 43, 0));
// 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);
}

en supposant que vous utilisez cette librairie RTClib

si vous compilez et chargez ce code, ça va régler l’heure de votre RTC à l’heure de la dernière compilation (donc à quelques secondes près la bonne heure - si votre PC/Mac est à l’heure bien sûr)

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

void setup () 
{
  Serial.begin(115200);
  if (! rtc.begin()) Serial.println(F("pas de RTC"));
  else rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop () {}

Une fois que c’est fait votre RTC devrait avoir une petite pile qui maintient l’heure donc plus besoin de la mettre à jour sauf aux changements d’heures

Oui j'ai pris sur rtclib et oui j'ai une pile sur mon rtc.

  1. j'ai chargé le code
  2. J'ai changer les valeurs pour mettre l'heure et la date
  3. J'ai connecté ma carte
  4. j'ai téléverser
  5. j'ai déconnecté et reconnecté ma carte
  6. Sur moniteur serie j'ai:

RTC lost power, lets set the time!
2165/165/165 (Sunday) 165:165:85
since midnight 1/1/1970 = 2090164689s = 24191d
now + 7d + 30s: 2036/4/3 5:48:15

Es qu'il manque quelque chose à mon code au dessus?
Je suis débutant j'aime bien les explications étape par étape ^^
Merci

Le ds3231 est un composant très simple à gérer, c'est sans doute la raison qui a poussé les auteurs de bibliothèques a faire des choses très compliquées, cela leur manquait avec un circuit aussi simple.
Il suffit tout simplement d'aller lire en I2C des registres 8 bits.

Sauf un auteur je veux parler de Bricoleau , membre actif de ce forum, et sa déjà longue série de tuto, voir ici : Les Tutos du Bricoleau

Et en ce qui concerne ta question il a écrit une bibliothèque très simple qui fait ce dont on a besoin sans choses inutiles voir ici : Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver

Le changement d'heure hiver/été va devenir inutile mais il n'y avait que le marc de café qui aurait pu le deviner.

Bonjour,

Ayant déjà utilisé ce composant, il m'est arrivé de devoir le réinitialiser en enlevant la pile pendant quelques instant suite à un comportement anormal (en particulier à la réception du produit).

merci 68tjs :wink:

Attention : à la différence des DS1307, la plupart des circuits tout faits à base de ds3231 ont besoin d'une pile rechargeable de type LIR2032, et non d'une simple pile CR2032.

Mêmes si parfois les vendeurs les fournissent avec une CR2032 (...)
Mettre une CR2032 sur un tel circuit amène à des soucis.

Mais là tu as peut-être un autre problème ailleurs. Vu tes symptômes je pronostique plutôt que tu as cablé SDA et SCL sur A4 et A5, ce qui est correct pour toute carte arduino SAUF une mega :slight_smile:

[édit : en vérifiant j'écrivais des bêtises que j'ai supprimées]

Non j'ai bien câblé sur la carte SDA SCL de la carte arduino.
GND sur GND et VCC sur 3.3V

Comme je les dit les tuto sont bien mais parfois non fait pour un débutant.
C'est mon premier jour d'apprentissage. Donc je regarde plein de video et de blog
Je veux y aller étape par étape. Et dans mon projet de gérer mon aquarium, savoir juste régler l'heur et la lire est une étape "simple". Enfin même si première gamelle ^^

J'ai continuer à étudier depuis mon premier message mais je comprend pas le code que j'ai utilisé est pas le bon? j'ai mal remplacé? il me manque des lignes de code?

Mon objectif final est de faire un on/off sur une rampe led par rapport à l'heur.

As-tu essayé au moins le code simple de JML dans le post #1?

J'ai pas osé je sais pas a quoi il sert du coup

Je me disais bien.

  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

DATE et TIME en langage C représentent la date et l’heure de la compilation.
rts.adjust met à l’heure le DS3231.

Tu charges ce code une fois et ton DS3231 sera à l’heure.

Tu peux y ajouter le code de l’exemple ds3231 pour voir s’afficher le résultat sur la console (115200 baud) :

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

void setup ()
{
  Serial.begin(115200);
  if (! rtc.begin()) Serial.println(F("pas de RTC"));
  else rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

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

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);
}

Ensuite tu recharges ton code à toi, et puis voili voilou.

@+

baloo53:
GND sur GND et VCC sur 3.3V

c'est une carte en 3.3 Volts ??

baloo53:
J'ai pas osé je sais pas a quoi il sert du coup

c'est un peu du foutage de gueule ça.... à quoi ça sert qu'on se décarcasse...

Désolé d'être prudent .... Comme je les dit c'est mon premier jour d'apprentissage et rien le fait de comprendre qu'il faut deux codage pour avoir le RTC je comprenais pas.
Si je t'explique comment mmmm je sais pas changer une boite de vitesse de voiture en deux ligne serait tu confiant à le faire seul?
Je sais que c'est compliqué pour vous mais aussi pour moi de comprendre ^^

Donc sinon, sur ma carte mega 2560 j'ai les deux 5v et 3.3V sur ma pile rtc c'est écrit 3V et après quelque recherche j'ai vu qu'il fallait mettre le VCC sur le 3.3V. Voila pourquoi :slight_smile:

J'effectue la démarche pour le codage et je vous tiens au courant
Merci beaucoup

Donc, j’ai essayé le code de JML aucun effet, j’ai plus de message sur le moniteur série.
hbachetti j’ai essayé ton code et remis le mien derrière et toujours le même message sur le moniteur série :confused:

Voici mon écran ^^

bricoleau:
merci 68tjs :wink:

Il n'y a pas de quoi, c'est simplement la vérité.
Je déteste le "pourquoi faire simple quand on peut faire compliqué".

Nous partageons le même avis sur les bibliothèques monstrueusement compliquées. Et dans le cas présent plus difficile à comprendre que d'exploiter la datasheet du composant.
Nous avons failli nous croiser, pour mes besoins j'avais écrit un fichier h et un fichier cpp pour gérer ce DS3132.
Je pensais les diffuser, il me restait à tout mettre au propre quand tu as publié ta bibliothèque bien carrée. Vu ma flemme tout est resté dans l'état quelque part dans mon disque dur.

Je pense avoir réussie. Maintenant j'ai sa

RTC lost power, lets set the time!
2165/165/165 (Sunday) 165:165:85
since midnight 1/1/1970 = 2090164689s = 24191d
now + 7d + 30s: 2018/10/20 10:08:15

Je sais pas pourquoi j'ai le reste mais c'est en bonne voie

Je crois que le μcontroleur est alimenté en 5V.

Les broches d'alimentation sont les suivantes :

VIN. La tension d'entrée positive lorsque la carte Arduino est utilisée avec une source de tension externe (à distinguer du 5V de la connexion USB ou autre source 5V régulée). Vous pouvez alimenter la carte à l'aide de cette broche, ou, si l'alimentation est fournie par le jack d'alimentation, accéder à la tension d'alimentation sur cette broche.
5V. La tension régulée utilisée pour faire fonctionner le microcontrôleur et les autres composants de la carte (pour info : les circuits électroniques numériques nécessitent une tension d'alimentation parfaitement stable dite "tension régulée" obtenue à l'aide d'un composant appelé un régulateur et qui est intégré à la carte Arduino). Le 5V régulé fourni par cette broche peut donc provenir soit de la tension d'alimentation VIN via le régulateur de la carte, ou bien de la connexion USB (qui fournit du 5V régulé) ou de tout autre source d'alimentation régulée.
3V3. Une alimentation de 3.3V fournie par le circuit intégré FTDI (circuit intégré faisant l'adaptation du signal entre le port USB de votre ordinateur et le port série de l'ATmega) de la carte est disponible : ceci est intéressant pour certains circuits externes nécessitant cette tension au lieu du 5V). L'intensité maximale disponible sur cette broche est de 50mA
GND. Broche de masse (ou 0V).

Entrées et sorties numériques

Chacune des 54 broches numériques de la carte Mega peut être utilisée soit comme une entrée numérique, soit comme une sortie numérique, en utilisant les instructions pinMode(), digitalWrite() et digitalRead() du langage Arduino. Ces broches fonctionnent en 5V. Chaque broche peut fournir ou recevoir un maximum de 40mA d'intensité et dispose d'une résistance interne de "rappel au plus" (pull-up) (déconnectée par défaut) de 20-50 KOhms. Cette résistance interne s'active sur une broche en entrée à l'aide de l'instruction digitalWrite(broche, HIGH).

Donc le RTC doit être alimenté en 5V. :smiley: