Compte à rebours Arduino

a marqué ce sujet comme résolu.

Bonjour, j’ai réalisé un compte à rebours Arduino avec l’aide d’une personne, car j’en avais besoin rapidement.

Malheureusement, je ne comprends pas tout ce code et la personne ne peut plus m’aider.

Je ne comprends pas la fonction de Halfsecond, cette variable sert à quoi puisque c’est en seconde et minute ? Pouvez vous m’expliquer comment fonction le void TimingISR() ? J’y comprends vraiment rien, alors que tout le décompte se fait là :( Et juste après il y a encore le halfsecond, mais là je suis vraiment perdu si l’intérêt de ce calcul.

Merci beaucoup

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
//********************************************************
// Afficheur 4 chiffres 7 segments
// avec Driver TM1637 et Arduino
// demo_7segment_i2c_clock
//
// Affiche une horloge 12:00 sous format hh:mm ou mm:ss
//
//********************************************************

#include <TimerOne.h>
#include "TM1637.h" //librairie du driver du 7 segments
#define ON 1
#define OFF 0
#define hhmm 1 //0 pour afficher HH:MM et 1 pour MM:SS

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00}; //Tableau des 4 chiffres
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 2;
unsigned char second = 30;
unsigned char _second;
unsigned char minute = 1;
unsigned char _minute = 0;
unsigned char hour = 12; //Heure 12:00:00 pour initialiser
boolean Flag_ReadTime;
signed char temps = 90;
int b_start;
boolean etat_start; //Etat
int b_pause;
boolean etat_pause;
int b_reset;
boolean etat_reset;

// branchement I2C sur CLK -> pinA5 et DIO -->Pin A4
#define CLK 2
#define DIO 3 //3
TM1637 tm1637(CLK,DIO); //Objet tm1637

void setup()
{
Serial.begin(9600);
tm1637.set(2); //0 éclairage faible réglable jusqu'à 7 le plus intense
tm1637.init(); //Initialisation du driver
tm1637.point(POINT_ON);
//Affichage de départ ABCD (le module peut afficher abcdef)
//TimeDisp[0] = 10; //Affichage a
//TimeDisp[1] = 11; //b
//TimeDisp[2] = 12; //c
//TimeDisp[3] = 13; //d
//tm1637.display(TimeDisp);
//delay(5000); //Pendant 5 sec

//Horloge mise à jour 2 fois par seconde pour faire clignotter le :
Timer1.initialize(500000); // timing pour 500ms
Timer1.attachInterrupt(TimingISR); //declare l'interruption qui déclenche TimingISR
Serial.println("Please send command to control the stopwatch:");
Serial.println("S - start");
Serial.println("P - pause");
Serial.println("R - reset");
stopwatchPause();

// Bouton chrono
b_start = 8;
etat_start = 0;
b_pause = 9;
etat_pause = 0;
b_reset = 10;
etat_reset = 0;

// définition des modes
pinMode(b_start, INPUT_PULLUP);
pinMode(b_pause, INPUT_PULLUP);
pinMode(b_reset, INPUT_PULLUP);
}


void loop()
{
// Déclenchement chrono/pause/reset
 etat_start = digitalRead(b_start); 
    if(etat_start == LOW) 
    {
        stopwatchStart(); 
    }

 etat_pause = digitalRead(b_pause); 
    if(etat_pause == LOW) 
    {
        stopwatchPause(); 
    }

 etat_reset = digitalRead(b_reset); 
    if(b_reset == LOW) 
    {
        stopwatchReset(); 
    }

  //Commande chrono
char command;
command = Serial.read();

switch(command)
{
//case 'S':stopwatchStart();Serial.println("Start timing...");break;
//case 'P':stopwatchPause();Serial.println("Stopwatch was paused");break;
case 'R':stopwatchReset();Serial.println("Stopwatch was reset");break;
default:break;
}
if(Update == ON)
{
TimeUpdate();
tm1637.display(TimeDisp);
}
}


 /* void TimingISR()
    {
      halfsecond --;
      Update = ON;
      if(halfsecond <= 0)
      {
        second --;
        if(second <= 0 )
        {
          minute --;
          if (minute >= 0)
          /*{
            hour --;
            if(hour <= 0)hour = 0;
            minute = 59;
          }
          minute=0; second = 60;
        }
        halfsecond = 2; 
      }*/
   void TimingISR()
{
  halfsecond --;
  Update = ON;
  if (halfsecond <= 0)
  {
    temps = max(temps-1,0);
    second  = temps%59;
    minute = temps/59;
    halfsecond = 2;
  }
 // Serial.println(second);
      ClockPoint = (~ClockPoint) & 0x01;
      if(Flag_ReadTime == 0)
    {
      _second = second;
      _minute = minute;
    }
  }

void TimeUpdate(void)
{
if(ClockPoint)tm1637.point(POINT_ON);
else tm1637.point(POINT_OFF); //OFF Pour clignotement
if (hhmm==0)
{
TimeDisp[0] = hour / 10; //Affichage hh:mm
TimeDisp[1] = hour % 10;
TimeDisp[2] = minute / 10;
TimeDisp[3] = minute % 10;
}
else
{
//Affichage mm:ss
TimeDisp[0] = minute / 10; //Affichage hh:mm
TimeDisp[1] = minute % 10;
TimeDisp[2] = second / 10;
TimeDisp[3] = second % 10;
}
Update = OFF;
}

void stopwatchStart()//timer1 on
{
Flag_ReadTime = 0;
TCCR1B |= Timer1.clockSelectBits;
}
void stopwatchPause()//timer1 off if [CS12 CS11 CS10] is [0 0 0].
{
TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));
}
void stopwatchReset()
{
stopwatchPause();
Flag_ReadTime = 0;
_second = 0;
_minute = 0;
second = 30;
minute = 1;
temps = 90;
Update = ON;
}
+0 -0

Le TimingISR est la fonction qui se déclenche lorsque le Timer a fini de s’écouler. Je suppose vu le nom que ce timer doit se déclencher toutes les 0.5 secondes. Et enfin, j’ai l’impression que c’est sur cette fréquence afin de simplement faire clignoter un point lumnineux (qui aura ainsi une période d’une seconde).

+0 -0

C’est un compte à rebours avec un afficheur 4 digits 7 segments.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/* void TimingISR()
    {
      halfsecond --;
      Update = ON;
      if(halfsecond <= 0)
      {
        second --;
        if(second <= 0 )
        {
          minute --;
          if (minute >= 0)
          /*{
            hour --;
            if(hour <= 0)hour = 0;
            minute = 59;
          }
          minute=0; second = 60;
        }
        halfsecond = 2; 
      }*/
   void TimingISR()

Ce que je n’arrive pas à comprendre pourquoi il y a une fonction halfsecond ? Pourquoi ne pas décrémenter directement les secondes ?? Et pourquoi halsecond = 2 ?

1
2
3
4
5
//Affichage mm:ss
TimeDisp[0] = minute / 10; //Affichage hh:mm
TimeDisp[1] = minute % 10;
TimeDisp[2] = second / 10;
TimeDisp[3] = second % 10;

Sur cette partie qu’est ce que ca veut dire /10 et %10 ??

Merci de l’aide

J’ai déjà répondu à tes questions…

pourquoi il y a une fonction halfsecond

Et enfin, j’ai l’impression que c’est sur cette fréquence afin de simplement faire clignoter un point lumnineux

Pourquoi ne pas décrémenter directement les secondes ?? Et pourquoi halsecond = 2

cf ci-dessus. Ca permet de compter qu’une interruption sur deux.

Sur cette partie qu’est ce que ca veut dire /10 et %10 ??

https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/742_decouverte-de-larduino/3418_le-langage-arduino-12/#2-10789_les-variables

+0 -0

Merci, je viens de comprendre. On divise la seconde par deux pour pouvoir faire clignoter les deux points du chrono.

Par contre j’avais déjà regardé ton tutoriel sur la division et le modulo. Je ne comprends par pourquoi on divise par 10 le premier chiffre et modulo par 10 sur le second. C’est un mystère. :D

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte