[Conseil] Montre = Arduino Pro Micro + RTC + Oled + Lipo => Connections/Code ?

Bonsoir à tous.

J'essaie de répliquer une montre à base d'Arduino mais je suis confronté à plusieurs problèmes :

  1. Je ne sais pas programmer ( Le but au départ était de copier un sketch fonctionnel )
  2. Je ne trouve pas de sketch qui comprenne les éléments que j'ai en ma possession.

Voici les composants que je possède :

  1. Arduino Nano 3.3v
  2. RTC tiny I2C à base de DS1307z de chez Banggood I2C RTC DS1307 AT24C32 Real Time Clock Module For AVR ARM PIC SMD Sale - Banggood USA sold out-arrival notice-arrival notice
  3. Une lipo 3.7v avec son chargeur
  4. Ecran Oled 0.96" I2C SSD1306 de chez Banggood http://www.banggood.com/0_96-Inch-I2C-IIC-SPI-Serial-128-X-64-OLED-LCD-LED-Display-Module-p-922246.html
  5. Résistances, boutons poussoirs, cables, etc..

Soit je trouve un sketch qui donne l'heure sur un écran Led ou un TFT ( Pas sur un Oled )
Soit je trouve un affichage sur Oled mais avec 7 fils au lieu des 4 qui compose mon écran.
Ou alors un affichage Oled mais capture de l'heure via DCF77 ou GPS ...

J'ai tenté de mixer les différents codes que j'ai pu trouver à gauche et à droite mais au final ca ne fonctionne pas :frowning:
De plus je me heurte à un autre soucis au niveau de la connection des différents éléments : Le protocole I2C peut gérer plusieurs appareils mais il est question quelque part d'adresse a définir sous forme de 0x69 ou autre .
Je dois donc connecter le SDA SCL GND et VCC de l'arduino au RTC qui lui même est connecté de la même manière à l'Oled. Enfin c'est ce que je déduis de cette théorie.

Est ce qu'il y a une âme charitable pour m'aider sur ce coup la ?

Je cherche à avoir l'affichage de l'heure sous format 24 (HH:MM:SS) avec la date (Si possible)
1 seul bouton pour Turn On/off de l'écran par soucis d'économie d'énergie.

Si quelqu'un se sent l'âme de m'aider (Connection et code) ce serait très sympa.

D'avance merci,

Vivian

Salut
tout d'abord , meme si c'est pas forcement evident commence a regarder pour apprendre le language arduino avec des chose simple , car il y a beaucoup d'ame charitable prétes a t'aider ici mais c'est bien mieux si tu plonge un peut les main dans le cambouis!

Apres poste au moins un bout de code que tu posséde et on travaillera par etape pour t'aider!

pour ton materiel je ne suis pas sur que le module rtc puise fonctioné avec ton arduino pro 3.3V car ce module fonctione en 5V !
Pour la conection apres la RTC ce position simplement sur les broche SDA et SLC qui sont les pin A4 (SDA) et A5 (SCL).

pour l'ecrant tanque sont adresse i2c et diferente de celle de la RTC y'a pas de probléme .
pour l'affichage ce module semble fonctioné avec un SSD1306 , tu as de la chance il existe deja une librairie chez adafruit :
GitHub - adafruit/Adafruit_SSD1306: Arduino library for SSD1306 monochrome 128x64 and 128x32 OLEDs pour pouvoir l'utilisé

Salut,

+1

Des tutos sur les DS1307 y'en a des centaines sur le net, de même que pour les SSD1306 ... Essaye de comprendre ces deux parties séparément avant de vouloir tout assembler d'un coup :wink:

Parce que tu trouveras personne ici pour te faire un code tout cuit où du coup tu n'y comprendras rien !

Merci pour vos réponses.

Je n'avais pas regardé pour le RTC mais en effet ca doit prendre du 5v et pas du 3.3
Le DS1307z prend de 4.5 à 5v tandis que l'Atmel 24C32 du pcb accepte de 2.7 à 5v ( enfin d'après la datasheet : http://datasheets.maximintegrated.com/en/ds/DS1307.pdf et http://www.atmel.com/images/doc0336.pdf

Cela règle l'idée d'aller chercher l'heure en temps réel de manière "simple"

Sinon avant cela j'avais réalisé ce montage avec un HC-05 qui fonctionnait pas mal http://www.instructables.com/id/Make-your-own-smart-watch/
Mais le fait de devoir à chaque fois synchroniser la montre avec un smartphone et une app dédiée me rebutait un peu.

Oui l'Oled utilise la librairie SSD1306 qui est largement utilisée et connue.

Certains on utilisé la commande Milis (sans RTC) mais le décalage est assez important.

Donc je retourne au point de départ et vous demande dans un premier temps quels sont les possibilités de réaliser une montre ?
Passez sur un Arduino 5v ? Oui mais les batteries sont pratiquement toutes en 3.7v, ce qui tombe bien je trouve :wink:

Ou alors une montre sans RTC avec 2 ou 3 boutons et devoir régler l'heure à chaque fois que la batterie est retirée pour x raisons.

J'ai aussi vu un projet qui, je trouve personnellement, est extraordinaire : DIY Digital Wristwatch | Zak’s Electronics Blog ~*
Mais il a créer son propre PCB :frowning:

Je me demande si je ne vais pas partir la dessus au final. Les tutos pour créer ses propres PCB ne manquent pas sur la toile et ne sont pas trop difficiles à réaliser. Quant à la soudure des composants bin on verra bien à ce moment la.

Je sais qu'il va falloir investir dans un programmateur car l'Atmega est livré vierge ( Ou alors utiliser la Mega de mon imprimante 3D pour la prog. )

Vos avis m'intéressent

Vivian

Il faut chercher les RTC à base de DS3234. Ce circuit fonctionne de 2V à 5.5V. En plus le DS3234 est plus stable que le DS1307.

fdufnews:
Il faut chercher les RTC à base de DS3234. Ce circuit fonctionne de 2V à 5.5V. En plus le DS3234 est plus stable que le DS1307.

Apparemment un "bricolage" est possible pour l'adapter au 3.3v

Je reviens vers vous avec ce que j'ai déjà fait.

Image du montage en bas de post

J'ai 2 scripts. 1 permet d'obtenir l'heure sur le moniteur série et l'autre permet d'afficher ce que l'on veut ( sauf l'heure biensur ) sur l'Oled.

  1. affichage sur Oled
/*

  U8gLogo.pde
  
  Put the U8GLIB logo on the display.
  
  >>> Before compiling: Please remove comment from the constructor of the 
  >>> connected graphics display (see below).
  
  Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
  
  Copyright (c) 2012, olikraus@gmail.com
  All rights reserved.



  
*/


#include "U8glib.h"

// setup u8g object, please remove comment from one of the following constructor calls
// IMPORTANT NOTE: The following list is incomplete. The complete list of supported 
// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device

//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM132 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM128 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM128_2X u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10);	// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
//U8GLIB_ST7920_192X32_4X u8g(10);		// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_LM6059 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_LM6063 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_BW u8g(10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); 		// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 );  			// 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI 
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send ACK
//U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1351_128X128GH_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED)

//#define MINI_LOGO

void drawColorBox(void)
{
  u8g_uint_t w,h;
  u8g_uint_t r, g, b;
  
  w = u8g.getWidth()/32;
  h = u8g.getHeight()/8;
  for( b = 0; b < 4; b++ )
    for( g = 0; g < 8; g++ )
      for( r = 0; r < 8; r++ )
      {
        u8g.setColorIndex((r<<5) |  (g<<2) | b );
        u8g.drawBox(g*w + b*w*8, r*h, w, h);
      }
}

void drawLogo(uint8_t d)
{
#ifdef MINI_LOGO
    u8g.setFont(u8g_font_gdr17r);
    u8g.drawStr(0+d, 22+d, "U");
    u8g.setFont(u8g_font_gdr20n);
    u8g.drawStr90(17+d,8+d,"8");
    u8g.setFont(u8g_font_gdr17r);
    u8g.drawStr(39+d,22+d,"g");
    
    u8g.drawHLine(2+d, 25+d, 34);
    u8g.drawVLine(32+d, 22+d, 12);
#else
    u8g.setFont(u8g_font_gdr25r);
    u8g.drawStr(0+d, 30+d, "U");
    u8g.setFont(u8g_font_gdr30n);
    u8g.drawStr90(23+d,10+d,"8");
    u8g.setFont(u8g_font_gdr25r);
    u8g.drawStr(53+d,30+d,"g");
    
    u8g.drawHLine(2+d, 35+d, 47);
    u8g.drawVLine(45+d, 32+d, 12);
#endif
}

void drawURL(void)
{
#ifndef MINI_LOGO
  u8g.setFont(u8g_font_4x6);
  if ( u8g.getHeight() < 59 )
  {
    u8g.drawStr(53,9,"code.google.com");
    u8g.drawStr(77,18,"/p/u8glib");
  }
  else
  {
    u8g.drawStr(1,54,"code.google.com/p/u8glib");
  }
#endif
}


void draw(void) {
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    drawColorBox();
  }
  u8g.setColorIndex(1);
  if ( U8G_MODE_GET_BITS_PER_PIXEL(u8g.getMode()) > 1 ) {
    drawLogo(2);
    u8g.setColorIndex(2);
    drawLogo(1);
    u8g.setColorIndex(3);
  }
  drawLogo(0);
  drawURL();
  
}

void setup(void) {
  // flip screen, if required
  //u8g.setRot180();
}

void loop(void) {
  
  // picture loop
  u8g.firstPage();  
  do {
    draw();
  u8g.setColorIndex(1);
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(200);  
}
  1. Heure sur moniteur série
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

Je ne sais toujours pas mixer ces 2 codes en 1 et après avoir relu ce que je trouvais sur le protocole I2C je ne sais toujours pas déclarer les 2 périphériques avec leurs adresses respectives 0x3c pour l'Oled et 0x68 pour le RTC ...

Sans être un cador en programmation, si tu analyses un peu le code des 2 programmes que tu donnes, tu vois que:

  • pour le programme de l'OLED

  • il n'y a rien dans le setup. Donc cette partie du programme dans ta montre sera vite faite

  • dans la boucle principale, le programme se contente de dessiner en boucle un logo. Donc cette partie ne t'intéresse pas non plus pour ton programme final.

  • tu noteras qu'il n'y a aucune déclaration de périphérique I²C ce qui donne à penser que la déclaration est caché (comprendre réalisée par la librairie)

  • pour le programme de la RTC

  • le setup ne contient que l'ouverture du port série. Donc cette partie ne t'intéresse pas pour ton application

  • il n'y a pas non plus de déclaration de périphérique I²C ce qui donne à penser que cette fois encore la déclaration est caché (comprendre réalisée par la librairie)

  • la boucle principale se contente de lire l'heure dans le DS1307 avec RTC.read() ensuite elle sépare heures, minutes, secondes et date pour les envoyer vers le port série. Dans ton cas, au lieu d'envoyer les valeurs à afficher vers Serial il faut que tu fasses appel aux fonctions d'affichage de texte de la librairie de ton afficheur.

Enfin de compte il n'y a quasiment rien à récupérer des 2 programmes. La partie la plus importante la gestion de l'affichage et sa mise en forme sont à faire en fonction de ce que tu veux obtenir au final.
Tu peux t'inspirer du programme de démonstration de l'afficheur pour voir comment dessiner un cadre et afficher du texte.

Ouech... j'ai vraiment que dalle quoi :~

c'est assez rebutant et décourageant