Horloge numerique sur écran OLED 128*64 SSD1306
Voici une petite horloge qui affiche l'heure et la date sur un écran OLED 128*64. Il requiert juste une carte Arduino Uno et une horloge RTC sur bus I2C (DS3231 dans mon cas).
Utiliser cette librairie, elle a été réduite en taille car le sketch était trop gros pour une Uno.
Le sketch fait 21.014 byte, ce qui fait qu'il n'est malheureusement pas possible de le porter sur un Attiny 85 (8 pattes dont 5 utilisables et 8 Ko de mémoire).
La solution consisterait de reduire encore plus la taille de la librairie G8lib (des connaisseurs???), et de rajouter au maximum 3 boutons pour la programmation de la date et de l'heure en cas de changement d'heure ou de pile du RTC.
La modification de la date/l'heure n'est pas encore possible dans le sketch actuel, il faut d'abord programmer le RTC correctement.
Les : clignotent toutes les secondes.
Le rectangle en dessous de l'heure représente les secondes: 0-14,15-29,30-44,45-59.
Voici le sketch:
//Version du 24/12/2014 par Landrain Arnaud
// https://nono7380.blog4ever.com/
//La librairie U8glib.h complete est ici:
// https://code.google.com/p/u8glib/
//Pour ce sketch, utiliser la version réduite dispo ici:
// https://nono7380.blog4ever.com/horloge-numerique-sur-ecran-oled-12864-ssd1306
#include <Wire.h>
#define DS1307_ADDRESS 0x68
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
//*** Déclarations variables Heure & Date ***
boolean cligno; //Clignotement :
byte heures; //Heure réelles HH
byte minutes; //Minutes réelles MM
byte secondes; //Secondes SS
byte nomjour; //Nom du jour 0-6
byte jour; //Jour du mois JJ
byte mois; //Mois MM
int annee; //Annee AA
void setup() {
Wire.begin(); //pour DS3231 (RTC I2C)
}//fin setup
void loop() {
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
delay(1000);
lireRTC();
cligno = !cligno; //permet le clignotement des : à chaque seconde
}//fin loop
void draw() {
u8g.setFont(u8g_font_osr35r); //Set la police d'écriture
if(heures <= 9) { //1 chiffre
u8g.setPrintPos(0, 40);
u8g.print("0"); //rajoute un 0 pour faire 01
u8g.setPrintPos(25, 40);
u8g.print(heures);
} else { //2 chiffres
u8g.setPrintPos(0, 40);
u8g.print(heures);
}
if(minutes <= 9) { //1 chiffre
u8g.setPrintPos(73, 40);
u8g.print("0"); //rajoute un 0 pour faire 01
u8g.setPrintPos(100, 40);
u8g.print(minutes);
}else { //2 chiffres
u8g.setPrintPos(70, 40);
u8g.print(minutes);
}
//Fait clignoter les 2 :
if(cligno) {
u8g.setPrintPos(57, 40);
u8g.print(":");
} else {
u8g.setColorIndex(0); //Dessine en noir
u8g.setPrintPos(57, 40);
u8g.print(":");
u8g.setColorIndex(1); //Dessine en blanc
}
//Dessine le carré blanc des secondes sous chaque chiffre
if(secondes >= 0 && secondes <= 14) {
u8g.drawBox(5,45,19,5); //rectangle seconde
//on efface l'ancien
u8g.setColorIndex(0); //Dessine en noir
u8g.drawBox(106,45,19,5);
}
if(secondes >= 15 && secondes <= 29) {
u8g.drawBox(33,45,19,5); //rectangle seconde
//on efface l'ancien
u8g.setColorIndex(0); //Dessine en noir
u8g.drawBox(5,45,19,5);
}
if(secondes >= 30 && secondes <= 44) {
u8g.drawBox(74,45,19,5); //rectangle seconde
//on efface l'ancien
u8g.setColorIndex(0); //Dessine en noir
u8g.drawBox(33,45,19,5);
}
if(secondes >= 45 && secondes <= 59) {
u8g.drawBox(106,45,19,5); //rectangle seconde
//on efface l'ancien
u8g.setColorIndex(0); //Dessine en noir
u8g.drawBox(74,45,19,5);
}
u8g.setColorIndex(1); //Dessine en blanc
u8g.setFont(u8g_font_profont12r); //Set la police d'écriture
//Ecrit la date
u8g.setPrintPos(35, 62);
u8g.print(" / / ");
if(jour <= 9) {
u8g.setPrintPos(34, 63);
u8g.print("0");
u8g.setPrintPos(40, 63);
u8g.print(jour);
} else {
u8g.setPrintPos(34, 63); //Affiche le jour JJ
u8g.print(jour);
}
if(mois <= 9) {
u8g.setPrintPos(53, 63); //Affiche le mois MM
u8g.print("0");
u8g.setPrintPos(59, 63); //Affiche le mois MM
u8g.print(mois);
} else {
u8g.setPrintPos(53, 63); //Affiche le mois MM
u8g.print(mois);
}
u8g.setPrintPos(71, 63); //Affiche l'annee 20AA
u8g.print(2000 + annee);
}//fin void draw
byte bcdToDec(byte val) { //Converti BCD en decimal
return ( (val/16*10) + (val%16) );
}
void lireRTC(){ //Lit le RTC
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
secondes = bcdToDec(Wire.read());
minutes = bcdToDec(Wire.read());
heures = bcdToDec(Wire.read() & 0b111111); //format 24h
nomjour = bcdToDec(Wire.read()); //0-6 -> dimanche - samedi
jour = bcdToDec(Wire.read());
mois = bcdToDec(Wire.read());
annee = bcdToDec(Wire.read()); //seulement 2 chiffres
}
A découvrir aussi
Inscrivez-vous au blog
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 2 autres membres