[1er Projet] Horloge Pong modifié

^^ ^^ Voici une partie de mon programme :roll_eyes:

Alors la fonction qui marche : switch_mode()

void switch_mode() {
  char* modes[] = {    "Classic", "Rgl Heure", "Test"            };
  int nbr_mode=3; // Variable qui indique le nombre de mode dans le menu. A incrementé si besoin.

  flagMenu=1; 

  if(menuCompt<80) {
    //si appui sur boutonA , change le mode
    if(boutonA.uniquePress()){
      menuCompt=0;
      curseur_mode++;
      if(curseur_mode>=nbr_mode){
        curseur_mode=0;
      }
    }


    //Affichage du mode actuel sur la premiére ligne, et le mode suivant sur la ligne suivante
    ledMatrix.setfont(3);
    int len = strlen(modes[curseur_mode]);
    //char toto[len]=(char) modes[curseur_mode];
    for (int i=0; i<len; i++)
    {
      ledMatrix.putchar((5+i*5),0,modes[curseur_mode][i],1);
    }
    ledMatrix.putchar(0,0,'>',3);

    // Afiichage Deuxieme ligne
    if(curseur_mode+1>=nbr_mode)
    {
      len = strlen(modes[0]);
      for (int i=0; i<len; i++)
      {
        ledMatrix.putchar((5+i*5),8,modes[0][i],1);
      }
    }
    else{
      len = strlen(modes[curseur_mode+1]);
      for (int i=0; i<len; i++)
      {
        ledMatrix.putchar((5+i*5),8,modes[curseur_mode+1][i],1);
      }
    }
    menuCompt++;
  }
  else
  {
    menuCompt=0;
    flagMenu=0;
  }
}

Et sa copie qui ne marche pas : set_time()

void set_time() // Réglage de la date et heure
{
  char* rgldate[] = {"Jour", "Date", "Mois", "Annee", "Heure", "Min", "Sec", "Valider", "Retour"};
  int ligne_rgl=9; // Variable qui indique le nombre de ligne dans ce sous-menu. A incrementé si besoin.
  
  //Ci-dessous je transforme les variables de l'heure en 'char' et je met tout dans le tableau heure[]
  char* heure[7];
  itoa(jour,heure[0],10);
  if (jour < 10) {
    heure[0][1] = heure[0][0];
    heure[0][0] = '0';
  }
  itoa(date,heure[1],10);
  if (date < 10) {
    heure[1][1] = heure[1][0];
    heure[1][0] = '0';
  }
  itoa(mois,heure[2],10);
  if (mois < 10) {
    heure[2][1] = heure[2][0];
    heure[2][0] = '0';
  }
  itoa(annee,heure[3],10);
  if (annee < 10) {
    heure[3][1] = heure[3][0];
    heure[3][0] = '0';
  }
  itoa(hours,heure[4],10);
  if (hours < 10) {
    heure[4][1] = heure[4][0];
    heure[4][0] = '0';
  }
  itoa(mins,heure[5],10);
  if (mins < 10) {
    heure[5][1] = heure[5][0];
    heure[5][0] = '0';
  }
  itoa(sec,heure[6],10);
  if (sec < 10) {
    heure[6][1] = heure[6][0];
    heure[6][0] = '0';
  }
 

    //si appui sur boutonA , change le mode
    if(boutonA.uniquePress()){
      curseur_rgldate++;
     
    }
     if(curseur_rgldate==7){
        curseur_rgldate=0;
        Serial.println(curseur_rgldate);
      }


    //Affichage du mode actuel sur la premiére ligne, et le mode suivant sur la ligne suivante
    ledMatrix.setfont(3);
    
    ledMatrix.putchar(0,0,'>',3);
    
    int len = strlen(rgldate[curseur_rgldate]);
    for (int i=0; i<len; i++)
    {
      ledMatrix.putchar((5+i*5),0,rgldate[curseur_rgldate][i],1);     
    }
    if(curseur_rgldate<7) {
        ledMatrix.putchar(47,0,'0',2);
        ledMatrix.putchar(55,0,'1',2);  
      
//      ledMatrix.putchar(47,0,heure[curseur_rgldate][0],2); // Ne marche pas affiche un 'v'
//      ledMatrix.putchar(55,0,heure[curseur_rgldate][1],2); // Ne marche pas affiche un '0'
    }
    

    // Afiichage Deuxieme ligne
    if(curseur_rgldate+1>=ligne_rgl) // Si curseur sur dernier choix alors affiche en 2eme ligne le premier choix 
    {
      len = strlen(rgldate[0]);
      for (int i=0; i<len; i++)
      {
        ledMatrix.putchar((5+i*5),8,rgldate[0][i],1);
      }
    }
    else{
      len = strlen(rgldate[curseur_rgldate+1]);
      for (int i=0; i<len; i++)
      {
        ledMatrix.putchar((5+i*5),8,rgldate[curseur_rgldate+1][i],1);
      }
    }
}

Je reste à votre disposition pour toutes questions ou critique sur mon code. :fearful:

Bon j'ai contourné mon probleme en créant un nouveau type de menu, avant j'ait un menu comme le code de la pongClock :

Classic
Rgl Heure

Test

Sachant que je n'affiche que les 2 premiere lignes, chaque appui sur le bouton Menu fesai monté la deuxieme ligne sur la premiere...ect...

Mon nouveau Menu :

1 - 2 - 3
Classic

Rgl Heure
Test

J'affiche les 2 première ligne, chaque appui sur le bouton (< ou >) fait passé à droite ou gauche la surbrillance rouge du chiffre, et affiche en deuxième ligne le nom du choix, sélect pour valider. Je compte remplacer les chiffres par des icones via une nouvelle police dédié.

void switch_mode() //Affiche menu 
{
  char* modes[] = {
    "Classic", "Rgl Heure", "Test"              };
  int nbr_mode=3; // Variable qui indique le nombre de mode dans le menu. A incrementé si besoin.

  flagMenu=1; 

  if(menuCompt<200) {
    //si appui sur boutonB (+) , passe au mode suivant
    if(boutonB.uniquePress()){
      menuCompt=0;
      curseur_mode++;
      if(curseur_mode>=nbr_mode){
        curseur_mode=0;
      }
    }
    
    //si appui sur boutonC (-) , passe au mode suivant
    if(boutonC.uniquePress()){
      menuCompt=0;
      curseur_mode--;
      if(curseur_mode<0){
        curseur_mode=nbr_mode-1;
      }
    }
    if(boutonA.uniquePress()){
      mode=curseur_mode;
      menuCompt=0;
      flagMenu=0;
      return;
    }


    
    ledMatrix.setfont(3); // reglage police en 5x8
    
    // Affichage de la premiére ligne avec icone de selection
    ledMatrix.putchar(11,0,'-',1);
    ledMatrix.putchar(23,0,'-',1); //x+6
    switch(curseur_mode){
      case 0: 
      ledMatrix.putchar(5,0,'1',2);
      ledMatrix.putchar(17,0,'2',1); //x+12
      ledMatrix.putchar(29,0,'3',1); //x+12
      break;
      
      case 1: 
      ledMatrix.putchar(5,0,'1',1);
      ledMatrix.putchar(17,0,'2',2); //x+12
      ledMatrix.putchar(29,0,'3',1); //x+12
      break;
      
      case 2: 
      ledMatrix.putchar(5,0,'1',1);
      ledMatrix.putchar(17,0,'2',1); //x+12
      ledMatrix.putchar(29,0,'3',2); //x+12
      break;
    }

    ledMatrix.setfont(4); // reglage police en 5x7W
    //Affichage du mode actuel sur la deuxieme ligne
    int len = strlen(modes[curseur_mode]);
    //char toto[len]=(char) modes[curseur_mode];
    for (int i=0; i<len; i++)
    {
      ledMatrix.putchar((5+i*6),8,modes[curseur_mode][i],1);
    }
    menuCompt++;
  }
  else
  {
    menuCompt=0;
    flagMenu=0;
  }
}

Je refléchie à la présentation des sous menu reglages divers, réglage Date/Heure... :%

Bonsoir à tous,

Comme d'habitude je met à jour mon post pour signaler mes problemes... :blush:

Voici sur quoi je butte depuis quelques jour.
Mon code avec uniquement la Matrice Led sur le SPI fonctionne.
Un Code exemple Ethernet avec mon module Ethernet sur le SPI fonctionne.
Mon code avec la MatriceLed et Ethernet sur le SPI fonctionne (car je n'appel pas l'ethernet), MAIS si j'ai le malheur de vouloir communiquer avec l'ethernet, ma matrice n'affiche plus rien...

J'ai un conflit sur le SPI...
Voici mes déclaration des modules
MatriceLED :

#include <ht1632c.h>
ht1632c ledMatrix = ht1632c(&PORTB, 6, 2, 1, 3, GEOM_32x16, 2); // 12-51-52-50 Pin 10=53-51-52-12

EthernetShield :

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
setup(){
// start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // print your local IP address:
  Serial.print("My IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print("."); 
  }
}

D'ailleurs maintenant que j'y pense le module ethernet fonctionne dans ce cas vu qu'il me retourne son IP.

Alors j'ai trouvé ça sur la librairie Ethernet :

Arduino communicates with the shield using the SPI bus. This is on digital pins 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used as SS. On the Mega, the hardware SS pin, 53, is not used to select the W5100, but it must be kept as an output or the SPI interface won't work.

Donc il ne faut pas utilisé la PIN 53 du mega mais la déclaré en OUTPUT uniquement, j'ai essayé avec "pinMode(53, OUTPUT);" mais sans succès.

Voilà je sèche... Quelqu'un a t'il une idée...

Promit la prochaine fois que je post, je vous met des photos et vidéo de l'état du projet (enfin quand mon problème sera résolut).

C'est bon je viens de trouver la solution... XD

En fait je pense que j'avais 2 problèmes, le premier c'est que ISP utilisé par la MatriceLed n'est pas le meme que celui du module Ethernet-SD. Le deuxieme c'est les librairie utilisé, je m'explique :
-Pour l'Ethernet on utilise la classe Ethernet.h et SPI.h
-Pour la MatriceLed j'utilise la classe ht1632c.h qui en interne fait appel à la classe stdio.h pour utilise les PIN affecté à la matrice.

En gros le module Ethernet-SD communique avec le SPI en mode standart, et la matrice Led fabrique un port SPI personnalisé pour communiquer avec la Matrice, de ce fait lorsque j'utilisai les 2 sur les meme PIN (sauf CS) sa marchait pas...

Voilà j'ai de ce fait déclaré la Matrice sur le Port L0 L1 L2 et L3. Et sa fonctionne. Du coup me voilà obliger de poster la prochaine fois pour vous montrez l'avancement du projet via photos et p'tit video. :wink:

Comme promit, voici une video :

Ce qui fonctionne :

  • Horloge normal,
  • Horloge Pong,
  • Menu de Sélection,
  • La température interne,
  • Le dialogue avec le module Ethernet,
  • L'ajustement auto de la luminosité de l'affichage en fonction de la lumière ambiante.

Ce qui me reste à faire au minimum :

  • La deuxième sonde de température,
  • Le module µSD pour sauvegarder la Température,
  • La plaque MegaProtoshield pour fixé au propre derrière la Matrice,
  • Le Maj auto de l'heure et de la date via l'Ethernet et le protocole NTP (finit à 70%).

Je reste ouvert au avis (négatif ou positif) et idée