Horloge Arduino DS3231 sur OLED i2c

Un autre projet d’horloge / réveil Arduino ds3231 avec un afficher OLED i2c 128×64 et un capteur de température DHT11 (qui peut être remplacé par un capteur de pression BMP180). Nous avons placé deux variantes à la fois – avec module d’horloge en temps réel RTC (l’heure ne peut être réglée que dans le logiciel lui-même) et sans module RTC (l’heure peut être réglée à tout moment). Les deux variantes sont dotées d’une fonction d’alarme.


Ce dont vous aurez besoin

  • Arduino Uno / Arduino Nano / Arduino Mega
  • afficher OLED i2c 128×64
  • capteur DHT11
  • module horloge DS1302 RTC
  • boutons-poussoirs et breadboard
  • fils de connexion
  • librairies OLED_I2C.h, DHT.h et iarduino_RTC.h

Matériel supplémentaire sur ce sujet:

  1. Réveil avec thermomètre sur TM1637 Arduino
  2. Thermomètre Arduino sur display TM1637
  3. Branchement afficheur OLED I2C avec Arduino

Horloge Arduino DS3231 sur OLED et DHT11

Le circuit électrique. Horloge OLED Arduino sans DS3231
Le circuit électrique. Horloge OLED Arduino sans DS3231
OLED i2c 0,96 Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VDD 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

L’image ci-dessus montre le schéma de construction du projet et le tableau montre les broches pour connecter OLED à la carte Arduino. La bibliothèque OLED_I2C.h est nécessaire pour l’affichage et DHT.h pour le capteur de température. Les archives avec les bibliothèques peuvent être téléchargées sur notre site web. Après avoir assemblé le circuit et installé les bibliothèques nécessaires, chargez le programme suivant dans le microcontrôleur Arduino.

Programme Arduino pour horloge sans module DS3231

#include "DHT.h"
DHT dht(2, DHT11);

#include "OLED_I2C.h"
OLED  myOLED(SDA, SCL, 8);

extern uint8_t SmallFont[];
extern uint8_t BigNumbers[];

byte SEC = 0;
byte MIN = 59;
byte HOUR = 7;
byte MIN_A = 0;
byte HOUR_A = 8;
unsigned long timer;

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button1IsUp;
boolean button2IsUp;

boolean alarm = true;
byte w, i;

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(5, OUTPUT);
  dht.begin();
  myOLED.begin();
  timer = millis();
}

void loop() {
   int h = dht.readHumidity();
   int t = dht.readTemperature();
  
  button1IsUp = digitalRead(9);
  button2IsUp = digitalRead(8);

  if (button1WasUp && !button1IsUp) {
    delay(10); button1IsUp = digitalRead(9);
    if (!button1IsUp) { SEC = 0; w = 1; } }
  button1WasUp = button1IsUp;
 
  if (button2WasUp && !button2IsUp) {
    delay(10); button2IsUp = digitalRead(8);
    if (!button2IsUp) { alarm = !alarm; } }
  button2WasUp = button2IsUp;

  if (millis() - timer > 1000) {
    timer = millis(); SEC++;
    if (SEC > 59) { SEC = 0; MIN++; }
    if (MIN > 59) { MIN = 0; HOUR++; }
    if (HOUR > 23) { HOUR = 0; }
    if (alarm == true && HOUR == HOUR_A && MIN == MIN_A && i < 60) {
      tone(5, 50); i++;
    }
    if (i >= 60) {
      noTone(5); alarm == false; i = 0;
    }

    myOLED.clrScr();
    myOLED.setFont(BigNumbers);
    
    if (HOUR < 10) { myOLED.print("0" + String(HOUR) + "-", 8, 20); }
    if (HOUR >= 10) { myOLED.print(String(HOUR) + "-", 8, 20); }
    if (MIN < 10) { myOLED.print("0" + String(MIN) + "-", 50, 20); }
    if (MIN >= 10) { myOLED.print(String(MIN) + "-", 50, 20); }
    if (SEC < 10) { myOLED.print("0" + String(SEC), 92, 20); }
    if (SEC >= 10) { myOLED.print(String(SEC), 92, 20); }
  
    myOLED.setFont(SmallFont);
    
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    
    myOLED.print(String(t) + "' / " + String(h) + "% ", RIGHT, 55);
    myOLED.update();
    noTone(5);
  }

  while (w == 1) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (HOUR > 23) { HOUR = 0; }
    if (HOUR < 10) { myOLED.print("0" + String(HOUR) + "-", 8, 20); }
    if (HOUR >= 10) { myOLED.print(String(HOUR) + "-", 8, 20); }
    if (MIN < 10) { myOLED.print("0" + String(MIN) + "-", 50, 20); }
    if (MIN >= 10) { myOLED.print(String(MIN) + "-", 50, 20); }
    myOLED.print("00", 92, 20);
    
    myOLED.setFont(SmallFont);
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("HOUR SETTING", CENTER, 55);
    myOLED.update();

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 2; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { HOUR++; } }
    button2WasUp = button2IsUp;
  }

  while (w == 2) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN > 59) { MIN = 0;}
    if (HOUR < 10) { myOLED.print("0" + String(HOUR) + "-", 8, 20); }
    if (HOUR >= 10) { myOLED.print(String(HOUR) + "-", 8, 20); }
    if (MIN < 10) { myOLED.print("0" + String(MIN) + "-", 50, 20); }
    if (MIN >= 10) { myOLED.print(String(MIN) + "-", 50, 20); }
    myOLED.print("00", 92, 20);

    myOLED.setFont(SmallFont);
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("MINUTE SETTING", CENTER, 55);
    myOLED.update();

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 3; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { MIN++; } }
    button2WasUp = button2IsUp;
  }

  while (w == 3) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { myOLED.print("0" + String(HOUR_A) + "-", 8, 20); }
    if (HOUR_A >= 10) { myOLED.print(String(HOUR_A) + "-", 8, 20); }
    if (MIN_A < 10) { myOLED.print("0" + String(MIN_A) + "-", 50, 20); }
    if (MIN_A >= 10) { myOLED.print(String(MIN_A) + "-", 50, 20); }
    myOLED.print("00", 92, 20);

    myOLED.setFont(SmallFont);
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("ALARM SET HOUR", CENTER, 55);
    myOLED.update();
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 4; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { HOUR_A++; } }
    button2WasUp = button2IsUp;
  }

  while (w == 4) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { myOLED.print("0" + String(HOUR_A) + "-", 8, 20); }
    if (HOUR_A >= 10) { myOLED.print(String(HOUR_A) + "-", 8, 20); }
    if (MIN_A < 10) { myOLED.print("0" + String(MIN_A) + "-", 50, 20); }
    if (MIN_A >= 10) { myOLED.print(String(MIN_A) + "-", 50, 20); }
    myOLED.print("00", 92, 20);
 
    myOLED.setFont(SmallFont); 
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("ALARM SET MINUTE", CENTER, 55);
    myOLED.update();
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 0; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { MIN_A++; } }
    button2WasUp = button2IsUp;
  }

}

Explication du code Arduino pour oled sans ds3231 (RTC):

  1. l’heure et le réveil peuvent être réglés dans le code du logiciel;
  2. l’heure et le réveil peuvent être modifiés au début du programme.
Horloge Arduino DS3231 sur OLED et DHT11
Le circuit électrique. Horloge Arduino DS3231 sur OLED et DHT11

La deuxième variante d’horloge utilise le capteur dht11 Arduino et le module d’horloge en temps réel RTC basé sur la puce DS1302/DS1307 en utilisant la bibliothèque iarduino_RTC.h. Le schéma de connexion du module et de l’afficheur OLED i2c 128×64 à l’Arduino est présenté dans l’image ci-dessus. Les réglages de la date et de l’heure dans le programme sont effectués avec la fonction watch.settime(); seul le réveil peut être réglé avec les boutons.

Programme Arduino pour horloge DS3231 Arduino Uno

#include "DHT.h"
DHT dht(2, DHT11);

#include "OLED_I2C.h"
OLED  myOLED(SDA, SCL, 8);

#include "Wire.h"
#include "iarduino_RTC.h"
iarduino_RTC watch(RTC_DS1302, 5, 6, 7); // RTC DS1302, RST, CLK, DAT
//  iarduino_RTC watch(RTC_DS1307);      // RTC DS1307 I2C
//  iarduino_RTC watch(RTC_DS3231);      // RTC DS3231 I2C

extern uint8_t SmallFont[];
extern uint8_t BigNumbers[];

byte MIN_A = 0;
byte HOUR_A = 8;
unsigned long timer;

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button1IsUp;
boolean button2IsUp;

boolean alarm = true;
byte w, i;

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  dht.begin();
  myOLED.begin();
  timer = millis();
  watch.begin();

  watch.settime(0, 59, 7, 16, 02, 22, 3);
}

void loop() {
   int h = dht.readHumidity();
   int t = dht.readTemperature();

  button1IsUp = digitalRead(9);
  button2IsUp = digitalRead(8);

  if (button1WasUp && !button1IsUp) {
    delay(10); button1IsUp = digitalRead(9);
    if (!button1IsUp) { w = 1; } }
  button1WasUp = button1IsUp;
  if (button2WasUp && !button2IsUp) {
    delay(10); button2IsUp = digitalRead(8);
    if (!button2IsUp) { alarm = !alarm; } }
  button2WasUp = button2IsUp;

  if (millis() - timer > 1000) {
    timer = millis();
    if (alarm==true && watch.Hours==HOUR_A && watch.minutes==MIN_A && i<60) {
      tone(3, 50); i++;
    }
    if (i >= 60) {
      noTone(3); alarm == false; i = 0;
    }

    myOLED.clrScr();
    
    myOLED.setFont(BigNumbers);
    myOLED.print(watch.gettime("H-i-s"), CENTER, 20);
  
    myOLED.setFont(SmallFont);
    if (alarm == true) {
      myOLED.print(String(t) + "' / " + String(h) + "% / on ", RIGHT, 3);
    }
    if (alarm == false) {
      myOLED.print(String(t) + "' / " + String(h) + "% / off", RIGHT, 3);
    }
    myOLED.print(watch.gettime("d.m.Y, D"), CENTER, 55);
    myOLED.update();
    noTone(3);
  }

   while (w == 1) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { myOLED.print("0" + String(HOUR_A) + "-", 8, 20); }
    if (HOUR_A >= 10) { myOLED.print(String(HOUR_A) + "-", 8, 20); }
    if (MIN_A < 10) { myOLED.print("0" + String(MIN_A) + "-", 50, 20); }
    if (MIN_A >= 10) { myOLED.print(String(MIN_A) + "-", 50, 20); }
    myOLED.print("00", 92, 20);

    myOLED.setFont(SmallFont);
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("ALARM SET HOUR", CENTER, 55);
    myOLED.update();
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 2; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { HOUR_A++; } }
    button2WasUp = button2IsUp;
  }

  while (w == 2) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { myOLED.print("0" + String(HOUR_A) + "-", 8, 20); }
    if (HOUR_A >= 10) { myOLED.print(String(HOUR_A) + "-", 8, 20); }
    if (MIN_A < 10) { myOLED.print("0" + String(MIN_A) + "-", 50, 20); }
    if (MIN_A >= 10) { myOLED.print(String(MIN_A) + "-", 50, 20); }
    myOLED.print("00", 92, 20);
 
    myOLED.setFont(SmallFont); 
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("ALARM SET MINUTE", CENTER, 55);
    myOLED.update();
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 0; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { MIN_A++; } }
    button2WasUp = button2IsUp;
  }

}

Explication du code Arduino pour oled horloge ds3231:

  1. après avoir flashé le module RTC et réglé correctement la date et l’heure, commentez ou supprimez la ligne watch.settime(); dans le programme et chargez le code dans l’Arduino;
  2. cette version du firmware ne permet pas de régler l’heure à l’aide des boutons poussoirs, seul le réveil peut être réglé.

Conclusion. Nous avons présenté deux versions de l’horloge à affichage OLED à la fois – avec et sans le module temps réel RTC. Vous trouverez également sur notre site Internet un exemple de programme avec un schéma de l’horloge sur LCD. Si vous utilisez la carte Arduino Mega, sur cette carte les ports SDA et SCL sont situés sur les broches 20 et 21. La carte Nano a le même brochage que la carte Uno et l’écran est connecté aux ports A4 (SDA) et A5 (SCL).





4 Replies to “Horloge Arduino DS3231 sur OLED 0.96 i2c”

  1. Bonjour
    Je suis intéressé par ce montage horloge, par contre sur l’image on ne distingue pas quelles broches câbler sur le module DS 1302.
    Serait-il possible d’avoir un supplément d’information ou le scénario complet théorique de ce montage.
    En vous remerciant
    Cordialement
    Eric

  2. Bonjour.
    Avec ce montage, est -il possible de régler plusieurs heures de réveil?
    Cordialement.

    1. Bonjour.
      Vous pouvez, mais vous devez ajouter des variables supplémentaires pour un autre intervalle. Par exemple:

      byte MIN_B = 0;
      byte HOUR_B = 9;

      Et ajoutez une condition au sketch pour allumer le réveil

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.