Go Down

Topic: Module graphique SPI et Horloge I2C (Read 3622 times) previous topic - next topic

Wallabis

Bonjour,

Je poste ici car j'ai besoin d'aide pour une programmation. J'ai pour projet d'afficher la date et l'heure sur un afficheur graphique SPI (LCD12864) à l'aide d'une horloge grove I2C ( basée sur le DS1307 ) et d'une carte Arduino. Je suis arrivé à afficher des caractères sur mon écran à l'aide du programme suivant :*

Code: [Select]
#include "U8glib.h" // Inclut la librairie U8G
 
//U8GLIB_ST7920_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, U8G_PIN_NONE, U8G_PIN_NONE, 17, 16); // Câblage parallèle
U8GLIB_ST7920_128X64 u8g(13, 11, 10, U8G_PIN_NONE); // Câblage SPI
 
/* Fonction permettant de redessiner TOUT l'écran */
void draw(void) {
  u8g.setFont(u8g_font_unifont); // Utilise la police de caractère standard
  u8g.drawStr( 0, 22, "Hello World"); // Affiche hello world
}
 
/* setup() */
void setup(void) {
  u8g.setColorIndex(1); // Affichage en mode N&B (obligatoire vu que l'on a pas un écran couleur)
}
 
/* loop() */
void loop(void) {
 
  u8g.firstPage(); // Sélectionne la 1er page mémoire de l'écran
  do {
    draw(); // Redessine tout l'écran
  } while(u8g.nextPage()); // Sélectionne la page mémoire suivante
   
  /* Delai avant de recommencer */
  delay(1000);
}


Et j'arrive à faire fonctionner l'horloge via le moniteur série Arduino à l'aide du programme suviant :

Code: [Select]
/****************************************************************************/
// Function: Set time and get the time from RTC chip(DS1307) and display
//   it on the serial monitor.
// Hardware: Grove - RTC
// Arduino IDE: Arduino-1.0
// Author: FrankieChu
// Date: Jan 19,2013
// Version: v1.0
// by www.seeedstudio.com
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
/****************************************************************************/
#include <Wire.h>
#include "DS1307.h"

DS1307 clock;//define a object of DS1307 class
void setup()
{
Serial.begin(9600);
clock.begin();
clock.fillByYMD(2013,1,19);//Jan 19,2013
clock.fillByHMS(15,28,30);//15:28 30"
clock.fillDayOfWeek(SAT);//Saturday
clock.setTime();//write time to the RTC chip
}
void loop()
{
printTime();
}
/*Function: Display time on the serial monitor*/
void printTime()
{
clock.getTime();
Serial.print(clock.hour, DEC);
Serial.print(":");
Serial.print(clock.minute, DEC);
Serial.print(":");
Serial.print(clock.second, DEC);
Serial.print(" ");
Serial.print(clock.month, DEC);
Serial.print("/");
Serial.print(clock.dayOfMonth, DEC);
Serial.print("/");
Serial.print(clock.year+2000, DEC);
Serial.print(" ");
Serial.print(clock.dayOfMonth);
Serial.print("*");
switch (clock.dayOfWeek)// Friendly printout the weekday
{
case MON:
  Serial.print("MON");
  break;
case TUE:
  Serial.print("TUE");
  break;
case WED:
  Serial.print("WED");
  break;
case THU:
  Serial.print("THU");
  break;
case FRI:
  Serial.print("FRI");
  break;
case SAT:
  Serial.print("SAT");
  break;
case SUN:
  Serial.print("SUN");
  break;
}
Serial.println(" ");
}


Maintenant il me faudrait afficher l'heure sur l'écran mais, étant débutant en programmation, je ne sais pas comment faire.. Merci pour votre aide.

Cordialement. G

vohu

#1
Mar 23, 2015, 09:47 am Last Edit: Mar 23, 2015, 09:49 am by vohu
Tu vas devoir assembler tes 2 programmes (évidement, il faut le faire à la main)

Ensuite, il faut créer une chaine de caractères de type char texte[nombredelettresmax]

Avec la fonction sprintf(monTexte, "%d:%d ...", clock.hour, clock.minute ...)
Tu vas pouvoir insérer tes variables de l'horloge dans ta chaine

Puis, dans ton programme tu as "Hello World"
Il faut le remplacer par ta variable comme ici : u8g.drawStr( 0, 22, texte);


Comme pour beaucoup d'autres personnes qui postent ici, il faut que tu apprennes le C, car tu seras vite bloqué en te limitant à des copier/coller d'internet.

Wallabis

Merci pour ton aide vohu.

Avec quelques cours sur le net + ce que tu m'as dit au-dessus je devrais y arriver.

vohu

#3
Mar 23, 2015, 10:36 am Last Edit: Mar 23, 2015, 10:37 am by vohu
désolé de pas te donner la réponse directement, mais c'est comme ça qu'on apprend :)

Tu verras que même en connaissant la base, il y a plein de pièges qui prendront toujours la tête :D

Wallabis

#4
Mar 25, 2015, 04:16 pm Last Edit: Mar 25, 2015, 04:19 pm by Wallabis
Salut vohu.

Je suis arrivé à afficher sur mon écran lcd l'heure ainsi que la date grâce a ton aide et a quelques cours sur internet. Cependant je me suis servi de "%d" pour tout se qui était clock.hour, clock.minute...
Mais que dois-je mettre pour les jours de la semaine afin d'afficher MON, TUE.. car lorsque je mets %d logiquement j'obtiens 1 pour  lundi, 2 pour mardi..




fdufnews

#5
Mar 25, 2015, 04:28 pm Last Edit: Mar 25, 2015, 04:29 pm by fdufnews
Ce n'est pas seulement parce que tu mets %d que tu affiches 1,2, ... mais parce que le DS1307 ne retourne pas le jour de la semaine mais un numéro pour identifier celui-ci.
Il faut que tu crées un tableau avec le nom des jours de la semaine et tu iras chercher dans le tableau le nom du jour. Ensuite tu pourras le faire afficher en utilisant un %s dans la chaîne de formatage à l'emplacement où tu veux faire afficher le jour.

Ce serait bien aussi que tu mettes ton code au moins on saurait de quoi on parle.

Wallabis

#6
Mar 25, 2015, 04:35 pm Last Edit: Mar 25, 2015, 04:44 pm by Wallabis
Merci de ton aide fdufnews. Je vais essayer ce que tu m'as dit.

Voici mon code :

Code: [Select]
#include "U8glib.h" // Inclut la librairie U8G
#include <Wire.h>
#include "DS1307.h"
#include <stdio.h>
#include <stdlib.h>

DS1307 clock;//define a object of DS1307 class

char mychar[]=":";
        char hourchar[5];
        char minutechar[5];
        char secondchar[3];
        char monthchar[3];
        char dayOfMonthchar[3];
        char yearchar[3];
       char dayOfWeekchar[10];
       
//U8GLIB_ST7920_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, U8G_PIN_NONE, U8G_PIN_NONE, 17, 16); // Câblage parallèle
U8GLIB_ST7920_128X64 u8g(13, 11, 7, U8G_PIN_NONE); // Câblage SPI
 
/* Fonction permettant de redessiner TOUT l'écran */
void draw(void) {
       u8g.setFont(u8g_font_unifont); // Utilise la police de caractère standard
       u8g.drawStr( 0, 22, hourchar); // Affiche les heures
       u8g.drawStr( 14, 22, mychar); // Affiche ":"
       u8g.drawStr( 20, 22, minutechar); // Affiche les minutes
       u8g.drawStr( 34, 22, mychar); // Affiche ":"
       u8g.drawStr( 40, 22, secondchar); // Affiche les secondes
       u8g.drawStr( 0, 44, dayOfMonthchar); // Affiche le jour du mois
       u8g.drawStr( 15, 44, "/"); // Affiche "/"
       u8g.drawStr( 22, 44, monthchar); // Affiche les mois
       u8g.drawStr( 37, 44, "/"); // Affiche "/"
       u8g.drawStr( 42, 44, yearchar); // Affiche l'année
       u8g.drawStr( 0, 60, dayOfWeekchar); // Affiche le jour de la semaine
     
       
       
       
       
     
}
 
/* setup() */
void setup(void) {
  u8g.setColorIndex(1); // Affichage en mode N&B (obligatoire vu que l'on a pas un écran couleur)

        Serial.begin(9600);
clock.begin();
clock.fillByYMD(2015,12,31);//Jan 19,2013
clock.fillByHMS(23,59,00);//15:28 30"
clock.fillDayOfWeek(SAT);//Saturday
clock.setTime();//write time to the RTC chip
}
 
/* loop() */
void loop(void) {
 
  u8g.firstPage(); // Sélectionne la 1er page mémoire de l'écran
  do {
    draw(); // Redessine tout l'écran
  } while(u8g.nextPage()); // Sélectionne la page mémoire suivante
   
  /* Delai avant de recommencer */
  delay(1000);
  printTime();
}
void printTime()
{
clock.getTime();
Serial.print(clock.hour, DEC);
Serial.print(":");

        sprintf(hourchar,"%d",clock.hour);  // heure
        Serial.println(hourchar);

Serial.print(clock.minute, DEC);   
Serial.print(":");
       
         sprintf(minutechar,"%d",clock.minute);   // Minute
        Serial.println(minutechar);

Serial.print(clock.second, DEC);
Serial.print(" ");

        sprintf(secondchar,"%d",clock.second);  // seconde
        Serial.println(secondchar);

Serial.print(clock.month, DEC);
Serial.print("/");

        sprintf(monthchar,"%d",clock.month); // Mois
        Serial.println(monthchar);
       
Serial.print(clock.dayOfMonth, DEC);
Serial.print("/");

        sprintf(dayOfMonthchar,"%d",clock.dayOfMonth); // jour du mois
        Serial.println(dayOfMonthchar);

Serial.print(clock.year+2000, DEC);
Serial.print(" ");

        sprintf(yearchar,"%d",clock.year); // année
        Serial.println(yearchar);

Serial.print(clock.dayOfMonth);
Serial.print("*");
switch (clock.dayOfWeek)// Friendly printout the weekday
{
case MON:
  Serial.print("LUN");
  break;
case TUE:
  Serial.print("MAR");
  break;
case WED:
  Serial.print("MER");
  break;
case THU:
  Serial.print("JEU");
  break;
case FRI:
  Serial.print("VEN");
  break;
case SAT:
  Serial.print("SAM");
  break;
case SUN:
  Serial.print("DIM");
  break;
}

        sprintf(dayOfWeekchar,"%d",clock.dayOfWeek); // année
        Serial.println(dayOfWeekchar);

Serial.println(" ");

}
[\code]


vohu

#7
Mar 25, 2015, 04:45 pm Last Edit: Mar 25, 2015, 04:56 pm by vohu
Cool :)

Au cas où tu dois afficher autre chose que des entiers un jour, la liste des formats pour les fonctions de la famille printf et scanf. ICI

Pour les jours ou les mois, il y a bien la classe TimeDate qui doit faire ça seule. Cela dit (avec le genre de code que tu as déjà) c'est plus léger de faire une fonction du genre là :
Code: [Select]
int jourInt2Str(int jourInt, char jourStr[])
{
    int res = 1;
    switch(jourInt)
    {
        case 1:
            strcpy(jourStr, "Lundi");
            break;
        case 2:
            strcpy(jourStr, "Mardi");
            break;

        // ... continuer

        default:
            strcpy(jourStr, "Erreur");
            res = 0;
    }
    return res;
}


Utilisation :
Code: [Select]
char jour[15] = ""; //variable qui contient le jour au format texte
    if( jourInt2Str(2, jour) ) //on demande de mettre dans la variable jour, le texte correspondant à 2 et on teste le résultat
        printf ( "Jour 2 : %s\n", jour );
    else
        printf ( "Erreur !\n");


Tu peux adapter ça à n'importe quoi.

Sinon, le plus rapide, c'est la version citée par fdufnews

Wallabis

#8
Mar 26, 2015, 11:19 am Last Edit: Mar 26, 2015, 11:20 am by Wallabis
Voila ce que j'ai fait pour les jours de la semaine, Je vais essayer les mois maintenant :

Code: [Select]


Serial.print(clock.dayOfMonth);
Serial.print("*");
switch (clock.dayOfWeek)// Friendly printout the weekday
{
case MON:
  Serial.print("LUN");
                  sprintf(dayOfWeekchar,"LUN");
  break;
case TUE:
  Serial.print("MAR");
                  sprintf(dayOfWeekchar,"MAR");
  break;
case WED:
  Serial.print("MER");
                  sprintf(dayOfWeekchar,"MER");
  break;
case THU:
  Serial.print("JEU");
                  sprintf(dayOfWeekchar,"JEU");
  break;
case FRI:
  Serial.print("VEN");
                  sprintf(dayOfWeekchar,"VEN");
  break;
case SAT:
  Serial.print("SAM");
                  sprintf(dayOfWeekchar,"SAM");
  break;
case SUN:
  Serial.print("DIM");
                  sprintf(dayOfWeekchar,"DIM");
  break;
}
        Serial.println(dayOfWeekchar); //année


vohu

Cool, tu as essayé de faire comme fdufnews t'as dit ? Ca se fait en 1 seule ligne

Wallabis

Je n'ai jamais fait de tableau sur arduino, je ne sais pas trop par ou commencer

Wallabis

Voila ce que j'ai fait mais la je suis bloqué je ne sais pas comment finir mon tableau et le lire

Code: [Select]

char dayOfWeekchar[8]; // format + 1
String monthname[13] = {
  "JANV",
  "FEVR",
  "MARS",
  "AVRI",
  "MAI",
  "JUIN",
  "JUIL",
  "AOUT",
  "SEPT",
  "OCTO",
  "NOVE",
  "DECE"
};

Christian_R

L'élément monthname[0] c'est janvier, et ainsi de suite.
Christian

Wallabis

Voila l'avancement de mon programme avec le code Arduino ainsi que le résultat sur l'afficheur.
Il doit y avoir des moyens plus simple pour les mois et les jours mais je ne suis pas arrivé à faire un tableau ( vous verrez en commentaire ce que j'ai essayé de faire concernant le tableau des mois ).
Je suis ouvert à toutes critiques. 

Code: [Select]

#include "U8glib.h" // Inclut la librairie U8G
#include <Wire.h>
#include "DS1307.h"
#include <stdio.h>
#include <stdlib.h>

DS1307 clock;//define a object of DS1307 class


char hourchar[3]; // format + \0 ( caractère de controle qui permet d'indiquer une fin de chaine de caratère)
char minutechar[3]; // format + 1
char secondchar[3]; // format + 1
char monthchar[5]; // format + 1
char dayOfMonthchar[3]; // format + 1
char yearchar[5]; // format + 1
char dayOfWeekchar[4]; // format + 1
/*String monthname[14] = {
  "JANV",
  "FEVR",
  "MARS",
  "AVRI",
  "MAI",
  "JUIN",
  "JUIL",
  "AOUT",
  "SEPT",
  "OCTO",
  "NOVE",
  "DECE"
};
*/

//U8GLIB_ST7920_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, U8G_PIN_NONE, U8G_PIN_NONE, 17, 16); // Câblage parallèle
U8GLIB_ST7920_128X64 u8g(13, 11, 7, U8G_PIN_NONE); // Câblage SPI

void setup(void) {
  u8g.setColorIndex(1); // Affichage en mode N&B (obligatoire vu que l'on a pas un écran couleur)

  clock.begin();
  clock.fillByYMD(2015,4,9);//Jan 19,2013
  clock.fillByHMS(10,47,0);//15:28 30"
  clock.fillDayOfWeek(SAT);//Saturday
  clock.setTime();//write time to the RTC chip


}

void loop(void) {

  u8g.firstPage(); // Sélectionne la 1er page mémoire de l'écran
  do {
    draw(); // Redessine tout l'écran
  }
  while(u8g.nextPage()); // Sélectionne la page mémoire suivante

  /* Delai avant de recommencer */
  delay(100); // delay diminué car temps de convertion trop long et seconde qui saute
  printTime();
}

/* Fonction permettant de redessiner TOUT l'écran */
void draw(void) {
  u8g.setFont(u8g_font_unifont); // Utilise la police de caractère standard
  u8g.drawStr( 44, 13, hourchar); // Affiche les heures
  u8g.drawStr( 58, 13, ":"); // Affiche ":"
  u8g.drawStr( 64, 13, minutechar); // Affiche les minutes
  u8g.drawStr( 4, 64, dayOfWeekchar); // Affiche jour de la semaine
  u8g.drawStr( 32, 64, dayOfMonthchar); // Affiche jour du mois
  u8g.drawStr( 54, 64, monthchar); // Affiche l'année   
  u8g.drawStr( 92, 64, yearchar); // Affiche l'année           
  u8g.drawFrame(44,0,38,16);  // gauche-rec, haut-rec, T rec hori, T rec verti
  // assign default font
  // u8g.setFont(u8g_font_unifont);

  // pointer to strings in flash memory can be stored in a special type
  const __FlashStringHelper *flash_ptr;

  // the result of the F() macro can be assigned to this pointer
  flash_ptr = F("Bonne journee!");

  // this pointer can be used as argument to the draw procedures
  u8g.drawStr( 10+1, 36+1, flash_ptr);
  u8g.drawStr( 10, 36, flash_ptr);

}

void printTime()
{
  clock.getTime();


  sprintf(hourchar,"%02d",clock.hour);  // lieu ; format ; ce que l'on convertie

  sprintf(minutechar,"%02d",clock.minute);   // Minute

  sprintf(secondchar,"%02d",clock.second);  // seconde

  sprintf(monthchar,"%s",clock.month);  //sprintf(monthchar,"%s", monthname[(clock.month)])
 
   switch (clock.month)
   {
   case 1:
   sprintf(monthchar,"JANV");
   break;
   case 2:
   sprintf(monthchar,"FEVR");
   break;
   case 3:
   sprintf(monthchar,"MARS");
   break;
   case 4:
   sprintf(monthchar,"AVRI");
   break;
   case 5:
   sprintf(monthchar,"MAI");
   break;
   case 6:
   sprintf(monthchar,"JUIN");
   break;
   case 7:
   sprintf(monthchar,"JUIL");
   break;
   case 8:
   sprintf(monthchar,"AOUT");
   break;
   case 9:
   sprintf(monthchar,"SEPT");
   break;
   case 10:
   sprintf(monthchar,"OCTO");
   break;
   case 11:
   sprintf(monthchar,"NOVE");
   break;
   case 12:
   sprintf(monthchar,"DECE");
   break;
   }

  sprintf(dayOfMonthchar,"%02d",clock.dayOfMonth); // jour du mois

  sprintf(yearchar,"%d",clock.year+2000); // année

  switch (clock.dayOfWeek)// Friendly printout the weekday
  {
  case MON:

    sprintf(dayOfWeekchar,"LUN");
    break;
  case TUE:
    sprintf(dayOfWeekchar,"MAR");
    break;
  case WED:
    sprintf(dayOfWeekchar,"MER");
    break;
  case THU:
    sprintf(dayOfWeekchar,"JEU");
    break;
  case FRI:
    sprintf(dayOfWeekchar,"VEN");
    break;
  case SAT:
    sprintf(dayOfWeekchar,"SAM");
    break;
  case SUN:
    sprintf(dayOfWeekchar,"DIM");
    break;
  }

}



Go Up