Retard important de l'horloge

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é.

Bonjour @gjy3

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é ..... :upside_down_face:

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" :wink: 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...

Lisez les règles ou détail post 6

Le code doit apparaître comme cela

void setup() {
  pinMode(ledPin, OUTPUT);
  …
}

void loop() {
  …
}

Vous avez une RTC pourquoi faire de while sur millis pour attendre une heure donnée… et qui vous dit que vous allez tomber pile sur cette seconde

Ok merci pour votre patience...

c'est pas encore ça... vous avez juste mis un < en début de code...

éditez avec le crayon
sélectionnez le code en entier
dans la barre d'outil au dessus de votre post


clickez l’icône </>
sauvez le post en cliquant en dessous sur
image

Ok , j'ai modifié le post...

Bonjour,

@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.

Merci pour la réponse , mais comment je peux mettre l'instruction en commentaire une fois que je l'ai injectée dans l'Arduino ?

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" :rofl:

Bien , mais ça ne fait pas avancer mon problème...

  • Tu téléverses ton programme.
  • Tu mets l'instruction en commentaire
  • Tu re téléverses le programme

très drôle..

C’est pas drôle - c’est comme ça

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)

Mais du coup quel est ton problème, si ce n'est pas la solution?