Mes bricolages électroniques

Mes bricolages électroniques

Horloge numerique sur écran OLED 128*64 SSD1306

WP_20141224_002.jpg

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
}



24/12/2014
0 Poster un commentaire

A découvrir aussi


Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 2 autres membres