il y a 6 ans
Voici une application que vous pouvez réutiliser dans vos jeux !
Elle permet de mesurer le temps, oui c'est un chronomètre.
Attention cependant se n'est pas aussi fiable qu'un vrai chronomètre : ne mesurez donc pas un marathon ou une course quelconque !
Voici deux visuels possibles :
Bouton A
Bouton B
Comme dit dans le code : l'application a une limite, qui est je pense acceptable.
En effet, on peut mesurer "seulement" une durée de : 49710 jours, 6 heures, 28 minutes et 15 secondes, ou approximativement 136 années *, 70 jours, 6 heures, 28 minutes et 15 secondes.
* Pour cette approximation on considère qu'une année est égale 365 jours.
Plus d'info sur mon GitHub.
v3.0.0
Le chronomètre utilise désormais le système RTC.
Merci à deeph, Aurélien Rodot et jicehel : pour avoir soumis l'idée du RTC et proposer un exemple d'application.
Bugs connus de la version :
v2.0.0
Le chronomètre est désormais plus fiable. Et l'interface est traduite en anglais.
Bugs connus de la version :
v1.0.0
Le chronomètre est peu fiable.
PS : pour mon prochain jeu, les tours de Hanoï, qui est terminé, j'ai envie de mesurer le temps des parties pour faire un tableau des meilleurs scores, ce qui explique la création de cette application.
NEW il y a 6 ans
Cool mais tu devrais carrément utiliser le RTC (HTR en Français) puisque c'est exactement fait pour ça (en plus d'être bien plus précis) : https://www.arduino.cc/en/Reference/RTC
NEW il y a 6 ans
Merci pour l'info.
J'ai fait une v2 qui améliore la précision, j'utilise désormais millis() pour faire mes calculs.
Aurélien Rodot
il y a 6 ans
Attention millis() est basé sur des interruptions, donc il peut y avoir un glissement dans le temps car les interruptions sont parfois désactivées lors d'opérations mémoire critiques (DMA...). En effet le RTC n'aurait pas ce problème, et il y a même une library toute faite comme le montre deeph :)
NEW il y a 6 ans
Attention millis() est basé sur des interruptions, donc il peut y avoir un glissement dans le temps car les interruptions sont parfois désactivées lors d'opérations mémoire critiques (DMA...). En effet le RTC n'aurait pas ce problème, et il y a même une library toute faite comme le montre deeph :)
NEW il y a 6 ans
Merci pour ces informations, j'ignorai le fonctionnement de millis. Je ferais une v3 dès que possible.
NEW il y a 6 ans
Après ça reste quand même précis et c'est super simple à utiliser, les deux sont valables :)
NEW il y a 6 ans
J'ai essayé comme ça:
/* Demonstrates the use of the RTC library */ #include <RTCZero.h> #include <Gamebuino-Meta.h> /* Create an rtc object */ RTCZero rtc; /* Change these values to set the current initial time */ const byte seconds = 00; const byte minutes = 15; const byte hours = 23; /* Change these values to set the current initial date */ const byte day = 9; const byte month = 10; const byte year = 18; // Procédure de setup où pour le moment, on initialise juste la META void setup() { gb.begin(); Serial.begin(9600); rtc.begin(); // initialize RTC // Set the time rtc.setHours(hours); rtc.setMinutes(minutes); rtc.setSeconds(seconds); // Set the date rtc.setDay(day); rtc.setMonth(month); rtc.setYear(year); // you can use also //rtc.setTime(hours, minutes, seconds); //rtc.setDate(day, month, year); } void Serialprint2digits(int number) { if (number < 10) { Serial.print("0"); // print a 0 before if the number is < than 10 } Serial.print(number); } void Print2digits(int number) { if (number < 10) { gb.display.print("0"); // print a 0 before if the number is < than 10 } gb.display.print(number); } // Boucle principale, dans laquelle on va déplacer rect1 avec les touches et vérifier s'il rentre en collision avec rect void loop() { while (!gb.update()); gb.display.clear(); // Print date... gb.display.cursorX = 15; gb.display.cursorY = 5; Serialprint2digits(rtc.getDay()); Print2digits(rtc.getDay()); Serial.print("/"); gb.display.print("/"); Serialprint2digits(rtc.getMonth()); Print2digits(rtc.getMonth()); Serial.print("/"); gb.display.print("/"); Serialprint2digits(rtc.getYear()); Print2digits(rtc.getYear()); Serial.print(" "); gb.display.print(" "); // ...and time Serialprint2digits(rtc.getHours()); Print2digits(rtc.getHours()); Serial.print(":"); gb.display.print(":"); Serialprint2digits(rtc.getMinutes()); Print2digits(rtc.getMinutes()); Serial.print(":"); gb.display.print(":"); Serialprint2digits(rtc.getSeconds()); Print2digits(rtc.getSeconds()); Serial.println(); gb.display.println(); delay(1000); }
Mais j'obtient un écran blanc su la META, j'ai merdé quelque part mais pas assez callé pour voir où...
NEW il y a 6 ans
Je me suis encore fait avoir par le Serial au lieu de mettre le SerialUSB ...
Ce programme fonctionne:
/* Demonstrates the use of the RTC library */ #include <Gamebuino-Meta.h> #include <RTCZero.h> /* Create an rtc object */ RTCZero rtc; /* Change these values to set the current initial time */ const byte seconds = 00; const byte minutes = 11; const byte hours = 22; /* Change these values to set the current initial date */ const byte day = 11; const byte month = 10; const byte year = 18; // Procédure de setup où pour le moment, on initialise juste la META void setup() { gb.begin(); SerialUSB.begin(9600); rtc.begin(); // initialize RTC // Set the time rtc.setHours(hours); rtc.setMinutes(minutes); rtc.setSeconds(seconds); // Set the date rtc.setDay(day); rtc.setMonth(month); rtc.setYear(year); // you can use also //rtc.setTime(hours, minutes, seconds); //rtc.setDate(day, month, year); } void SerialUSBprint2digits(int number) { if (number < 10) { SerialUSB.print("0"); // print a 0 before if the number is < than 10 } SerialUSB.print(number); } void Print2digits(int number) { if (number < 10) { gb.display.print("0"); // print a 0 before if the number is < than 10 } gb.display.print(number); } // Boucle principale, dans laquelle on affiche l'heure toutes les secondes void loop() { while (!gb.update()); gb.display.clear(); // Print date... gb.display.cursorX = 5; gb.display.cursorY = 5; SerialUSBprint2digits(rtc.getDay()); Print2digits(rtc.getDay()); SerialUSB.print("/"); gb.display.print("/"); SerialUSBprint2digits(rtc.getMonth()); Print2digits(rtc.getMonth()); SerialUSB.print("/"); gb.display.print("/"); SerialUSBprint2digits(rtc.getYear()); Print2digits(rtc.getYear()); SerialUSB.print(" "); gb.display.print(" "); // ...and time SerialUSBprint2digits(rtc.getHours()); Print2digits(rtc.getHours()); SerialUSB.print(":"); gb.display.print(":"); SerialUSBprint2digits(rtc.getMinutes()); Print2digits(rtc.getMinutes()); SerialUSB.print(":"); gb.display.print(":"); SerialUSBprint2digits(rtc.getSeconds()); Print2digits(rtc.getSeconds()); SerialUSB.println(); gb.display.println(); delay(1000); }