Débutant - Réalisation d'une horloge lcd sans DS1307 et GPS

Bonsoir,

Short story : J’ai décidé de me lancer dans l’arduino car je souhaite créer un petit “pilullier” automatique pour permettre à ma grand-mère de ne plus oublier ses médicaments.

Equipement : Voici la liste non exhaustif de tout mon équipement pour ce projet, nous nous intéresserons ici qu’à la partie lcd :

  • Une arduino mega 2560

Partie moteur:

  • Un moteur shield
  • Un moteur pas à pas
  • Un éléctroaimant qui “pousse”

Partie horloge / alarme :

  • Un lcd 8x2 de chez adafruit

Avancement de mon projet : Je ne vous propose pas un long schéma de tout le montage (sauf si certains sont curieux) car toute la partie moteur fonctionne.
Je bloque sur la partie lcd depuis quelques jours car je n’arrive pas à paramétrer mon écran.
Je cherche à afficher pour commencer l’heure sur mon écran lcd, celle ci n’a pas à être juste forcément (c. à d. je décide d’afficher 12h00 alors qu’il est 10h50).

Voici l’algorithme du programme que je chercher à réaliser:

  • Arduino ON
  • Une heure prédéfinie s’affiche (ex: 12h00 s’affiche sur l’écran)
  • le module arduino converti les “millis” en minute
  • A chaque minute, heure prends un minute
  • Heure s’affiche (ex: 12h01, une minute plus tard)
  • […]
  • Arduino OFF

J’ai déjà testé ce code, mon écran marche bien avec celui-ci:

/*********************

Example code for the Adafruit RGB Character LCD Shield and Library

This code displays text on the shield, and also reads the buttons on the keypad.
When a button is pressed, the backlight changes color.

**********************/

// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>


Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

void setup() {
  // Debugging output
  Serial.begin(9600);
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);

 
  int time = millis();
  lcd.print("Coucou Paul!");
  time = millis() - time;
  Serial.print("Took "); Serial.print(time); Serial.println(" ms");
  lcd.setBacklight(WHITE);
}

uint8_t i=0;
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);

  
  }
}

Cependant, maintenant je bloque totalement pour afficher cette heure là. Comment faire quelque chose qui marche déjà?
Comme faire en sorte que ce soit visible? J’ai fais quelques recherches et je suis tombé là-dessus :http://playground.arduino.cc/Code/Time
La librairie est téléchargée et installée mais maintenant, je n’arrive pas à m’en servir…
Mon écran LCD est directement branché sur la carte arduino (emboitement).
Pouvez vous m’aider dans la création d’un code pour afficher cette heure?

Merci, pour tout! :slight_smile:

Tout simplement parce que cette lib est faite pour interagir avec une horloge externe (GPS, DS1307, liaison série avec un programme processing ...).

d'ailleurs c'est fortement recommandé d'utiliser une RTC type DS1307, millis() n'est pas assez précis et à la fin de l'année ta grand mère prendra ses médocs du ptit dej au souper ...

Sinon tu peux prendre un shield ethernet et te synchroniser sur internet.

Mais bon, pas trop grand mere friendly :grin:

Saut B@tto, salut john-lenfr !
Justement b@tto, en cherchant sur un internet, j’ai entendu que l’on pouvait se passer de tout ça. Ok, le temps après un arrêt ne sera plus le bon (comme un RTC type DS1307) ou il ne se synchronisera pas à chaque fois avec la liaison série…

Par exemple, en scrollant un peu le lien que je vous ai envoyé (cf. http://playground.arduino.cc/Code/Time ) :

TimeSerial.pde shows Arduino as a clock without external hardware.
It is synchronized by time messages sent over the serial port.
A companion Processing sketch will automatically provide these messages if it is running and connected to the Arduino serial port.

J’espérai me servir de ça ! Autrement,

millis() n’est pas assez précis

me suffit. Je veux dire par là que la précision pour l’instant peut être très très moyenne. En gros, il faudrait surtout que ça fonctionne sans de gros décalages deux heures durant. Au mieux, une semaine! Ça reste un projet, je doute qu’elle s’en serve très longtemps : c’est surtout pour lui montrer ce que j’ai fais.

D’un autre côté, j’ai récupéré ce matin un internet shield (surprise! :D, un copain très très sympa). Mais je voudrais éviter de m’en servir car ma méga est déjà bien pleine à mes yeux.

Alors voilà, j’ai commencé à modifier un peu le code “Time Serial” qui est intégré à la librairie pour qu’il colle à mon lcd screen.

/* 
 * TimeSerial.pde
 * example code illustrating Time library set through serial port messages.
 *
 * Messages consist of the letter T followed by ten digit time (as seconds since Jan 1 1970)
 * you can send the text on the next line using Serial Monitor to set the clock to noon Jan 1 2013
 T1357041600  
 *
 * A Processing example sketch to automatically send the messages is inclided in the download
 * On Linux, you can use "date +T%s > /dev/ttyACM0" (UTC time zone)
 */ 
 
 
// Je rajoute ici le code pour faire fonctionner mon écran
// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>

//voilà

#include <Time.h>  

#define TIME_HEADER  "T"   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message 

//Rajout biblio
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();  
//Voilà

void setup()  {
  Serial.begin(9600);
  // while (!Serial) ; // Needed for Leonardo only (enlever crochet si beug)
  pinMode(13, OUTPUT);
  setSyncProvider( requestSync);  //set function to call when sync required
  Serial.println("Waiting for sync message");
  
  //Rajout allumer écran
  // Debugging output
  Serial.begin(9600);
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
}

void loop(){    
  if (Serial.available()) {
    processSyncMessage();
  }
  if (timeStatus()!= timeNotSet) {
    digitalClockDisplay();  
  }
  if (timeStatus() == timeSet) {
    digitalWrite(13, HIGH); // LED on if synced
  } else {
    digitalWrite(13, LOW);  // LED off if needs refresh
  }
  delay(1000);
}

void digitalClockDisplay(){
  // digital clock display of the time
  lcd.print(hour());
  printDigits(minute());
  printDigits(second());
  lcd.print(" ");
  lcd.print(day());
  lcd.print(" ");
  lcd.print(month());
  lcd.print(" ");
  lcd.print(year()); 
  lcd.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}


void processSyncMessage() {
  unsigned long pctime;
  const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013

  if(Serial.find(TIME_HEADER)) {
     pctime = Serial.parseInt();
     if( pctime >= DEFAULT_TIME) { // check the integer is a valid time (greater than Jan 1 2013)
       setTime(pctime); // Sync Arduino clock to the time received on the serial port
     }
  }
}

time_t requestSync()
{
  Serial.write(TIME_REQUEST);  
  return 0; // the time will be sent later in response to serial mesg
}

Mais ça donne rien de super, je suis vraiment pas doué au niveau lcd…

Je repasse ce soir pour poster le code original et une ou deux photo de ce que j’ai fais :slight_smile:

Bonne journée!

Au début de digitalClockDisplay il faudrait repositionner le curseur en haut de l'écran sinon l'afichage se fait n'importe où.

Bin oui, il suffit de lire ce qui est dit (et que je t'avais dit) : TimeSerial récupère le temps par liaison série depuis un programme processing sur PC. Donc il faut le bon programme, connecté à l'Arduino pour une synchro.

On va remettre les chose en perspective : un module DS1307 ça coute -de 3€ sur ebay ou dx.com, donc niveau investissement je pense pas que ça te pose problème :wink:

Ensuite je t'assure, millis() pour du temps réel c'est la misère ... Déjà si reboot ça repart à zéro. Ensuite la précision est vraiment pas bonne : le décalage est facilement de plusieurs dizaines de minutes / jour, ton projet ne sera viable que pendant un mois au pire. Puis comme jtai, 3€ et t'as plus à te poser la question ... Et au passage tu apprendras l'i2c

B@tto:
On va remettre les chose en perspective : un module DS1307 ça coute -de 3€ sur ebay ou dx.com, donc niveau investissement je pense pas que ça te pose problème :wink:

Ensuite je t'assure, millis() pour du temps réel c'est la misère ... Déjà si reboot ça repart à zéro. Ensuite la précision est vraiment pas bonne : le décalage est facilement de plusieurs dizaines de minutes / jour, ton projet ne sera viable que pendant un mois au pire. Puis comme jtai, 3€ et t'as plus à te poser la question ... Et au passage tu apprendras l'i2c

+1
une boite à medoc pour "mamie" ça doit etre simple, fiable et autonome :grin:
perdre son temps à gerer du temps "batard" :grin: n'est surement pas une bonne solution.

Bonjour,
J'ai une idée :
un cadran solaire + une caméra + un soft de reconnaissance d'images :wink:
Pas sur la tête, je suis déjà parti

Au début de digitalClockDisplay il faudrait repositionner le curseur en haut de l’écran sinon l’afichage se fait n’importe où.

Je fais ça tout de suite, merci! :slight_smile:

On va remettre les chose en perspective : un module DS1307 ça coute -de 3€ sur ebay ou dx.com, donc niveau investissement je pense pas que ça te pose problème.

Non, c’est sur, ça ne pose pas de problème et puis c’est plus grand mere friendly comme John le disait haha.

Alors celui-ci me semble correcte, la pile n’a pas l’air fournie (malgré la photo) mais j’en ai chez moi:

Me faut-il encore quelque chose pour réaliser le montage pour faire l’horloge?

Encore merci pour tes conseils B@tto, merci à toi aussi Artouste, je pensais pas que c’était aussi peu précis.

un cadran solaire + une caméra + un soft de reconnaissance d’images

Oh, tu dois être certainement très fort pour avoir des idées aussi génial. Si t’as besoin d’aide, crée un topic et j’essayerais de t’aider malgré mon faible niveau en Arduino mais mon envie de faire aboutir des projets. :grin:

La photo que je vous avais promise l’autre jour, finalement avec la pile je vais pouvoir rendre le module RTC. (Juste un aperçu, dans ce topic, je souhaite me concentrer sur l’horloge, le reste fonctionnant plus ou moins haha)

sintaax:
Alors celui-ci me semble correcte, la pile n'a pas l'air fournie (malgré la photo) mais j'en ai chez moi:

Me faut-il encore quelque chose pour réaliser le montage pour faire l'horloge?

non tu n'a besoin de rien d'autre
si ta photo correspond à un lien ebay (actif à cette heure) la batterie est indiqué fournie
DS1307 based RTC with CR2032 battery (Battery include).

Voilà c'est commandé!

Je suivrais ce topic ensuite, ça m'a l'air clair. http://mchobby.be/wiki/index.php?title=ADF-RTC-DS1307-UTILISER#Branchement

Bonjour,
je reviens vers vous avec le projet presque fini! Il devrait être présentable dans deux mois maximum (pas énormément de temps libre).

J’ai un moteur qui tourne dans un seul sens à vrai dire, et je ne comprends pas pourquoi…
Je vous demande dans votre avis, c’est certainement mon code qui plante.
(le moteur est branché sur une moteur shield qui est elle même déporté).

Voici le code qui m’a servi à faire fonctionner le moteur (avant d’être déporté):

int delaylegnth = 10;
int nbrpas =200;
int i;
bool avant;
bool arriere;
void setup() {

  //establish motor direction toggle pins
  pinMode(12, OUTPUT); //CH A -- HIGH = forwards and LOW = backwards???
  pinMode(13, OUTPUT); //CH B -- HIGH = forwards and LOW = backwards???
  
  //establish motor brake pins
  pinMode(9, OUTPUT); //brake (disable) CH A
  pinMode(8, OUTPUT); //brake (disable) CH B
avant=true;
arriere=true;
  
  
}

void loop(){
 if (avant ==true) {
 for (i=0;i<nbrpas;i++)  
 {
  digitalWrite(9, LOW);  //ENABLE CH A
  digitalWrite(8, HIGH); //DISABLE CH B

  digitalWrite(12, HIGH);   //Sets direction of CH A
  analogWrite(3, 255);   //Moves CH A
  
  delay(delaylegnth);
  
  digitalWrite(9, HIGH);  //DISABLE CH A
  digitalWrite(8, LOW); //ENABLE CH B

  digitalWrite(13, LOW);   //Sets direction of CH B
  analogWrite(11, 255);   //Moves CH B
  
  delay(delaylegnth);
  
  digitalWrite(9, LOW);  //ENABLE CH A
  digitalWrite(8, HIGH); //DISABLE CH B

  digitalWrite(12, LOW);   //Sets direction of CH A
  analogWrite(3, 255);   //Moves CH A
  
  delay(delaylegnth);
    
  digitalWrite(9, HIGH);  //DISABLE CH A
  digitalWrite(8, LOW); //ENABLE CH B

  digitalWrite(13, HIGH);   //Sets direction of CH B
  analogWrite(11, 255);   //Moves CH B
  
  delay(delaylegnth);
}
                  }
avant=false;

 if (arriere ==true) {
 for (i=0;i<nbrpas;i++)  
 {
  digitalWrite(9, LOW);  //ENABLE CH A
  digitalWrite(8, HIGH); //DISABLE CH B

  digitalWrite(12, HIGH);   //Sets direction of CH A
  analogWrite(3, 255);   //Moves CH A
  
  delay(delaylegnth);
  
  digitalWrite(9, HIGH);  //DISABLE CH A
  digitalWrite(8, LOW); //ENABLE CH B

  digitalWrite(13, HIGH);   //Sets direction of CH B
  analogWrite(11, 255);   //Moves CH B
  
  delay(delaylegnth);
  
  digitalWrite(9, LOW);  //ENABLE CH A
  digitalWrite(8, HIGH); //DISABLE CH B

  digitalWrite(12, LOW);   //Sets direction of CH A
  analogWrite(3, 255);   //Moves CH A
  
  delay(delaylegnth);
    
  digitalWrite(9, HIGH);  //DISABLE CH A
  digitalWrite(8, LOW); //ENABLE CH B

  digitalWrite(13, LOW);   //Sets direction of CH B
  analogWrite(11, 255);   //Moves CH B
  
  delay(delaylegnth);

}
arriere=false;
}

Voici mon code actuel (moteur déporté):

int delaylegnth = 30;
int nbrpas =50;
int i;
bool avant;
bool arriere;
void setup() {

  //establish motor direction toggle pins
  pinMode(32, OUTPUT); //CH A -- HIGH = forwards and LOW = backwards???
  pinMode(33, OUTPUT); //CH B -- HIGH = forwards and LOW = backwards???
  
  //establish motor brake pins
  pinMode(23, OUTPUT); //brake (disable) CH A
  pinMode(31, OUTPUT); //brake (disable) CH B
  pinMode(36,OUTPUT);// remplace broche 3 mode PWM phase A
  pinMode(37,OUTPUT);//remplace broche 11 mode pwm phase B
  
avant=true;
arriere=true;
  
  
}

void loop(){
 if (avant ==true) {
 for (i=0;i<nbrpas;i++)  
 {
  digitalWrite(23, LOW);  //ENABLE CH A
  digitalWrite(31, HIGH); //DISABLE CH B

  digitalWrite(32, HIGH);   //Sets direction of CH A
  digitalWrite(36,HIGH);   //Moves CH A
  
  delay(delaylegnth);
  
  digitalWrite(23, HIGH);  //DISABLE CH A
  digitalWrite(31, LOW); //ENABLE CH B

  digitalWrite(33, LOW);   //Sets direction of CH B
  digitalWrite(37, HIGH);   //Moves CH B
 
  delay(delaylegnth);
  
  digitalWrite(23, LOW);  //ENABLE CH A
  digitalWrite(31, HIGH); //DISABLE CH B

  digitalWrite(32, LOW);   //Sets direction of CH A
  digitalWrite(36, HIGH);   //Moves CH A
  
  delay(delaylegnth);
    
  digitalWrite(23, HIGH);  //DISABLE CH A
  digitalWrite(31, LOW); //ENABLE CH B

  digitalWrite(33, HIGH);   //Sets direction of CH B
  digitalWrite(37, HIGH);   //Moves CH B
 
  delay(delaylegnth);
}
                  }
avant=false;


 if (arriere ==true) {
 for (i=0;i<nbrpas;i++)  
 {
  digitalWrite(23, LOW);  //ENABLE CH A
  digitalWrite(31, HIGH); //DISABLE CH B

  digitalWrite(32, HIGH);   //Sets direction of CH A
  digitalWrite(36,HIGH);   //Moves CH A

  delay(delaylegnth);
  
  digitalWrite(23, HIGH);  //DISABLE CH A
  digitalWrite(31, LOW); //ENABLE CH B

  digitalWrite(33, HIGH);   //Sets direction of CH B
  digitalWrite(37, HIGH);   //Moves CH B
  
  delay(delaylegnth);
  
  digitalWrite(23, LOW);  //ENABLE CH A
  digitalWrite(31, HIGH); //DISABLE CH B

  digitalWrite(32, LOW);   //Sets direction of CH A
  digitalWrite(36,HIGH);   //Moves CH A

  delay(delaylegnth);
    
  digitalWrite(23, HIGH);  //DISABLE CH A
  digitalWrite(31, LOW); //ENABLE CH B

  digitalWrite(33, LOW);   //Sets direction of CH B
  digitalWrite(37, HIGH);   //Moves CH B
  
  delay(delaylegnth);

}
arriere=false;
}








}

Voilà, tout, j’espère que c’est seulement une bête erreur de code…