Compteur de points avec un TM1637

Bonjour à tous :slight_smile: ,

Je cherche à réaliser un compteur de points au ping-pong, et pour afficher les points j’utilise un tm1637.

J’aimerai pouvoir afficher les points de cette façon :

Si points < 10 ça donne 1 : 1 (L’espace entre les deux points et le chiffre est important)
Si points > 10 ça donne 10:10

Problème 1 : Quand je suis en dessous de 10 les deux points ne veulent pas s’afficher
Problème 2 : Quand une de mes variables de point passe au dessus de 10, ça ne m’écrit pas 10 mais un A; à 11 un b etc.

Mon code :

#include "TM1637.h"
#define CLK 6       
#define DIO 7
TM1637 tm1637(CLK,DIO);
const int ledP = 2;
const int ledM = 3;
const int BPP = 4;
const int BPM = 5;
int ptsJ1 = 0;
int ptsJ2 = 0;
int fin = 0;

void setup() {
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);
  pinMode(BPP, INPUT_PULLUP);
  pinMode(BPM, INPUT_PULLUP);
  pinMode(ledP, OUTPUT);
  pinMode(ledM, OUTPUT);
  
}

void loop() {
  tm1637.point(POINT_ON);
  victoire();
  
  int test1 = digitalRead(BPP);
  if(test1==LOW)
  {
    delay(100);
    digitalWrite(ledP, HIGH);
    ptsJ1 = ptsJ1 + 1;
    delay(500);
    digitalWrite(ledP, LOW);
    tm1637.display(3,ptsJ1);
    
  }
  int test2 = digitalRead(BPM);
  if(test2==LOW)
  {
    delay(100);
    digitalWrite(ledM, HIGH);
    ptsJ2 = ptsJ2 + 1;
    delay(500);
    digitalWrite(ledM, LOW);
    tm1637.display(0,ptsJ2);
  }
}



/*************************************************************************************************************************/
void victoire() {
  if(ptsJ1 == 11)
  {
   while(fin != 15) //tant que compteur est différent de 15
{
    delay(50);
    digitalWrite(ledP, HIGH);
    delay(50);
    digitalWrite(ledP, LOW);           
    fin ++ ;
}
    ptsJ1 = 0;
    ptsJ2 = 0;
    fin = 0 ;
  }
  
  if(ptsJ2 == 11)
  {
   while(fin != 15) //tant que compteur est différent de 15
{
    delay(50);
    digitalWrite(ledM, HIGH);
    delay(50);
    digitalWrite(ledM, LOW);           
    fin ++ ;
}
    ptsJ1 = 0;
    ptsJ2 = 0;
  
  }
}

Merci d’avance :wink:

Je ne connais pas cette librairie mais elle semble posséder une autre méthode display(), utilisée dans l'exemple ClockDisplay.

Quelle librairie utilisez vous?
Parce que google tm1637 + githib m'en ramène des myriades, et que ma boule de crystal est émoussée...
Il semblerait que vous affichiez en hexadecimal...

hbachetti:
Je ne connais pas cette librairie mais elle semble posséder une autre méthode display(), utilisée dans l’exemple ClockDisplay.

Ah bon ? J’ai le code ici j’ai pas trouvé (A moins que je cherche mal ce qui est fort possible :slight_smile: )

//  Author:Frankie.Chu
//  Date:9 April,2012
//
//  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
//
//  Modified record:
//
/*******************************************************************************/
#include <TimerOne.h>
#include "TM1637.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;


#define CLK 2//pins definitions for TM1637 and can be changed to other ports    
#define DIO 3
TM1637 tm1637(CLK,DIO);

void setup()
{
  tm1637.set();
  tm1637.init();
  Timer1.initialize(500000);//timing for 500ms
  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR  
}
void loop()
{
  if(Update == ON)
  {
    TimeUpdate();
    tm1637.display(TimeDisp);
  }
  
}
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)tm1637.point(POINT_ON);
  else tm1637.point(POINT_OFF); 
  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;
  Update = OFF;
}

dbrion06:
Quelle librairie utilisez vous?
Parce que google tm1637 + githib m’en ramène des myriades, et que ma boule de crystal est émoussée…
Il semblerait que vous affichiez en hexadecimal…

J’utilise celle-là :wink:

Merci

Pour ne pas afficher de l’hexa, cette librairie (qui est celle évoquée par HBachetti) divise par 10 et prend le modulo… voir l’exemple du post 1… (et votre problème est donc à moitié résolu)

Il ne reste plus qu’à trouver comment se code le blanc (espace ’ ') pour avoir un beau format pour les comptages <= 9…

Oui c'est celle-là même : libraries/DigitalTube at master · reeedstudio/libraries · GitHub

Apparemment on peut effacer chaque digit séparément :

 display(0x00,0x7f);
 display(0x01,0x7f);
 display(0x02,0x7f);
 display(0x03,0x7f);

dbrion06:
Pour ne pas afficher de l’hexa, cette librairie (qui est celle évoquée par HBachetti) divise par 10 et prend le modulo… voir l’exemple du post 1… (et votre problème est donc à moitié résolu)

Il ne reste plus qu’à trouver comment se code le blanc (espace ’ ') pour avoir un beau format pour les comptages <= 9…

Si je divise ma variable de point par 10 je pourrai plus détecter si une variable atteint 11 points non ? Ou alors je crée une seconde variable seulement pour l’affichage ? Ou une variable pour compter les dizaines

hbachetti:
Oui c’est celle-là même : libraries/DigitalTube at master · reeedstudio/libraries · GitHub

Apparemment on peut effacer chaque digit séparément :

 display(0x00,0x7f);

display(0x01,0x7f);
display(0x02,0x7f);
display(0x03,0x7f);

Pour l’affichage en dessous de 9 il marche très bien, le problème c’est que les deux points au centre ne veulent plus s’afficher :wink:

PatroCuite:
Si je divise ma variable de point par 10 je pourrai plus détecter si une variable atteint 11 points non ? Ou alors je crée une seconde variable seulement pour l’affichage ? Ou une variable pour compter les dizaines
Pour l’affichage en dessous de 9 il marche très bien, le problème c’est que les deux points au centre ne veulent plus s’afficher :wink:

Après de nombreuses réflexions j’ai enfin compris :wink: Mais le problème c’est que lorsque que je fait ça :

 if (ptsJ1 > 9)
    {
      ptsJ1 = ptsJ1 / 10;
      tm1637.display(2,ptsJ1);
      ptsJ1 = ptsJ1 % 10;
      tm1637.display(3,ptsJ1);
    }

Mon nombre de point va être modifié, et le modulo va être faux par ce que je vais prendre le résultat de ma division faite avant.

Du coup il faudrait afficher le résultat du calcul sans modifier ma variable, je sais pas si c’est possible ::slight_smile:

Bonjour,

Tout simplement

if (ptsJ1 > 9)
   {
     tm1637.display(2,ptsJ1/10);
     tm1637.display(3,ptsJ1%10);
   }

Ou encore mieux

  tm1637.display(3, ptsJ1 % 10);
  if (ptsJ1 > 9)
    tm1637.display(2, ptsJ1 / 10);
  else
    tm1637.display(2, 0x7f);

kamill:
Bonjour,

Tout simplement

if (ptsJ1 > 9)

{
    tm1637.display(2,ptsJ1/10);
    tm1637.display(3,ptsJ1%10);
  }



Ou encore mieux


tm1637.display(3, ptsJ1 % 10);
  if (ptsJ1 > 9)
    tm1637.display(2, ptsJ1 / 10);
  else
    tm1637.display(2, 0x7f);

Merci super ça marche !
Merci à tous ! :slight_smile: