voila je suis debutant et je souhaite faire un chrono avec les fonctions suivantes :
bouton start : lance le chrono
bouton stop : Met en pause le chrono (garde la valeur et l affiche)
bouton start : relance le chrono depuis cette valeur
bouton reset : remet la valeur a zero
Lisez les règles du forum pour poster... et ne postez pas des bouts de programme... comment voulez vous qu'on sache ce que if (Button() == 1){veut dire par exemple ?
les temps doivent être des unsigned long pas des long
j'espère que vous ne le faites pas trop souvent sinon vous allez flinguer l'EEPROM de votre arduino
EEPROM.write(0, S2);
EEPROM.write(1, M);
(et regardez la doc de write pour voir ce qui va être écrit... préférez put() et get() )
———
corrigez votre post ci dessus et rajoutez les code tags autour du code: [code]`` [color=blue]// votre code ici[/color] ``[/code].
ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)
apres avoir suivi les conseils, voici le code mais je ne sais pas comment incrémenter la dernière valeur .
long Chrono_M(){
unsigned long S;
unsigned long M;
unsigned long MS;
if (Button() == 1){
MS = millis() - start_Time;
S = ((MS / 1000) % 60);
M = (MS / 1000) / 60;
display.setCursor(95,17);
display.print(S);
display.setCursor(80,17);
display.print("'");
display.setCursor(65,17);
display.print(M);
EEPROM.update(0, S);
EEPROM.update(1, M);
}
else {
display.setCursor(95,17);
display.print(EEPROM.get(0, S));
display.setCursor(80,17);
display.print("'");
display.setCursor(65,17);
display.print(EEPROM.get(1, M));
start_Time = millis();
}
}
je m explique : je reste appuyer sur le bouton start, le chrono démarre, je relâche le bouton la valeur du chrono est stockée (ex: 20 s) puis lorsque j appuie de nouveau sur le bouton, la valeur continue à défiler depuis 20 s.
S et M vont prendre 4 octets. Vous ne pouvez pas écrire S en 0 (donc les données vont en 0, 1,2 et 3) et ensuite M en 1 (donc les données vont en 1,2,3 et 4) --> ça va écraser vos données
EEPROM.update(0, S);
EEPROM.update(1, M);
il faut les mettre aux adresses 0 et 4 ou les regrouper dans une structure et écrire la structure.
Mais le plus simple c'est de mettre MS en mémoire EEPROM puisque vous savez régénérer S et M depuis cette valeur.
je ne sais pas à quelle fréquence vous allez appeler cette fonction, mais rappellez vous que vous ne pouvez écrire que 100,000 fois une case EEPROM. ça a l'air bcp comme cela, mais si vous laissez tourner votre fonction dans la loop et l'appelez 100 fois par seconde, en moins de 20 minutes vous avez flingué ces cases mémoire EEPROM.
à quoi ça sert de mémoriser cela en EEPROM ? vous comptez couper le courant ensuite et avez besoin de la dernière lecture ?
Merci J-M-L , ah ok je commence à comprendre le principe des adresses lors de l écriture / lecture.
Non je n'ai pas forcement besoin de sauvegarder cette valeur après coupure d alimentation mais je ne vois pas comment faire autrement pour stocker la valeur du chrono , la rappeler pour continuer ?
yoda87:
Non je n'ai pas forcement besoin de sauvegarder cette valeur après coupure d alimentation mais je ne vois pas comment faire autrement pour stocker la valeur du chrono , la rappeler pour continuer ?
--> utilisez une variable globale. Lisez un peu sur le 'scope' (la portée, la durée de vie) des variables.
Quand vous déclarez une variable GLOBALE (en dehors d'une fonction). La durée de vie de cette variable c'est la durée de vie du code - c'est à dire tant que la carte est alimentée.
par exemple dans ce code, t0 est une variable globale, à chaque fois que je vais dans la fonction tictac() je retrouve la valeur précédente
unsigned long t0; // variable globale
void tictac()
{
t0++; // on incrémente t0 - c'est pareil que t0 = t0 + 1;
Serial.println(t0);
}
void setup()
{
Serial.begin(115200);
t0 = 0;
}
void loop()
{
tictac();
delay(1000);
}
si vous faites tourner ce code vous verrez dans la console (ouverte à 115200 bauds) les secondes défiler