DF Robot LedKeypad Shield: besoin d'aide pour afficher HH.MM

Bonjour,

Cela fait plusieurs jours que je bute sur la manière de faire fonctionner un shield LedKeypad Shield acheté chez DF robot:

https://www.dfrobot.com/wiki/index.php/LED_Keypad_Shield_V1.0_SKU:DFR0382

Le code d’exemple proposée avec la bibliothèques fonctionne (les chiffres led s’allument et varient selon les actions sur les Bp associés)

De mon coté, je souhaite parvenir à afficher l’heure sur celui-ci.

  • Pour le obtenir l’heure, j’utilise une RTC DS1307 => la date s’affiche correctement dans le moniteur série

  • l’heure et les minutes sont (je pense?) bien séparées en 4 digits dans les char HHmm[ 0] à [3] (visibles aussi dans le moniteur…)

Mais sur les 4 digits Leds, rien ne s’affiche???

Je pressent que la clé du problème doit se trouver dans le format de la variable à afficher mais étant vraiment débutant en programmation, je ne m’en sort pas…

Voici le code que j’essaie de modifier au grès de mes lectures sur le net, mais sans grand sucé…

//Reveil LED.ino

// definitions pour LCD
#include <Wire.h>
#include <LedKeypad.h>

//Definitions pour RTC
#include "DS1307.h"

char brightness =0;
char buf[5]="2456";
char HHmm[5]="1234";

DS1307 clock;//define a object of DS1307 class

void setup() {
  Wire.begin(); //Join the bus as master
  ///set up of RTC   A Laisser en commentaire sauf lorsqu'on veut régler l'heure 
  clock.begin();
  clock.fillByYMD(2017,1,28);    //Jan 28,2017
  clock.fillByHMS(23,26,00);     //23:26 00"
  clock.fillDayOfWeek(SAT);      //Saturday
  clock.setTime();               //write time to the RTC chip */
  // demarre le port serie
  Serial.begin(9600); 

  ledkeypad.begin(); /*Enable*/
  ledkeypad.setBrightness(3);/*Sets the brightness level*/
  ledkeypad.display(2015);/*Display data*/  
  }


void loop() {


printTime();
delay(1000);

HHmm[0] = (clock.hour / 10);
HHmm[1] = (clock.hour % 10);
HHmm[2] = (clock.minute / 10);
HHmm[3] = (clock.minute % 10);


ledkeypad.display(0,HHmm[0]);
delay(200);
ledkeypad.display(1,HHmm[1]);
delay(200); 
ledkeypad.display(2,HHmm[2]);
delay(200);
ledkeypad.display(3,HHmm[3]);
delay(200);

Serial.print(HHmm[0],DEC);
Serial.print(HHmm[1],DEC);
Serial.print(":");
Serial.print(HHmm[2],DEC);
Serial.print(HHmm[3],DEC);
Serial.println(" ");

}
/*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(" ");
}

Tout aide sera la bienvenue pour m’aider à donner vie à ces afficheurs et m’éclairer sur ce que je fais mal (ou voire ce que je n’ai pas fait du tout?)

Un grand merci d’avance et au plaisir de vous lire

Bonjour et bienvenu

Tu as déjà trouvé le problème : le format de ce que tu envoies à l’afficheur.

Tu as une table de CHAR que tu essaies d’afficher. Or ,la librairie attend des nombres de 0 à 9…

Il te faut convertir tes CHAR en DEC… Un CHAR est le code du caractères ASCII à afficher.
En regardant une table ASCII, tu verras que 0 correspond à 48 , 1 à 49 … ET 9 à 57.

La conversion de CHAR vers DEC revient donc à soustraire 48 au CHAR…

C’est un bon exercice de programmation… :wink:

Pierre

Bonjour petrusfr,

merci de te pencher sur mon triste sort :slight_smile:
Mon problème doit sans doute être multiple, car comme tu as sans doute pus le voir, lors de l’initialisation du programme il y a une ligne(ledkeypad.display(2015);/Display data/), qui devrait a minima afficher les chiffres “2015” durant quelques secondes, hors il ne se passe strictement rien… ?

concernant le format attendu voici l’extrait de la librairie qui donne les variable de temps:

/****************************************************************/
/*Function: Read time and date from RTC	*/
void DS1307::getTime()
{
    // Reset the register pointer
	Wire.beginTransmission(DS1307_I2C_ADDRESS);
	Wire.write((uint8_t)0x00);
	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());
}

Suis-je dans le faux si j’en déduit que les variables seconde, minute, hour, etc. sont des décimaux?

et du coté de la librairie de l’afficheur, si j’utilise la fonction LedKeypad.display(int addr,char data)

/*!
* @brief Display character
*
* @brief  Display character
*
* @return void
*/
void LedKeypad::display(int addr,char data)
{
	unsigned char i = 1;
	i <<= addr;
	data = letterTransform(data);
	Serial.println(dotFlag);
	ledByteVal_[addr]=data;
	if(i&dotFlag){
		tm1650Send(ledByte[addr],ledVal[data]+0x80);
	}else{
		tm1650Send(ledByte[addr],ledVal[data]);
	}	
	
}

il faudrait alors que chaque digit soit exprimé individuellement en ASCII ?
soit par exemple 2 heure = 2+48 (50 en ASCII)

Merci d’avance pour les éclaircissements…
Stéphane

Re ...

En effet, je n'avais pas bien regardé le programme d'exemple.

Ce sont bien des caractères ASCII qui sont envoyer à l'afficheur...

.
buf[0]++;
if(buf[0] > '9')
buf[0] = '0';

Je n'avais pas vu les apostrophes : bien sur , '9' est bien la représentation ASCI de 9.

De plus, le fait que 2015 ne s'affiche pas confirme l'attente de caractères ASCII...

Il ne te reste plus qu'a convertir tes chiffres en leurs équivalents ASCII.

Pierre

Bonjour,

Merci petrusfr pour m’avoir éclairci les idées sur les formats de données à utiliser…

Cependant, après avoir encore passé des heures avec mon bout de code sans succès je me suis dit que peut-être il y avait incompatibilité entre les diverses librairies auquel je faisait appel pour la RTC, et j’ai utilisé une autre façon de compter le temps qui passe, en utilisant TimerOne.h.

Et là par miracle, tout l’affichage qui restait obstinément noir s’est enfin éclairé!

Pour être précis cela à fonctionné à partir du moment ou j’ai retiré du code la ligne Wire.begin()

voici le code qui fonctionne:

/HorlogeSansRTC.ino
#include <TimerOne.h>
#include <LedKeypad.h>
#define ON 1
#define OFF 0

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
unsigned char second;
unsigned char minute = 0;
unsigned char hour = 12;
char brightness =0;
char HHmm[4]="1234";



void setup()
{
  
  // demarre le port serie
  Serial.begin(9600); 
  ledkeypad.begin(); /*Enable*/
  ledkeypad.setBrightness(0);/*Sets the brightness level*/
  ledkeypad.display(2015);/*Display data*/
  delay(5000);
  Timer1.initialize(500000);//timing for 500ms
  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR  
}
void loop()
{
  if(Update == ON)
  {
    TimeUpdate();

    HHmm[0] = hour / 10;
  	HHmm[1] = hour % 10;
  	HHmm[2] = minute / 10;
  	HHmm[3] = minute % 10;



    ledkeypad.display(HHmm);
    Serial.print(TimeDisp[0]);
    Serial.print(TimeDisp[1]);
    Serial.print(TimeDisp[2]);
    Serial.print(TimeDisp[3]);
    Serial.println();

  }
  
}
void TimingISR()
{
  halfsecond ++;
  Update = ON;
  if(halfsecond == 2){
    second ++;
    if(second == 60)
    {
      minute ++;
      if(minute == 60)
      {
        hour ++;
        if(hour == 24)hour = 0;
        minute = 0;
      }
      second = 0;
    }
    halfsecond = 0;  
  }
 //Serial.println(second);
  ClockPoint = (~ClockPoint) & 0x01;
}
void TimeUpdate(void)
{
  if(ClockPoint)ledkeypad.dotShow(1);
  else ledkeypad.dotVanish(1); 
  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;
  Update = OFF;
}

Je suis content que le soucis soit identifié mais j’aimerais bien comprendre comment faire pour que ce shield “Afficheur et BPs” puisse fonctionner avec un autre périphérique I2C???

Parce que sans cela il est quasi inutile…

Merci pour vos idées avis