Horamètre

wink

IMPORTANT : Le programme présenté ci-dessous est affiché sur l'écran "Consommation Fuel" (cf. chapitre précédent). Dans les lignes de codes, il n'est donc pas judicieux de retenir les instructions relatives à l'affichage, qui sont spécifiques (en termes de position et de taille) à l'écran utilisé.
 


L'horamètre consiste à compter les heures moteur. Cette évidence étant posée, il n'en reste pas moins que cela n'est pas si évident à mettre en oeuvre. Il faut répondre à quelques questions au préalable:
 

- Quelles données souhaite-t-on avoir ? Compteur journalier avec remise à zéro à chaque redémarrage et/ou compteur totalisateur (avec mise en mémoire) ?

- Comment et où conserver le total heures? sur l'eeprom de l'arduino ou sur une carte SD ou micro-SD ?

- Comment afficher ces données ? Sur un écran LCD (2x16 ou 4x20) ou sur un écran TFT ?


En arduino, pour compter le temps, il y a la fonction delay() (souvent utilisée pour temporiser) et la fonction millis() qui compte le temps. C'est cette fonction qu'il faut utiliser que j'ai utilisée.
 

SI ((currentMillis - previousMillis) >= quelque chose, ALORS ....

A savoir, un millis == millième de seconde.
Donc :

1000 millis         ==> 1 seconde
60 000 millis      ==> 1 minute
900 000 millis    ==> 15 minutes
etc...

devil

S'agissant d'un compteur journalier, la complexité est réduite ; il s'agit de compter le temps écoulé à partir du démarrage moteur jusqu'à son extinction.
 

Un branchement sur l'arrivée du W au tableau de bord (comme dans mon cas puisque je calcule aussi le RPM) ou sur l'alternateur peut être une solution pour démarrer ce comptage.
Plus simple, un branchement sur la clé de contact suffit. Prévoir cependant un convertisseur 12V/5V ou - si l'on souhaite alimenter un écran directement avec l'arduino - un 12V/9V.
 

Sur l'arrivée positive du signal W, j'ai intercalé un optocoupleur 12V/5V acheté pour quelques cents sur aliexpress.
Il est possible - comme on le voit sur l'illustration - de bricoler soi-même un octocoupleur mais il ne faudra pas oublier de descendre de 12 à 5V. Pour le prix, pas la peine de bidouiller.
 

optocoupleur.jpg

Le compteur programmé sur l'arduino "se mettra en route" sitôt l'excitation reçue et s'arrêtera à la coupure. Le total de la journée restera affiché tant que l'arduino sera alimenté.

Pour débuter, et bien comprendre la fonction millis() qui est la base de ce programme, c'est ce qu'il faut faire, avec un affichage - toutes les 5mn par exemple - sur l'écran du PC. Une fois la fonction millis() comprise, il sera toujours temps de la totaliser puis ensuite de sauvegarder ce total...
 

Pour un compteur qui totalise, l'exercice est un peu plus compliqué et je vais faire court, car le mieux est de parcourir la multitude de tutos dédiés à ce sujet.
1. Pour simplifier, vu qu'il y a peu de digits (de 0 à 99999 me semble largement suffisant), on peut effectuer cette sauvegarde sur l'eeprom de l'arduino. Il y a cependant un problème lié au nombre limité d'écriture/lecture et sur la capacité de l'eeprom selon carte choisie...
Perso je n'ai pas retenu cette solution car je comptais utiliser la carte SD pour d'autres fonctions en plus de l'horamètre, mon choix ne signifie donc pas que cette solution - plus simple - ne convient pas.
 

2. La sauvegarde peut se faire sur carte SD ou micro SD et pour cela il y a de très nombreux tutos.
Ce qu'il faut retenir c'est qu'en plus de déclarer la carte au début du programme, il ne faudra pas oublier d'ouvrir "le droit à l'écriture" puis de le refermer à chaque accès, souvent c'est à ce niveau qu'il y a un souci. Egalement, bien réfléchir à ce qui sera écrit puis lu, et à quel emplacement de la carte (cf.tutos). Pour cela il est nécessaire de créer un fichier TXT sur la carte SD ; je l'ai nommé heur.txt mais n'importe quel nom convient (évitez les accents et autres signes cabalistiques)
 

cartes_SD.jpg

Sur l'illustration, une carte microSD intégrée à l'écran shield TFT (ici un 3,5") qui vient s'enficher sur une carte UNO ou MEGA. A côté, moins cher et aussi efficace, un lecteur de carte SD, le brochage est très simple en I2C (SDA, SCL, GND, 5V)

devil

L'affichage peut se faire sur un écran TFT (couleur, plus agréable, disponible en shield) ou sur écran LCD (beaucoup plus simple, monochrome, connectique en I2C facile).
SCHNAPS dispose d'une timonerie, je n'ai aucun souci par rapport à la pluie et/ou aux embruns. Cette question devra être solutionnée en cas d'affichage dans le cockpit.
 

Perso, avant de m'attaquer à l'affichage TFT, j'avais utilisé un écran LCD.
Pour débuter , c'est ce qui me semble le mieux car il y a une certaine homogénéité en termes de librairies pour ce type d'affichage, ce qui n'est pas le cas pour des écrans TFT dont la puce/chipset, les librairies utilisées, etc., varient selon le constructeur. Et encore, je ne parle pas des TFT noname chinois. Mais avec de l'opiniatreté et google, on y arrive !
 

Sur l'illustration ci-dessous; 2 écrans LCD (2lignes et 4 lignes). Ne pas tenir compte de la découpe du 4x20, ni des marques blanches, ce ne sont que des souvenirs de bricoles....
On constate au recto du 4x20 les broches I2C (5V, GND, SLC, SDA) qui facilitent la connection. Ne pas oublier de relier/ponter les deux broches opposées...

Pour démarrer, l'écran LCD avec broches me semble plus confortable que celui sans (le 2 lignes en illustration) et plus facile à programmer qu'un écran TFT aux bibliothèques incertaines.
 

lcd_face.jpg lcd_dos.jpg

devil

Le programme ci-dessous est un extrait C/C de mon propre programme.
L'affichage concerne un écran TFT avec une position et une couleur de cet affichage spécifiques (cf. chapitre Consommation FUEL) et non pas LCD (plus facile).
Egalement, le programme a été écrit pour une carte MEGA d'où Serial, Serial1, etc. Pour une carte UNO ou NANO, il n'y a qu'un Serial (pour plus de Serial, il faudrait utiliser SoftwareSerial)

______________________________________________________________________________________________

A METTRE EN DECLARATIF, en début de programme (ici il s'agit d'une carte SD ; si sauvegarde sur EEPROM, ce qui concerne la SD n'est pas nécessaire)

 
#include "SdFat.h"

SdFat SD;

#if ENABLE_SOFTWARE_SPI_CLASS  // doit être modifié dans SdFat/SdFatConfig.h


// SdFat software SPI template
SdFatSoftSpi<SOFT_MISO_PIN, SOFT_MOSI_PIN, SOFT_SCK_PIN> sd;

// Fichier SD
SdFile heur;

unsigned long minuts;
float heurt;
int heurs;
float heurf;
float minutf;
unsigned long previousMillis=0;  // pour horamètre
unsigned long hora = 60000;  // 1 minute
;

_______________________________________________________

A METTRE EN SETUP


void setup() {

   Serial.begin(4800);
   Serial1.begin(4800); // pour sortie sur multiplexeur
   pinMode(SD_CHIP_SELECT_PIN, OUTPUT);

    if (!sd.begin(SD_CHIP_SELECT_PIN, SPI_FULL_SPEED))  {
    sd.initErrorHalt();   }
   
   if (!heur.open("heur.txt", O_READ)) {   // O_READ ou O_WRITE plus facile par la suite pour lecture écriture que O_RDWR
    sd.errorHalt(F("open SETUP failed"));  }  
        

______________________________________________________________


A METTRE DANS VOID LOOP

//********************************************************************
//   CALCUL HORAMETRE ET ECRITURE / LECTURE SD
//*********************************************************************

// lecture et affichage data de carte microSD (sur shield TFT 2.8 avec SdFat)
        while(heur.available())   // il s'agit ici du fichier heur.txt sur SD qui enregistre les data
     {
     char c = heur.read();
     readString += c;
     delay(2);  

     if (readString.length() > 0)
         {
     minuts = readString.toInt();
     heurs = minuts/60;
     heurf = (minuts/60.00);    
     minutf = ((heurf-heurs)/1.666666);    
     heurt = heurs+minutf;  
     }
      tft.setCursor(230,210); //216
      tft.setTextColor(NAVY);
      tft.fillRect(220,200,80,30,BLUE);
      tft.setTextColor(WHITE);  
      tft.setFont(&FreeSans12pt7b);
      tft.print(heurt);
      tft.setFont();
      }          
     heur.close();  
            
     unsigned long currentMillis = millis();
   if ((currentMillis - previousMillis) >= hora &&(rpm != 0)) // ATTENTION AU TEST PAR RAPPORT AU RPM
       {    
     minuts = minuts + 1;
     heurs = minuts/60;
     heurf = (minuts/60.00);    
     minutf = ((heurf-heurs)/1.666666);    
     heurt = heurs+minutf;
      
      previousMillis = currentMillis; // }                                 
      
    if (!heur.open("heur.txt", O_WRITE)) {
      sd.errorHalt(F("open LOOP failed"));  }
      heur.println(minuts);         
      heur.close();
      
      tft.setCursor(230,210); //216
      tft.setTextColor(NAVY);
      tft.fillRect(220,200,80,30,BLUE);
      tft.setTextColor(WHITE);  
      tft.setFont(&FreeSans12pt7b);
      tft.print(heurt);  
      tft.setFont();
        }             
// Calcul du reste de Fuel
   resteFuel();

// Affichage des litres et pourcentages
    data();

// Données du barometre, humidité et t° en NMEA
//   baro();

_______________________________________________________________

A METTRE A LA FIN, APRES LES ACCOLADES DU  LOOP

//==========================================================
// ####################  A CONSERVER POUR SDFAT ##################
//_____________________________________________________________________
#else  // ENABLE_SOFTWARE_SPI_CLASS
#error ENABLE_SOFTWARE_SPI_CLASS must be set non-zero in SdFat/SdFatConfig.h
#endif  //ENABLE_SOFTWARE_SPI_CLASS


Date de création : 19/04/2020 11:43
Catégorie : -
Page lue 5509 fois