Projet compteur d'heures

Salut a tous je me remet a l’arduino, et je dois dire que le code m’embête un peu : j’essaye de realiser un compteur d’heures qui les affiches sur un afficheur lcd 16x2, seulement impossible avec mon code je me demande un peu ce qu ne vas pas… Tout surement ^^
(je comptais passer par les secondes pour les transformer en heures tout sa stocké en eeprom

#include <LiquidCrystal.h>
#include <EEPROM.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
    lcd.begin(16, 2);
    lcd.print("Compteur de sec");
}

void loop() {
    byte valeur = EEPROM.read(0);
  delay(2000);
 EEPROM.write(0, valeur+2);
  lcd.setCursor(0, 1);
    lcd.print(valeur);
  }

Cordialement,
KoRo.

Waow vous allez flinguer l'EEPROM en moins de 6 jours....

un autre soucis c'est que votre octet sait compter que jusqu'à 255...

PS :c'est la première fois que je lis un code qui est centré et pas aligné à gauche... un effet de style ?? (c'est pas top pour suivre les indentations)

Désolé pour le centrage, pas pensé a la lecture ^^
Je viens de me renseigner sur l'eeprom et effectivement a ne pas faire
Le stockage vous me conseillez quoi?
Et la méthode pour le compte heure ??

Pourquoi voulez vous stocker ? Le courant se coupe ?

Enfaite je sas pas trop comment faire. Car c'est un projet qu es sensé être "portable" étant donné qu'il serait sur une moto, et je voulais que le système électrique soit indépendant de celui de la moto.

Je veux juste afficher le temps d'utilisation (en heures) de la moto sur l'afficheur lcd, sauf que je peux très bien ne pas me servir de ma moto pendant 2 - 3 semaines donc je me suis dis qu'il fallait que je mette un interrupteur que j'actionnerais a chaque fois que j'utiliserais la moto et que je couperais dès que j'ai finis de m'en servir..

Désolé si je ne suis pas trop clair^^

tu peux aussi ne stocker que les minutes, déjà ça va limiter grandement le nombre d’écritures. Perdre au maximum 59s à chaque coupure,est-ce si grave ?

Et sinon si les secondes sont indispensables, faire par exemple une mesure de la tension d’alimentation de l’arduino, et n’écrire dans l’eeprom que lors de la coupure d’alim. Il faut rajouter un gros condo et une diode sur l’alim pour avoir le temps de faire l’écriture avant que ça coupe vraiment :

alim–mesure–diode–condo–alim_arduino

Non ce n’es pas grave du tout même 5 minutes resteras très correct ^^ Donc ce code vous semblerait correct ?

#include <LiquidCrystal.h>
#include <EEPROM.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
    lcd.begin(16, 2);
    lcd.print("Compteur de mn");
}

void loop() {
    byte valeur = EEPROM.read(0);
  delay(60000);
 EEPROM.write(0, valeur+1);
  lcd.setCursor(0, 1);
    lcd.print(valeur);
  }

il faut garder en tête la spécification, qui donne la durée de vie de l'eeprom interne à 100 000 cycles d'écritures.

Donc en écrivant toutes les minutes (donc 60x/heure), ça fait une durée de vie de 1667h, soit environ 69 jours.

En écrivant toutes les 5 minutes, 345 jours, c'est déjà bien plus raisonnable...

D'accord toutes les 5 minutes ce qui me fais un delay(300000), au niveau de l'alimentation vous me conseillez quoi ? J'ai un peu retravaillé mon code ça le ferrais ?

void loop() {
  byte minutes = EEPROM.read(0);
  byte heures = EEPROM.read(1);
  
  lcd.clear();
  lcd.begin(16, 2);
  lcd.print("Actif :");
  lcd.setCursor(14, 0);
  lcd.print("Mn");
  lcd.setCursor(11, 0);
  lcd.print(minutes);
  lcd.setCursor(0, 1);
  lcd.print("Heures :");
  lcd.setCursor(15, 1);
  lcd.print("H");
  lcd.setCursor(11, 1);
  lcd.print(heures);
  
  delay(300000);
  EEPROM.write(0, minutes+5);
  
  if (minutes >= 55){
   EEPROM.write(0,0);
   EEPROM.write(1,heures+1);
  }
}

OK c’est important de savoir que l’arduino s’éteint quand la moto est inutilisée.

Si l’arduino s’éteint, l’eeprom Ne s’use pas pendant ce temps là puisque pas d’écriture
Quand il redémarre c’est au setup(), tant que la loop() tourne c’est qu’il y a du courant et donc pas la peine de relire l’EEPROM en début de loop.

Pour la structure du code:
Dans le set up

  • vous lisez l’EEPROM et initialisez une variable nbSecondes qui est le nombre de seconde depuis la mise en place du système

  • utilisez une variables de type uint32_t nbSecondes;

  • Utilisez la fonction put() (ou update() pour stocker et get() pour relire

  • Une fois lue, pas la peine de la relire dans la loop.

Dans la loop()

  • vous transformez nbSecondes en heures (et minutes et secondes si vous voulez) en faisant:
uint32_t nbHeures = nbSecondes / 3600;
  • vous affichez cette valeur, vous faites un delai de 1 minute, vous rajoutez 60 (= 1 minute) à nbSecondes et sauvez en EEPROM et vous recommencez la loop.

Comme dit plus haut cependant ça va user votre eeprom. À chaque heure d’utilisation vous aurez alors fait 60 écritures. L’eeprom Supporte environ 100,000 écritures à une case donnée donc environ 1666 heures d’utilisation de la moto. A raison de 1h par jour en moyenne c’est donc 1666 jours d’usage soit 4 ans et demi. Autre façon de voir, à 60km/h de moyenne ça vous fait que le compteur arduino tient 100,000 km environ.

Notez que Comme vous avez bcp d’eeprom c’est un peu ballot d’écrire toujours au même endroit. Avec un peu d’astuce on peut écrire à des endroits différents (zone 1, zone 2, puis 3,.., puis 100, puis à nouveau zone 1) dans toute une plage de l’EEPROM. Dans le setup() comme vous savez que ça ne fait que augmenter, vous prenez la plus grande des valeurs trouvée dans la plage pour commencer

—> avec un buffer contenant 200 valeurs (sur 4 octets ça rentre) votre durée d’usage devient alors 200 fois plus grande, vous en avez assez pour compter le temps passé sur toutes les motos de toute votre vie :slight_smile:

KoRo:

Je veux juste afficher le temps d’utilisation (en heures) de la moto sur l’afficheur lcd, sauf que je peux très bien ne pas me servir de ma moto pendant 2 - 3 semaines donc je me suis dis qu’il fallait que je mette un interrupteur que j’actionnerais a chaque fois que j’utiliserais la moto et que je couperais dès que j’ai finis de m’en servir…

Désolé si je ne suis pas trop clair^^

Bonjour
dans des applications de ce genre , j’utilise des DS1904 ou DS1994 (mais le DS1994 est “end of life” )
C’est robuste et facile à interfacer avec le monde arduino en 1-Wire®

vous en trouvez où des DS1904L-F5# ?
ça se fait rare de nos jours (ou cher - 10 euros l'unité - on a une ds3231 avec sa pile pour 2€ de nos jours)

Petite séquence nostalgie:
Echantillons Maxim ? je reconnais la petite boite !
Maxim est-il aussi généreux en échantillons qu’il ya 10 ans ?
Pour la mesure de la durée de fonctionnement je pensais aux Indachrons… encore plus rares que certains IButtons, dommage c’était pratique et simple d’utilisation
Curtis Indachron.jpg

J-M-L:
vous en trouvez où des DS1904L-F5# ?
ça se fait rare de nos jours (ou cher)

:grin:

J'ai ma "source" directement à la source 8)

çà me fait penser à lui passer un coup de fil , j'ai mon stock de DS2423 qui atteint un niveau tres critique :wink:

Dommage , c'etait vraiment un compo bien sympa

Si ta source peut encore te fournir des DS2423 c'est une très bonne source qu'il faut traiter comme les bons coins pour les champignons.

al1fch:
Si ta source peut encore te fournir des DS2423 c'est une très bonne source qu'il faut traiter comme les bons coins pour les champignons.

:grin:

J-M-L:
OK c’est important de savoir que l’arduino s’éteint quand la moto est inutilisée.

Si l’arduino s’éteint, l’eeprom Ne s’use pas pendant ce temps là puisque pas d’écriture
Quand il redémarre c’est au setup(), tant que la loop() tourne c’est qu’il y a du courant et donc pas la peine de relire l’EEPROM en début de loop.

Pour la structure du code:
Dans le set up

  • vous lisez l’EEPROM et initialisez une variable nbSecondes qui est le nombre de seconde depuis la mise en place du système

  • utilisez une variables de type uint32_t nbSecondes;

  • Utilisez la fonction put() (ou update() pour stocker et get() pour relire

  • Une fois lue, pas la peine de la relire dans la loop.

Dans la loop()

  • vous transformez nbSecondes en heures (et minutes et secondes si vous voulez) en faisant:
uint32_t nbHeures = nbSecondes / 3600;
  • vous affichez cette valeur, vous faites un delai de 1 minute, vous rajoutez 60 (= 1 minute) à nbSecondes et sauvez en EEPROM et vous recommencez la loop.

Comme dit plus haut cependant ça va user votre eeprom. À chaque heure d’utilisation vous aurez alors fait 60 écritures. L’eeprom Supporte environ 100,000 écritures à une case donnée donc environ 1666 heures d’utilisation de la moto. A raison de 1h par jour en moyenne c’est donc 1666 jours d’usage soit 4 ans et demi. Autre façon de voir, à 60km/h de moyenne ça vous fait que le compteur arduino tient 100,000 km environ.

Notez que Comme vous avez bcp d’eeprom c’est un peu ballot d’écrire toujours au même endroit. Avec un peu d’astuce on peut écrire à des endroits différents (zone 1, zone 2, puis 3,…, puis 100, puis à nouveau zone 1) dans toute une plage de l’EEPROM. Dans le setup() comme vous savez que ça ne fait que augmenter, vous prenez la plus grande des valeurs trouvée dans la plage pour commencer

—> avec un buffer contenant 200 valeurs (sur 4 octets ça rentre) votre durée d’usage devient alors 200 fois plus grande, vous en avez assez pour compter le temps passé sur toutes les motos de toute votre vie :slight_smile:

Merci pour votre réponse et vos réponses ! J’ai essayé de coder quelque chose, je suis pas pas très expérimenté dans ce domaine donc si c’est faux c’est ‘normal’.

#include <EEPROM.h>
uint32_t nbSecondes;

void setup() {
nbSecondes = EEPROM.get(0, nbSecondes);
}

void loop() {
uint32_t nbHeures = nbSecondes / 3600;
//AFFICHER nbHeures SUR LCD
delay(1000);
nbSecondes = nbSecondes+60;
EEPROM.update(0,nbSecondes);
}

Ca tiendrais combien de temps ceci ? : DS1904L-F5#
Sachant que c’est une moto qui ne roule pas souvent, le système seras allumé pas plus de 5h par semaine

KoRo