Horloge RTC et Ecran OLED

Bonjour,
Je me casse les dents sur un programme relevé sur le site.
Il s'agit d'une structure qui utilise le module DS3231 et un afficheur OLED.

//Marios Ideas
//DS3231 Tutorial
//Using DS3232.h library
//Formating
//date and time with custom functions

#include <Wire.h>
#include <DS3231.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

int pause=1000;

DS3231  clock;
RTCDateTime dt;

#define SCREEN_WIDTH 128 // OLED display width,  in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels


#define OLED_RESET     -1// Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306
display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
Serial.begin(9600);

clock.begin();
// Set sketch compiling time
clock.setDateTime(__DATE__, __TIME__);
 
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V
internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D
for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
// Don't proceed, loop forever
}
display.display(); //display initial
Adafruit logo
delay(2000); 

// Clear the buffer
display.clearDisplay();
  
display.display();

}

String DayOfTheWeek(uint8_t Day){
String
DayText;
if (Day==1)  DayText="Monday";
if (Day==2)  DayText="Tuesday";

if (Day==3)  DayText="Wednesday";
if (Day==4)  DayText="Thursday";

if (Day==5)  DayText="Friday";
if (Day==6)  DayText="Saturday";
if (Day==7)  DayText="Sunday";
return DayText;
}



String DayMonthYear(uint8_t
Day,uint8_t Month,uint16_t Year)
{
String DayMonthYearText;
if (Month==1)
DayMonthYearText="JAN";
if (Month==2)  DayMonthYearText="FEB";

if (Month==3)  DayMonthYearText="MAR";
if (Month==4)  DayMonthYearText="APR";
if (Month==5)  DayMonthYearText="MAY";
if (Month==6)  DayMonthYearText="JUN";
if (Month==7)  DayMonthYearText="JUL";
if (Month==8)  DayMonthYearText="AUG";
if (Month==9)  DayMonthYearText="SEP";
if (Month==10)  DayMonthYearText="OCT";
if (Month==11)  DayMonthYearText="NOV";
if (Month==12)  DayMonthYearText="DEC";

DayMonthYearText=DayMonthYearText+Day;
if (Day=1)DayMonthYearText=DayMonthYearText+"st ";
if (Day==2)DayMonthYearText=DayMonthYearText+"nd ";
if (Day>2)DayMonthYearText=DayMonthYearText+"th ";

DayMonthYearText=DayMonthYearText+Year;
  
return DayMonthYearText;
}

String
AddLeadingZero(uint8_t x){
String AddLeadingZeroText;
if(x<10) AddLeadingZeroText="0";
  
else AddLeadingZeroText=""; 
AddLeadingZeroText=AddLeadingZeroText+x;

return AddLeadingZeroText;
}

String CurrentTime(uint8_t H, uint8_t I){
String CurrentTimeText="";
CurrentTimeText=CurrentTimeText + AddLeadingZero(H) +":"+AddLeadingZero(I);
return CurrentTimeText;
}

void loop() {

dt = clock.getDateTime();

display.fillRect(0,0,128,16,SSD1306_WHITE);

display.fillRect(0,17,128,16,SSD1306_BLACK);
display.fillRect(0,31,128,33,SSD1306_WHITE);


display.setCursor(1,1); 
display.setTextSize(2);
display.setTextColor(SSD1306_BLACK);
  
display.println(DayOfTheWeek(dt.dayOfWeek));

display.setCursor(1,18);
  
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE); 
display.println(DayMonthYear(dt.day,dt.month,dt.year));


display.setCursor(3,35); 
display.setTextSize(3);  
display.setTextColor(SSD1306_BLACK);
  
display.println(CurrentTime(dt.hour,dt.minute));

display.setCursor(100,35);
  
display.setTextSize(2);
display.setTextColor(SSD1306_BLACK); 
display.println(AddLeadingZero(dt.second));


clock.forceConversion();
display.setCursor(85,18); 
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
  
display.print(clock.readTemperature());
display.setCursor(117,16); 
display.print("o");



display.display();
delay(1000);
}i

Soit il ne reconnait pas la librairie DS3231.h (j'en ai essayé plusieurs), soit j'ai des pages d'erreurs
En tant que débutant j'ai du mal à tout comprendre.
Je compte sur votre aide,
Cordialement,
Alain

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Où, mets un lien?

Je ne sais pas comment tu as copié le code en question mais il y a des sauts de ligne qui rendent le code incohérent.

Copie les messages d'erreurs

le passage à la ligne ici par exemple

fait que le mot internally n'est plus dans le commentaire et le compilateur va essayer de comprendre ce que c'est (et comme il ne trouvera pas, ça ne va pas compiler)

Bonjour à tous,
Merci pour vos réponses, je viens de trouver le souci, il s'agissait de la librairie DS3231 qui n'était pas la bonne.
Il n'y avait aucune précision sur le site, j'ai recoupé avec une autre parution qui évoquait celle de Jarzebski, qui a donne enfin satisfaction.
Tous les décalages que vous avez constatés étaient aussi à l'origine, j'ai du tout recadrer pour que ça fonctionne. Je débute alors pas facile avec autant de messages d'erreur.
Un souci persiste, le module ne conserve pas les informations, après coupure de l'alimentation, il affiche tout OK sauf l'heure qui est fausse.
Auriez-vous une piste svp ?
Cordialement
Alain

Bonjour,

Cette ligne met la RTC à la date/heure de la compilation.
Il faut que tu lances ton programme une fois avec cette ligne puis tu mets cette ligne en commentaire et tu re téléverse ton programme.

Re bonjour,

Super ça fonctionne.
Bon week-end et encore merci
Cordialement
Alain

Bonjour,
Je viens à nouveau vous solliciter, sur la même structure.
Je découvre un autre souci, tous les modules DS3231 ne sont pas reconnus, peut-être du fait que celui-ci partage le même bus de communication en I2C.
Pour contrôle, je les ai testés sur un autre programme, I2C pour le DS3231 et afficheur LCD en câblage classique, dans ces conditions pas de problème.
Comment faire sur ce programme pour séparer la connectique des deux modules en I2C (DS3231 et l'afficheur Oled).
Dans l'attente de vous lire,
Cordialement,
Alain

Ils partagent le bus (SCL et SDA) mais il faut qu'ils aient une adresse I2C différentes - normalement c'est le cas donc vous ne devriez pas avoir de souci.

Bonjour,
Bien qu'ils aient des adresses différentes, ça ne fonctionne pas pour tous.
Je proposais cette solutions pour l'avoir vu sur d'autres structures sans m'y arrêter.
Cordialement,

Ça veut dire quoi?

Vous avez une carte avec 2 ports I2C ?

Salut,

Tu as essayé d'utiliser un scanner I2C ?
Ça pourrait te permettre de t'assurer que tes modules ne partagent pas la même adresse.

Bonjour,
La structure utilise une carte UNO, le port utilisé est composé de A4/A5.
En ce qui concerne le scanner, je ne suis pas encore assez expert pour l'utiliser, désolé.
Cordialement,
Alain

Aucune expertise nécessaire.
Il suffit de compiler le code et de le télécharger dans ta UNO.
Dans le moniteur série tu verras l'adresse des périphériques qui ont été détectés sur le bus I2C.

Re bonjour,

J'ai essayé le scanner qui me fournit 3 adresses distinctes sur ce projet, donc pas de conflit apparemment.
Je viens de faire l'essai avec un autre code, avec celui-ci les deux modules DS3231 fonctionnent correctement.
Il semblerait donc que c'est le code que je vous ai fourni qui pose souci.
Cordialement,
Alain

Donne le code que tu utilises, celui corrigé pas celui du début.
Et quel est ton souci exactement.

Bonsoir,
Voici le code demandé.
Mon souci est que sur deux DS3231, un seul est reconnu.
Celui qui ne l'est pas fonctionne avec un autre code, je voudrais comprendre.

//Marios Ideas
//DS3231 Tutorial
//Using DS3231.h library
//Formating
//date and time with custom functions

#include <Wire.h>
#include <DS3231.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


int pause=1000;

DS3231  clock;
RTCDateTime dt;

#define SCREEN_WIDTH 128 // OLED display width,  in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels


#define OLED_RESET     -1// Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306
display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
Serial.begin(9600);

clock.begin();
// Set sketch compiling time
clock.setDateTime(__DATE__, __TIME__);
 
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
// Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
// Don't proceed, loop forever
}
display.display(); //display initial Adafruit logo
delay(3000); 
// Clear the buffer
display.clearDisplay();
display.display();
}
String DayOfTheWeek(uint8_t Day){
String
DayText;
if (Day==1)  DayText="Lundi";
if (Day==2)  DayText="Mardi";
if (Day==3)  DayText="Mercredi";
if (Day==4)  DayText="Jeudi";
if (Day==5)  DayText="Vendredi";
if (Day==6)  DayText="Samedi";
if (Day==7)  DayText="Dimanche";
return DayText;
}
String DayMonthYear(uint8_t
Day,uint8_t Month,uint16_t Year)
{
String DayMonthYearText;
if (Month==1) DayMonthYearText="JAN ";
if (Month==2)  DayMonthYearText="FEV ";
if (Month==3)  DayMonthYearText="MAR ";
if (Month==4)  DayMonthYearText="AVR ";
if (Month==5)  DayMonthYearText="MAI ";
if (Month==6)  DayMonthYearText="JUN ";
if (Month==7)  DayMonthYearText="JUL ";
if (Month==8)  DayMonthYearText="AUT ";
if (Month==9)  DayMonthYearText="SEP ";
if (Month==10)  DayMonthYearText="OCT ";
if (Month==11)  DayMonthYearText="NOV ";
if (Month==12)  DayMonthYearText="DEC ";

DayMonthYearText=DayMonthYearText+Day;
if (Day==1)DayMonthYearText=DayMonthYearText+"st  ";
if (Day==2)DayMonthYearText=DayMonthYearText+"nd ";
if (Day>2)DayMonthYearText=DayMonthYearText+"th  ";
DayMonthYearText=DayMonthYearText+Year;
  
return DayMonthYearText;
}

String
AddLeadingZero(uint8_t x){
String AddLeadingZeroText;
if(x<10) AddLeadingZeroText="0";
  
else AddLeadingZeroText=""; 
AddLeadingZeroText=AddLeadingZeroText+x;

return AddLeadingZeroText;
}

String CurrentTime(uint8_t H, uint8_t I){
String CurrentTimeText="";
CurrentTimeText=CurrentTimeText + AddLeadingZero(H) +":"+AddLeadingZero(I);
return CurrentTimeText;
}

void loop() {

dt = clock.getDateTime();

display.fillRect(0,0,128,16,SSD1306_WHITE);
display.fillRect(0,17,128,16,SSD1306_BLACK);
display.fillRect(0,31,128,33,SSD1306_WHITE);
display.setCursor(1,1); 
display.setTextSize(2);
display.setTextColor(SSD1306_BLACK);
display.println(DayOfTheWeek(dt.dayOfWeek));
display.setCursor(1,18);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE); 
display.println(DayMonthYear(dt.day,dt.month,dt.year));
display.setCursor(3,35); 
display.setTextSize(3);  
display.setTextColor(SSD1306_BLACK);
display.println(CurrentTime(dt.hour,dt.minute));
display.setCursor(100,35);
display.setTextSize(2);
display.setTextColor(SSD1306_BLACK); 
display.println(AddLeadingZero(dt.second));
clock.forceConversion();
display.setCursor(85,18); 
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.print(clock.readTemperature());
display.setCursor(117,16); 
display.print("o");
display.display();
delay(1000);
}

3 adresses alors qu'il n'y a que 2 périphériques (le DS3231 et l'écran)?

Quelles adresses trouves-tu?


Ton code est illisible, il faut l'indenter. Tu peux faire CTRL+T dans l'iDE qui présentera le code correctement.

Bonjour,
Les trois adresses trouvées par le scanner sont 0x3C 0x57 0x68.
Voici le code indenté.

//Marios Ideas
//DS3231 Tutorial
//Using DS3231.h library
//Formating
//date and time with custom functions

#include <Wire.h>
#include <DS3231.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


int pause = 1000;

DS3231 clock;
RTCDateTime dt;

#define SCREEN_WIDTH 128  // OLED display width,  in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels


#define OLED_RESET -1  // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306
  display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);

  clock.begin();
  // Set sketch compiling time
  //clock.setDateTime(__DATE__, __TIME__);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ;
    // Don't proceed, loop forever
  }
  display.display();  //display initial Adafruit logo
  delay(3000);
  // Clear the buffer
  display.clearDisplay();
  display.display();
}
String DayOfTheWeek(uint8_t Day) {
  String
    DayText;
  if (Day == 1) DayText = "Lundi";
  if (Day == 2) DayText = "Mardi";
  if (Day == 3) DayText = "Mercredi";
  if (Day == 4) DayText = "Jeudi";
  if (Day == 5) DayText = "Vendredi";
  if (Day == 6) DayText = "Samedi";
  if (Day == 7) DayText = "Dimanche";
  return DayText;
}
String DayMonthYear(uint8_t
                      Day,
                    uint8_t Month, uint16_t Year) {
  String DayMonthYearText;
  if (Month == 1) DayMonthYearText = "JAN ";
  if (Month == 2) DayMonthYearText = "FEV ";
  if (Month == 3) DayMonthYearText = "MAR ";
  if (Month == 4) DayMonthYearText = "AVR ";
  if (Month == 5) DayMonthYearText = "MAI ";
  if (Month == 6) DayMonthYearText = "JUN ";
  if (Month == 7) DayMonthYearText = "JUL ";
  if (Month == 8) DayMonthYearText = "AUT ";
  if (Month == 9) DayMonthYearText = "SEP ";
  if (Month == 10) DayMonthYearText = "OCT ";
  if (Month == 11) DayMonthYearText = "NOV ";
  if (Month == 12) DayMonthYearText = "DEC ";

  DayMonthYearText = DayMonthYearText + Day;
  if (Day == 1) DayMonthYearText = DayMonthYearText + "st ";
  if (Day == 2) DayMonthYearText = DayMonthYearText + "nd ";
  if (Day > 2) DayMonthYearText = DayMonthYearText + "th ";
  DayMonthYearText = DayMonthYearText + Year;

  return DayMonthYearText;
}

String
AddLeadingZero(uint8_t x) {
  String AddLeadingZeroText;
  if (x < 10) AddLeadingZeroText = "0";

  else AddLeadingZeroText = "";
  AddLeadingZeroText = AddLeadingZeroText + x;

  return AddLeadingZeroText;
}

String CurrentTime(uint8_t H, uint8_t I) {
  String CurrentTimeText = "";
  CurrentTimeText = CurrentTimeText + AddLeadingZero(H) + ":" + AddLeadingZero(I);
  return CurrentTimeText;
}

void loop() {

  dt = clock.getDateTime();

  display.fillRect(0, 0, 128, 16, SSD1306_WHITE);
  display.fillRect(0, 17, 128, 16, SSD1306_BLACK);
  display.fillRect(0, 31, 128, 33, SSD1306_WHITE);
  display.setCursor(1, 1);
  display.setTextSize(2);
  display.setTextColor(SSD1306_BLACK);
  display.println(DayOfTheWeek(dt.dayOfWeek));
  display.setCursor(1, 18);
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.println(DayMonthYear(dt.day, dt.month, dt.year));
  display.setCursor(3, 35);
  display.setTextSize(3);
  display.setTextColor(SSD1306_BLACK);
  display.println(CurrentTime(dt.hour, dt.minute));
  display.setCursor(100, 35);
  display.setTextSize(2);
  display.setTextColor(SSD1306_BLACK);
  display.println(AddLeadingZero(dt.second));
  clock.forceConversion();
  display.setCursor(85, 18);
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.print(clock.readTemperature());
  display.setCursor(117, 16);
  display.print("o");
  display.display();
  delay(1000);
}

Cordialement,
Alain

  • 0x3C ==> Ecran OLED
  • 0x57 ==> ????
  • 0x68 ==> DS3231

Il y a un intrus sur le bus?