Bonjour , j'ai réalisé un programme (avec l'aide de ChatGPT , car je n'y connait pas grand chose en programmation arduino....) qui pilote un moteur . Tout fonctionne correctement , sauf l'horloge qui prend un retard très important (plusieurs heures par jour...J'ai beau chercher une solution ( sauf peut être avec une synchronisation du temps par internet , mais avec mon matériel c'est impossible...) , je n'arrive pas à solutionner ce problème. Je vous livre ci après le programme , en espérant que que quelqu'un puisse m'éclairer. Je vous remercie d'avance pour votre coopération.
Mon PRG :
#include <BTS7960.h>
#include <OLED_I2C.h>
#include <RTClib.h>
#include <TimeLib.h>
#include <Wire.h>
#include "iarduino_RTC.h"
RTC_Millis RTC;
OLED myOLED(SDA, SCL, 8);
const uint8_t EN = 8;
const uint8_t L_PWM = 9;
const uint8_t R_PWM = 10;
extern uint8_t BigNumbers[];
BTS7960 motorController(EN, L_PWM, R_PWM);
void setup() {
Serial.begin(9600);
RTC.begin(DateTime(__DATE__, __TIME__));
Wire.begin();
myOLED.begin();
// myOLED.setFont(SmallFont);
// obtenir l'heure courante
DateTime now = RTC.now();
// afficher l'heure sur l'écran OLED
myOLED.setFont(BigNumbers);
char dateheure[50];
sprintf(dateheure, "%02d-%02d", now.hour(), now.minute());
myOLED.print(dateheure, 25, 25);
myOLED.update();
}
void loop() {
// obtenir l'heure courante
DateTime now = RTC.now();
// afficher l'heure sur l'écran OLED
myOLED.setFont(BigNumbers);
char dateheure[50];
sprintf(dateheure, "%02d-%02d", now.hour(), now.minute());
myOLED.print(dateheure, 25, 25);
myOLED.update();
// Activer le contrôleur de moteur
motorController.Enable();
// si l'heure est 13h00
if (now.hour() == 13 && now.minute() == 0 && now.second() == 0) {
for (int i = 0; i < 36; i++) {
motorController.TurnLeft(255); // Vitesse maximale
// attendre 10 secondes avant de continuer
unsigned long start_time = millis();
while (millis() - start_time < 10000) {
// attends jusqu'à ce que 10 secondes soient écoulées
}
motorController.Stop();
// attendre 10 minutes avant de continuer
start_time = millis();
while (millis() - start_time < 600000) {
// attends jusqu'à ce que 10 minutes soient écoulées
}
}
}
// si l'heure est 22h00
if (now.hour() == 22 && now.minute() == 0 && now.second() == 0) {
// Faire tourner le moteur dans l'autre sens pendant 60 secondes
motorController.TurnRight(255); // Vitesse maximale
unsigned long start_time = millis();
while (millis() - start_time < 60000) {
// attends jusqu'à ce que 60 secondes soient écoulées
}
// Désactiver le contrôleur de moteur
motorController.Disable();
}
// put your main code here, to run repeatedly:
}```
It looks like your program is trying to control a motor using an Arduino microcontroller and an MPU6050 accelerometer, and also display the current time on an OLED screen. However, it seems like the time is getting out of sync over time.
One potential cause of the time drift could be that the internal clock on the Arduino microcontroller is not accurate. The Arduino microcontroller has a built-in crystal oscillator that is used as the timebase for the clock, but its accuracy may vary depending on the specific board and the manufacturing process.
A solution to this problem could be to use an external real-time clock (RTC) module that has a more accurate clock, like the DS3231. This module uses a temperature-compensated crystal oscillator (TCXO) which provide a much more accurate time.
Another thing you could check is the power supply, since the OLED display and the motor can draw significant current and may cause the voltage to drop, that could affect the internal clock of the microcontroller. Make sure that your power supply can provide enough current for all the devices that you are using.
One more thing, in your current code the OLED display will only show the hour and minutes but not the second, that could affect the overall timekeeping of the clock. If you need the time to be more accurate or you need to display the seconds, you can modify your code to include the second.
Il faut que tu nous décrives ton matériel. Tu devrais avoir une RTC, part exemple une DS3231 qui est très précise. C'est un module externe qui se connecte sur l'Arduino.
Comme dit plus haut, le moteur est gourmand. Décris aussi comment tout ça est connecté et alimenté.
vois ici comment poster le code, (et où poser ls demandes d'aide) tel quel il aura peu de lecteurs
Indiques la carte utilisée et détailles ton montage
La dérive évoquée n'ést pas surprenante, l'horloge d'un microcontroleur sert à cadencer son fonctionnement interne, rien de plus.
Si le temps internet n'est pas envisageable , ajouter comme indiqué par @lesept un petit module RTC a faible dérive, DS3231 de préférence qui compense l'effet des variations de température
Parles en avec ChatGPT si tu choisis ce procédé pour faire faire le code à ta place et qu'il ne l'a pas spontanément
évoqué .....
Merci pour les réponses. J'utilise un Arduino Uno , un module RTC DS 1302 , un ecran OLED i2c 128*64 et un module BTS 7960 pour le moteur le tout est alimenté par une batterie de voiture 12v , avec un abaisseur de tension pour alimenter l'arduino. L' Oled et le module RTC sont branchés sur les broches SDA et SCL de l'Arduino.
J'ai vu qu'il existait une commande time.adjust () , ne pourrais je pas l'utiliser pour compenser la dérive de temps ?
Ce n’est pas un très bon module. une DS3231 dérive moins
Merci d’éditer (crayon en dessous du post) votre premier post et de rajouter les balises de codes
sélectionner la partie du texte qui correspond au code
appuyez sur l’icône </> dans la barre d’outils pour indiquer que c’est du code
(Assurez vous aussi d’indenter le code correctement dans l’IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)
Si la librairie "que tu as choisie" pour gérér le DS1302 contient un time-adjust() vois dans la documentation ce qu'il est possible d'en tirer pout tenter de limiter les dégats
sur ce forum la tendance forte est de laisser tomber cette antiquité et de profiter d'un comoposant RTC performant le DS3231
Quand "ton" code sera lisible il sera peut être possible d'en dire plus
Merci pour les réponses. Je ne vois toujours pas comment formater le code... Je vais voir avec un module RTC ds 3231 , si ça améliore le décalage , mais je pense que cela vient de ma programmation car j'ai une dérive de pusieurs heures par jour et même si le module RTC ds 1302 n'est pas précis , le décalage ne devrait être supérieur à quelques secondes...
@gjy3 parle d'un retard de plusieurs heures par jour.
Ce n'est pas du à une dérive de la RTC mais soit à un dysfonctionnement de la RTC mais plus probablement à cette instruction RTC.begin(DateTime(__DATE__, __TIME__)); qui remet la RTC à la date/heure de compilation.
Il faut mettre cette instruction en commentaire après l'avoir exécuté une fois.
Tu ne peux pas.
Ce n'est pas comme cela que ça fonctionne.
Toute modification du code, nécessite une compilation de celui -ci et le téléversement du fichier binaire sur ton Arduino.
Peut être devrait tu commencer par lire la documentation de eskimon
Si je voulais me moquer, je te dirais de demander à ton robot "comment commencer avec Arduino"
La première fois que vous chargez, le code tourne il règle l’heure dans la RTC à l’heure de compilation - ça devrait être à peu près la bonne heure si votre PC est a jour
Ensuite vous chargez à nouveau mais avec le bout de code en commentaire ce qui fait que la RTC conservera l’heure mise en mémoire auparavant et sera à l’heure même si vous rebootez l’arduino (sinon la ligne remet l’heure de compilation d’origine)