Go Down

Topic: [Projet en cours] tableau de bord pour moto (Read 16506 times) previous topic - next topic

marc1424

Pas de panique ! toutes les jauges récentes sont de ce type. Pas de chauffe, pas d'étincelle possible, juste une mesure de valeur de résistance. Il faut juste rajouter un hystérésis pour une moto (surtout quand on arsouille dans les virages, je sais c'est maaaaal, mea culpa maxima  :D ).
Exemple d'une jauge de série pour une Honda:

alienboats

C'est pas le risque d'explosion qui m'inquiète  XD
Je me pose plutôt la question de la résistance aux hydrocarbures de la sonde.

Rovhell

La sonde fonctionne par différence de pression. Une partie de la sonde doit rester hors du liquide. Donc, à moins que le SP n'exerce sur l'Etape une pression proche de celle de l'air, ce dont je doute, il y a de fortes chances que ça marche.

Rovhell

#18
Apr 22, 2013, 12:05 am Last Edit: Apr 22, 2013, 01:42 pm by Rovhell Reason: 1
Bon je voulais savoir, si à tout hasard, quelqu'un aurait déjà eu un bug avec le LCD 16x2?
Voilà ce que ça donne avec le arduino mini :
image

Voir le premier post pour ce que ça donne avec l'arduino uno, même code.
Vu que j'ai mis 75 essais à programmer le mini, je ne sais pas si y'a pas encore un soucis avec mon mini.

Rovhell

Bon, erreur toute bête de ma part, les pins du mini sont dans l'ordre inverse de ceux du Uno (parce que ma carte est dos à l'écran). Donc si quelqu'un un jour à le même soucis, c'est juste les fils qui sont pas dans le bon ordre.

Ça y'est, l'affichage fonctionne. Mais plus la carte sd pour le moment. Je vais vérifier mes soudures.

Rovhell

Je post ici plusieurs fois d'affilé pour tenir les lecteurs intéressé par mon projet au courant de son évolution étape par étape. Si jamais cela gêne, prévenez moi.


J'ai donc toujours un soucis de carte sd. J'avais placé dans mon code des erreurs à afficher sur l'écran au cas ou.
Je pense avoir grillé ma carte sd ou le lecteur, à cause d'un mauvais ordre de branchement (encore). Le pin DO de la carte sd passait par une résistance, et pas le pin Clock, ils étaient inversés. Je les ai remis dans l'ordre, mais ça ne fonctionne pas plus. Je vais donc ce soir tester ma carte sd, et mon adaptateur micro.

iNouNours

Continues a nous tenir au courant c'est super intéressant!  :)

marc1424

On attend avec impatience la suite
Marc

Rovhell

Je ne saisi pas bien mes mesures de résistance autour de ma carte sd. J'utilise des résistances de 1k et de 560ohms pour obtenir un signal à 3,21v théorique. Le tout est soudé sur une pcb, relié au même ground bien sur. Mais quand je mesure mes résistances l'une d'elles sensée faire 1Kohm me donne 551ohm... Pourtant quand j'alimente en 5v, elle me sort 3,14v donc le diviseur fonctionne. Je ne comprends pas bien si c'est normal tout ça... Si quelqu'un pouvait confirmer, ça m'aiderait! Merci.

marc1424

Parfois il faut revenir à l'essentiel car on ne voit pas l'arbre qui cache la forêt : tout est bien débranché quand tu fait tes mesures?
Un petit utilitaire de calcul de pont diviseur pour les faignants (comme moi) http://www.electronique-radioamateur.fr/elec/schema/calcul-diviseur-tension.php

Rovhell

Bon, j'avais 4 diviseurs de tension cote à cote, pour les trois lignes d'info de l'arduino vers la carte sd, et un pour l'alim. C'était celui de l'alim qui merdoyait. Je pense que c'était à cause des autres capteurs sur l'alim qui nécessitent une résistance ou un Condo entre + et -. Problème résolu en branchant l'alim sur le 3vo de mon thermocouple, qui délivre du 3,29v mesuré. À force de souder et dessouder, j'ai bel et bien bousillé un de mes adaptateur microSD. Je l'ai remplacé, et ça marche (la foule faisait la holà quand l'écran m'a enfin affiché ce qui était sur cette #!##%**##!# de carte SD).
Donc maintenant, reste plus qu'à compléter le programme pour qu'il lise le thermocouple, et monter tout ça sur mon cheval d'acier. Apres avoir tenté de reparer ma carte SD par hypnose, j'ai profité de mon temps de méditation pour tester la tmp36 et câbler le rtc breakout. L'heure fonctionne à peu près bien (voir plus loin) et la sonde me donnait une température aléatoire. En fait, j'ai oublié de relier la sonde au + et -.
L'heure fonctionne bien, mais j'ai toujours un soucis avec les DS1307, il ne retourne jamais les zéros pour les chiffres inférieur à 10. Donc à minuit, il affiche : , ce qui est rigolo mais pas pratique. À 08:05, il affiche par exemple 8:5 ! Si quelqu'un sait comment résoudre ça, je suis preneur.

Artouste



L'heure fonctionne bien, mais j'ai toujours un soucis avec les DS1307, il ne retourne jamais les zéros pour les chiffres inférieur à 10. Donc à minuit, il affiche : , ce qui est rigolo mais pas pratique. À 08:05, il affiche par exemple 8:5 ! Si quelqu'un sait comment résoudre ça, je suis preneur.

le code concernant le ds1307 et l'affichage ?

Rovhell

#27
Apr 25, 2013, 12:30 pm Last Edit: Apr 25, 2013, 12:39 pm by Rovhell Reason: 1
J'utilise le module rtc de chez adafruit, avec leur librairie. En fouillant sur leur forum, j'ai trouvé une petite fonction assez simple (bon sang mais c'est bien sur!) pour résoudre ce problème. Ce qui veux dire que si je n'ais pas de soucis avec le thermocouple, ce week end, ma moto sera enfin équipée!  XD

Je donne le bout de code à utiliser pour ceux qui ont le même soucis :
Code: [Select]

   printDigits(hour());
   lcd.print(":");
   printDigits(minute());
   


Et la fonction :
Code: [Select]
void printDigits(int digits){
 // utility function for digital clock display: prints leading 0
  if(digits < 1)
  {
     lcd.print('00');
  }
  else
  {
     if(digits < 10)
     {
     lcd.print('0');
     }
  lcd.print(digits);
  }
}

jfs

Dès que ce sera fini tu pourras faire un sujet dans la rubrique "projet fini" avec le sujet du développement en lien  ;)
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Rovhell


Dès que ce sera fini tu pourras faire un sujet dans la rubrique "projet fini" avec le sujet du développement en lien  ;)

C'est prevu :-)


Bon alors, après une semaine à 70h (qui a inventé les 35h ? Faut qu'on cause ! ), j'ai quand même trouvé le temps de finir le code. La seule modif à y apporter, ce sera de préciser les valeurs de mapping pour la jauge, une fois les tests en situation faits.
Le thermocouple, avec son MAX31855 et la librairie de ladyada, est d'une simplicité enfantine à utiliser. Le tout est enfin monté sur un simple protoshield (je ne sais pas ou trouver de PCB vierge), et avec un peu de colle chaude, les breakout-boards et la carte SD devraient s'agencer à la perfection dans mon logement de compteur avec le systeme principale au centre.
Donc le début du montage sur mon motoculteur est prévu pour demain.
En attendant, voici le code finit :
Code: [Select]
// Inclusion des librairies
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 4, 5, 6, 7, 8); // Initialisation de la librairie Liquid Crystal
#include <SD.h>
#include "RTClib.h"
#include "LcdBigFont.h"
#include "Adafruit_MAX31855.h"


RTC_DS1307 RTC; //initialisation de la librairie du module RTC
//Attribution des entrées

//Afin de disposer d'assez d'entrée sur l'arduino, j'utilise des entrées analogiques en lecture digitale pour le thermocouple.
int thermoCLK = A1;
int thermoCS = A2;
int thermoDO = A3;

int tmpPin = A0;    // Selection de l'entrée analogique pour la sonde température TMP36
int jaugePin = A6; // Jauge d'essence sur A1
int lastJauge=500000; // initialisation impossible pour la comparaison de jauge
float vitesse = 0; // initialisation de la vitesse float
int intVitesse=0; // initialisation de la vitesse à afficher (int)
float temperature[10]; // tableau de valeur pour stocker 10 echantillons de température
int index=0 ;          // index du tableau pour s'y retrouver
long previousMillis = 0;       
long interval = 3000; // interval de defilement des parametres sur le lcd
int lcdState = 0;  // parametre en cours d'affichage
volatile byte rpmcount; // compteur tours de roues
float kmcount=0; // compteur de km
char kmprev[10]; // tableau pour lire la carte SD
int bufPos = 0; // buffer pour lire la carte SD
char byteIn = 0; // byte de la carte SD
String erreur=""; // code erreur

unsigned int rpm;
unsigned long timeold; // marqueur de temps
const int chipSelect = 10; // pin cs de la carte SD



// Initialize the Thermocouple
Adafruit_MAX31855 thermocouple(thermoCLK, thermoCS, thermoDO);



void setup() {
// Configuration de l'afficheur 16 caractères en 2 lignes
lcd.begin(16, 2);
// creation des caracteres speciaux
bigFontBegin();

// Lien avec l'horloge RTC
Wire.begin();
RTC.begin();
lcd.setCursor(0, 0);

      lcd.print("Initialisation");
      delay(1000);
     
     
memset(kmprev,0,sizeof(kmprev));

erreur = "Init";//initialize
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(10, OUTPUT);

// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
  erreur = "SD";//Card failed, or not present"
  // don't do anything more:
   lcd.setCursor(0, 1);

      lcd.print("Erreur SD");
      delay(1000);
     
  return;
}

// on lit le nombre de km parcouru jusqu'ici
File dataFile = SD.open("datalog.txt");
   lcd.setCursor(0, 1);
      lcd.print("Total KM :      ");
      delay(700);
// if the file is available, write to it:
if (dataFile) {
  while (dataFile.available()) {

     byteIn = dataFile.read();
if (bufPos < sizeof(kmprev))
kmprev[bufPos++] = byteIn;
  }
  dataFile.close();
  kmcount = strtod(kmprev, NULL);
   lcd.setCursor(0, 1);
      lcd.print(kmcount);
      lcd.print(" km      ");
      delay(1700);

// if the file isn't open, pop up an error:
else {
  erreur = "File";//error opening datalog.txt
   lcd.setCursor(0, 1);
      lcd.print("Erreur !        ");
      delay(2000);
} //*/
// On verifie la présence de l'horloge, de sa pile...
if (! RTC.isrunning())
{
    erreur = "RTC";
    //  RTC.adjust(DateTime(__DATE__, __TIME__));//Décommenter pour initialiser l'heure
   lcd.setCursor(0, 1);
      lcd.print("Erreur horloge  ");
      delay(2700);

}

double c = thermocouple.readCelsius();
   lcd.setCursor(0, 1);
   if (isnan(c))
   {
     lcd.print("T/C Problem");
   }
   else
   {
     lcd.print("Moteur : ");
     lcd.print(c);
   }

   delay(1700);


attachInterrupt(0, rpm_fun, RISING); // LA fonction qui compte les tours de roues en background

rpmcount = 0;
rpm = 0;
timeold = 0;
   lcd.setCursor(0, 1);
      lcd.print("Terminee !      ");
      delay(1000);
}

void loop() {
DateTime now = RTC.now();
if (rpmcount >= 10) {
   //Update RPM every 10 counts, increase this for better RPM resolution,
   //decrease for faster update
   rpm = 30*1000/(millis() - timeold)*rpmcount;
   timeold = millis();
   rpmcount = 0;
   vitesse= rpm*60;
   vitesse= vitesse*2.10;
   intVitesse = vitesse/1000;

   File dataFile = SD.open("datalog.txt", FILE_WRITE); // on ecrit le nombre de km parcourus dans un fichier
    // if the file is available, write to it:
if (dataFile) {
  dataFile.seek(0);
  dataFile.print(kmcount);
  dataFile.close();

// if the file isn't open, pop up an error:
else {
erreur = "File"; //error opening datalog.txt
} //*/
}

//acquisition de la valeur analogique dans sensorValue
// de 0 à 1023 -> 0 à 5V
int sensorValue = analogRead(tmpPin);


//transformation en milliVolts dans outputValue
float outputValue = (((float)(sensorValue))*5000.0)/1023.0;

//Calcul de la température en fonction des milliVolts
float outputTemp = ( (float) outputValue - 500.0) /10.0;

//insertion de la température dans le tableau
temperature[index] = outputTemp;

//incrémentation de l'index modulo 10
index = (index + 1) % 10;

// calcul de la moyenne ( Méthode barbare, une boucle for l'aurait mieux fait) 
int tempMoy = (temperature[0]+temperature[1]+temperature[2]+temperature[3]+temperature[4]+temperature[5]+temperature[6]+temperature[7]+temperature[8]+temperature[9])/10;

lcd.setCursor(0, 0);
bigFont(intVitesse); // affichage de la vitesse en gros, fonctionne seulement si inferieur a 999!

int jaugeValue = analogRead(jaugePin); // lecture de la jauge
jaugeValue = map(jaugeValue, 500, 1000, 0, 5);
if (lastJauge != jaugeValue) // si le niveau à bougé, on update l'affichage
{
lastJauge = jaugeValue;
lcd.setCursor(11, 1);
lcd.write(byte(1));
lcd.write(byte(4));
lcd.write(byte(4));
lcd.write(byte(4));
lcd.write(byte(2));
lcd.setCursor(11, 1);
int i=0;
while ( i < jaugeValue){
    lcd.write(byte(3));
    i++;
}
}
// on gere l'affichage des options heure et temperature
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
  lcdState ++;


  previousMillis = currentMillis;   

  }
  lcd.setCursor(11, 0);
  if(erreur=="")
  {
  if(lcdState == 0){//affichage de l'heure
    printDigits(now.hour());
    lcd.print(":");
    printDigits(now.minute());

  }
  else if(lcdState == 1){//affichage de la temperature moyenne exterieur
    lcd.print("  ");
    lcd.print(tempMoy);
lcd.setCursor(15, 0);
lcd.write(byte(0));
  }
  else if(lcdState == 2){//affichage de la température moteur
    lcd.print("  ");
    lcd.print(thermocouple.readCelsius());
lcd.setCursor(15, 0);
lcd.write(byte(0));
  }
  else{

    lcdState = 0;
  }
  }
  else
  {
    if(erreur == "Init")
    {
      lcd.print(erreur);
      delay(700);
    erreur = "";

    }
    lcd.print(erreur);
   
  }
delay(30); // un petit delais pour ne pas trop mouliner

}

void rpm_fun()
{
rpmcount++;
kmcount= kmcount + 0.0021;
}

void printDigits(int digits){
  // utility function for digital clock display: prints leading 0
   if(digits < 1)
   {
      lcd.print('00');
   }
   else if(digits < 10)
   {
   
      lcd.print('0');
   lcd.print(digits);
   }
   else if(digits > 60)
   {
     lcd.print('00');
   }
   else
   {
      lcd.print(digits);
   }
}



Vous pouvez trouver la page LcdBigFont.h en première page du topic. Je sais que ce n'est pas un .h qu'il aurait fallut, mais ça à finit par se trouver comme ça, et comme ça marche...
Le code regroupe un bon nombre de choses intéressantes que je conseil de lire aux débutants comme moi. Je l'ai complétement commenté pour s'y retrouver. Certains commentaires sont en anglais parce qu'il y a des bouts de copier/coller et que le commentaire anglais semblait suffisant (feignasse inside !).

Go Up