Pages: 1 [2] 3   Go Down
Author Topic: [Tuto] ds1307 Arduino Processing mise à l'heure NTP  (Read 7921 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 57
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour le décalage, on m'a conseillé de mettre un condensateur (10nF pour l'un, 100nF pour l'autre personne) entre le +5 et le GND.
Je n'ai pas encore testé sur le long terme (je dois adapter le support de la pile) mais d'après ces personnes, ça réduit le décalage de l'heure.

De plus, on m'a dit que les résistances n'étaient pas nécéssaire.

Ps: je ne suis qu'un débutant donc je ne peux pas confirmer  smiley-wink
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour le décalage, on m'a conseillé de mettre un condensateur (10nF pour l'un, 100nF pour l'autre personne) entre le +5 et le GND.
Je n'ai pas encore testé sur le long terme (je dois adapter le support de la pile) mais d'après ces personnes, ça réduit le décalage de l'heure.

De plus, on m'a dit que les résistances n'étaient pas nécéssaire.
Je vois pas trop en quoi le condensateur entre gnd et vcc va aider à la précision du module ?
A pars filtrer les parasites sur l'alim mais sinon ...

Pour les résistances de pul-up elle sont effectivement facultatives si il n'y a qu'un seul périphérique I2C sur le bus, mais c'est trés variable selon les périphériques, sans les résistances cela peut trés bien marcher avec un et pas du tout avec un autre.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 24
Posts: 3171
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La version pour Arduino 1.xx

Code:
/*
 Permet de mettre une horloge ds1307 en synchronisation avec l'heure NTP
 Par le biais d'une application Arduino-Processing
 */

/*

 Comporte des parties de code écrites par :
- Maurice Ribble
  4-17-2008
  http://www.glacialwanderer.com/hobbyrobotics
  Pour le ds1307
 
 - X. HINAULT
   01/2010
   http://www.mon-club-elec.fr
   Pour le LCD
 
 */
 
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

// Stops the DS1307, but it has the side effect of setting seconds to 0
// Probably only want to use this for testing
/*void stopDs1307()
 {
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.send(0);
 Wire.send(0x80);
 Wire.endTransmission();
 }*/

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second,        // 0-59
byte minute,        // 0-59
byte hour,          // 1-23
byte dayOfWeek,     // 1-7
byte dayOfMonth,    // 1-28/29/30/31
byte month,         // 1-12
byte year)          // 0-99
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(second));    // 0 to bit 7 starts the clock
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));      // If you want 12 hour am/pm you need to set
  // bit 6 (also need to change readDateDs1307)
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}

// Gets the date and time from the ds1307
void getDateDs1307(
byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // A few of these need masks because certain bits are control bits
  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}


#include <LiquidCrystal.h>

const int RS=2; //declaration constante de broche
const int E=3; //declaration constante de broche
const int D4=4; //declaration constante de broche
const int D5=5; //declaration constante de broche
const int D6=6; //declaration constante de broche
const int D7=7; //declaration constante de broche
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);

int octetReception=0; // variable de stockage des valeurs reçues sur le port Série (ASCII)
char caractereRecu=0; // variable pour stockage caractère recu
int compt=0; // variable comptage caractères reçus

String chaineReception=""; // déclare un objet String vide pour reception chaine
int oldSecond;

void setup() {
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin(); // initialise 1wire

  Serial.begin(115200); // Initialise la communication série

  // lit les valeurs de l'horloge pour les replacer si elle est déjà à l'heure
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  if ((year)== NULL){ // si l'année = NULL
  // preinitialise l'horloge mets les valeurs lue précédement (à 0 si premier allumage)
  setDateDs1307(int(second), int(minute), int(hour), int(dayOfWeek), int(dayOfMonth), int(month), int(year));
  }

  //***** LCD *****//
  lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes
  delay(10); // pause rapide pour laisser temps initialisation
  lcd.print("initialisation") ; // affiche la chaîne texte - message de test
  lcd.setCursor(0, 1) ;
  lcd.print("de l'horloge") ;
  delay(2000); // pause de 2 secondes
  lcd.clear(); // // efface écran et met le curseur en haut à gauche
  delay(100); // pour laisser temps effacer écran

  //**** liaison pour l'heure NTP ****//
  Serial.println('A'); // envoi un "top" à Processing
  while (millis()<5000) {  // attente pendant 5 secondes d'une liaison série (ne fonctionne pas en dessous)
    while (Serial.available()>0) { // tant qu'un octet est dans la liaison série

      octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable     

      if (octetReception==13) { // si l'octet reçu est le retour chariot (CR ou 13)

        // converti la chaine en entier pour les valeurs de temps
        second = int((chaineReception.charAt(0)-48)*10)+int(chaineReception.charAt(1)-48) ;
        minute = int((chaineReception.charAt(2)-48)*10)+int(chaineReception.charAt(3)-48);
        hour = int((chaineReception.charAt(4)-48)*10)+int(chaineReception.charAt(5)-48);
        dayOfWeek = 1;
        dayOfMonth = int((chaineReception.charAt(6)-48)*10)+int(chaineReception.charAt(7)-48);
        month = int((chaineReception.charAt(8)-48)*10)+int(chaineReception.charAt(9)-48);
        year = int((chaineReception.charAt(12)-48)*10)+int(chaineReception.charAt(13)-48); //int((chaineReception.charAt(10)-48)*1000)+int((chaineReception.charAt(11)-48)*100)+

        //mets le DS1307 en syncronisation avec l'horloge de l'ordinateur
        setDateDs1307(int(second), int(minute), int(hour), int(dayOfWeek), int(dayOfMonth), int(month), int(year));

        chaineReception=""; //RAZ de la chaine de réception
        break; // sort de la boucle while
      }
      else { // si le caractère reçu n'est pas un saut de ligne
        caractereRecu=char(octetReception); // convertit l'octet reçu en caractère
        chaineReception=chaineReception+caractereRecu; // ajoute le caratère à la chaine
      }
    }
  }
}

void loop(){

  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

  if(second!=oldSecond){  // change l'affichage uniquement au changement de seconde
    Serial.print(hour, DEC);
    Serial.print(":");
    Serial.print(minute, DEC);
    Serial.print(":");
    Serial.print(second, DEC);
    Serial.print("  ");
    Serial.print(month, DEC);
    Serial.print("/");
    Serial.print(dayOfMonth, DEC);
    Serial.print("/");
    Serial.print(year, DEC);
    Serial.print("  Day_of_week:");
    Serial.println(dayOfWeek, DEC);

    lcd.home();
    if (int(hour)<=9)lcd.print(0);
    lcd.print(int(hour));
    lcd.print (":");
    if (int(minute)<=9)lcd.print(0);
    lcd.print(int(minute));
    lcd.print (":");
    if (int(second)<=9)lcd.print(0);
    lcd.print(int(second));
    lcd.setCursor (0,1);
    if (int(dayOfMonth)<=9)lcd.print(0);
    lcd.print(int(dayOfMonth));
    lcd.print ("/");
    if (int(month)<=9)lcd.print(0);
    lcd.print(int(month));
    lcd.print ("/20");
    lcd.print(int(year));

  }
  oldSecond=second;  // réinitialise oldSecond

}
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Dans l'Espace
Offline Offline
Sr. Member
****
Karma: 1
Posts: 294
ArduinoBot builder \^^/
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut smiley

p'tite question, avez vous trouvé le moyen de sauvegarder l'heure de réveil (par exemple) dans le DS1307 ?
skywodd ? tu te rappel ?  smiley-wink
afin que quand il y a une panne de courant durant la nuit, on puisse quand même être réveillé  smiley-lol

Merci smiley
@plus smiley-wink
Logged

Proverbe Tibétain : Un mensonge est un saut du haut du toit

Biganos
Offline Offline
Sr. Member
****
Karma: 0
Posts: 356
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut   smiley-wink
Un programme comme ça :
Code:
// RAM read and write functions using a DS1307 RTC connected via I2C and Wire lib.
    // 2012-11-06 www.idreammicro.com http://opensource.org/licenses/mit-license.php

    #include <Wire.h>
    #include <RTClib.h>

    RTC_DS1307 RTC;

    void setup () {
        Serial.begin(57600);
        Wire.begin();
        RTC.begin();
       
        // Write bytes in RAM.
        uint8_t data[13] = {
            'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n',
        };
        RTC.writeBytesInRam(0x08, 13, data);
    }

    void loop () {
        // Read bytes in RAM.
        uint8_t data[13] = { 0 };
        RTC.readBytesInRam(0x08, 13, data);
       
        // Print bytes on Serial.
        Serial.write(data, 13);
        delay(5000);
    }

A+

Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Dans l'Espace
Offline Offline
Sr. Member
****
Karma: 1
Posts: 294
ArduinoBot builder \^^/
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut Chabot380  smiley
Honnêtement je dirais :  smiley-confuse heu... oui... peut être ....   (ho lala.... j'suis complètement perdu, faut que je révise tout les tutos arduino moi, pfiou ....)
Je garde le post sous le coude  smiley-grin
Merci @vous tous smiley-wink
Logged

Proverbe Tibétain : Un mensonge est un saut du haut du toit

Offline Offline
Jr. Member
**
Karma: 0
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

j'aimerais savoir comment est-ce que l'upload des deux codes se fait ou plutôt comment est-ce qu'on fait fonctionner les deux code ?
Logged

Peace & love

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 24
Posts: 3171
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tout est dans les deux premiers messages.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Jr. Member
**
Karma: 0
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui relu et j'ai fait comme écrit mais je n'ai pas du tout de synchronisation. A la place j'ai ceci :




Edit de Jean-François :  Pffff j'ai même du modifier l'url de ta photo....  smiley-roll
« Last Edit: March 26, 2014, 12:14:56 pm by Jean-François » Logged

Peace & love

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 24
Posts: 3171
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est marrant, ton lcd il ressemble vachement pas au mien   smiley-lol

Tu as installé Processing ?
« Last Edit: March 26, 2014, 12:17:18 pm by Jean-François » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Jr. Member
**
Karma: 0
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu as installé Processing ?

Oui

Pour le LCD, j'ai juste mit les parties le concernant en commentaire. Je veux juste voir le résultat sur le moniteur série et je pourrai faire le reste après. Et puis je compte plutôt utiliser des afficheurs 7 segment à la place.
« Last Edit: March 26, 2014, 12:27:17 pm by Uzuma » Logged

Peace & love

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 24
Posts: 3171
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu fais l'initialisation sans la pile, Arduino sous tension avant le lancement du sketch Processing ?

Quelle version de Processing ?  (la version 1.5.1 fonctionne)
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Jr. Member
**
Karma: 0
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La pile est déjà monté. J'utilise ce modèle. J'ouvre les deux sketch( celui d'arduino et celui de processing) ensuite je téléverse celui d'arduino et c'est à la suite de ça que je fais "Run" pour celui de processing. Pour processing j'ai, après compilation, COM3, COM4, COM5 au bas.

J'utilise la version 2.1
Logged

Peace & love

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 24
Posts: 3171
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il faut que la pile soit enlevée pour l'initialisation.

Il y avait eu un problème, corrigé dans ce message :

http://forum.arduino.cc/index.php?topic=77849.msg1546598#msg1546598

Essaie avec P 1.5xx

Pour Processing 2.xx il y a peut être des choses à changer, mais la base est dans les sketchs d'origine.
« Last Edit: March 26, 2014, 12:39:45 pm by Jean-François » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Jr. Member
**
Karma: 0
Posts: 96
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, j'ai enlevé la pile pour le moment. Je vais maintenant télécharger la version 1.5.1 de processing pour voir ce que ça donne.
Logged

Peace & love

Pages: 1 [2] 3   Go Up
Jump to: