Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Index du Forum



Afficheur tableau de bord
Aller à la page: 1, 2  >

 
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Projets -> Vos projets
Sujet précédent :: Sujet suivant  
Auteur Message
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Mar 5 Mar - 18:57 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

PublicitéSupprimer les publicités ?
Afin de compléter l'affichage plutôt maigre du tableau de bord de ma Legacy turbo, je souhaite réaliser un module pouvant récupérer les infos de plusieurs sondes, les interpréter et les afficher sur un lcd placé sur le bloc compteur, un peu comme ça:



Une partie de l'affichage devra être permutable en boucle à l'aide d'un bouton. Par exemple, passer de la batterie à température extérieure, puis température intérieure et à nouveau batterie...

Enfin, je voudrais adjoindre de leds permettant un check rapide du moteur: Une jaune qui resterait allumées tant que certains critères ne sont pas atteints: moteur froid = pas arsouille (temp huile trop basse, pression huile trop haute). Une rouge qui s'allumerait si certains seuils sont atteints, pas comme le voyant rouge du tableau de bord qui s'allume quand c'est déjà trop tard (température huile au delà d'un certain seuil, pression huile trop basse).



Pour le moment, j'ai commencé à me familiariser avec mon Arduino Uno. Je n'attaque pas le projet par la gestion des sondes pour une raison simple: Je dois d'abord m'habituer au langage...

Pour cette raison, je me suis faits de petits programmes pour afficher et faire varier des infos (fictives) sur mon écran lcd en activant un bouton.

Ca donne ça (désolé pour la qualité, mais pas facile de filmer un écran lcd):

Message d'accueil


Action du bouton sur l'affichage

Ca n'a l'air de rien, mais j'ai bien galérer avant de trouver l'utiliter de la fonction switch!

Le programme donne ça:

Citation:
//Modifier affichage par pression bouton (valeurs fictives)
 
 #include <LiquidCrystal.h>
 
// initialisation lcd sur arduino
 LiquidCrystal lcd(10, 11, 12, 13, 14, 15, 16);

 const char* a="OilT";
 const char* b="OilP";
 const char* c="Batt.";
 const char* d="TempIn";
 const char* e="TempEx";
 const char* f="123d";
 const char* g="3.7b";
 const char* h="12.4V";
 const char* i="17.5d";
 const char* j="7.5d";
 const char* s=0;
 const char* t=0;
 int x=0;
 #define valeurMax 2
 
void setup() {
  
  lcd.begin(16, 2); // paramètre lcd
  
  pinMode(8,INPUT); // bouton sur pin 8
  digitalWrite(8, HIGH); // alimentation pin 8
  
  lcd.clear(); // nettoyer l'écran
}
void loop(){
  if (digitalRead(8)==HIGH) // incrément x par appui bouton
  { lcd.clear();
    if (x<valeurMax){ x++;} else {x=0;}
    delay(200);
    while((digitalRead(8)==HIGH));
  } 
 
  switch (x) { // en fonction de la valeur de x, on modifie l'affichage
   case 0: s=c; t=h; break;
   case 1: s=d; t=i; break;
   case 2: s=e; t=j; break; }
 
 // Affichage sur lcd
   lcd.setCursor(0,0); lcd.print(a);
   lcd.setCursor(5,0); lcd.print(b);
   lcd.setCursor(10,0); lcd.print(s);
   lcd.setCursor(0,1); lcd.print(f);
   lcd.setCursor(5,1); lcd.print(g);
   lcd.setCursor(10,1); lcd.print(t);
     
}


Revenir en haut
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Mar 5 Mar - 19:12 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

Etape suivante, communiquer avec une sonde de température.

Dans mon kit, j'ai une sonde de ce type (sonde grove avec signal non linéaire):
http://www.evola.fr/product_info.php/capteur-temperature-grove-p-363

Sur un site US, j'ai récupéré ce programme pour interpréter les valeurs et les afficher sur l'ordi.

 
 

 
Code:
int a;
float temperature;
int B=3975;
float resistance;
void setup()
{
  Serial.begin(9600);
 
}
void loop()
{
  a=analogRead(A1);
  resistance=(float)(1023-a)*10000/a;
  temperature=1/(log(resistance/10000)/B+1/298.15)-273.15;
  delay(1000);
  Serial.println(temperature,2);
 
}

J'ai bien une température cohérente qui s'affiche sur le sérial moniteur.




C'est là, que je vais avoir besoin d'aide car je ne comprends pas le phénomène suivant:
Je change mon programme pour paramétrer mon afficheur à la place du moniteur sans toucher au contenu de l'équation:

 

    //Lecture de la temperature avec Afficheur LCD.
     #include <LiquidCrystal.h>
    LiquidCrystal lcd(10, 11, 12, 13, 14, 15, 16);
  
   int a;
   float temperature;
   int B=3975;
   float resistance;
  
    void setup()
    {
       lcd.begin(16, 2);
    }
      
    void loop()
    {
  lcd.clear();
  a=analogRead(A1);
  resistance=(float)(1023-a)*10000/a;
  temperature=1/(log(resistance/10000)/B+1/298.15)-273.15;
  lcd.print(temperature);
  delay(1000);
    }
 
 
Et là, je n'obtiens plus du tout les mêmes valeurs (il fait moins 8 dans mon salon et la température diminue encore quand je mets la sonde dans ma main).

Comment est-ce possible?
Revenir en haut
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Sam 9 Mar - 20:33 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

Ca marche!

C'était un problème d'adressage physique: le lcd et la sonde partagaient une même broche sur l'Arduino.

Du coup, quand le lcd était alimenté, il pertrbait le signal.
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Mar 12 Mar - 10:14 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

eh bien voilà
Tu pourras mettre le code fonctionnel en ligne sur le forum pour partager ta réussite
____________________________
http://simple-duino.com
Revenir en haut
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Mar 12 Mar - 10:18 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

Oui, des que possible.


Il a un peu évolué depuis avec la prise en charge de 2 Leds qui s'allument en fonction de certains seuils.
Revenir en haut
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Mar 12 Mar - 17:14 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

Voici la version la plus récente du programme.
Tempin est une sonde de température à signal non linéaire, tempex est une sonde simulée par un potentiomètre (type 35M, linéaire).

OilP et OilT sont des valeurs fixes pour faire joli (pas de sondes pour le moment, mais vu que la sonde de température fonctionne, le reste n'est que du réglage). Me reste à voir pour réaliser un voltmètre capable de relever la charge de la batterie.


Citation:

// Message accueil
//Modifier affichage par pression bouton (valeurs fictives)
// Sonde grove fonctionnelle sur tempIn
// Sonde virtuelle (potentiomètre) sur tempEx
// Caractéristiques de la sonde virtuelles -40° à 0V sur 0-5V
// précision: 10mV/1°C
// Ledr allumée avec tempex<50 ou tempin<20
// Ledv allumée avec tempex>120 ou tempin>26

 #include <LiquidCrystal.h>
 
// initialisation lcd sur arduino sur bus 1
 LiquidCrystal lcd(2, 3, 4, 5, 6, 7, 8);
 const int ledv =  10;
 const int ledr =  11;
 
 const char* a="OilT";
 const char* b="OilP";
 const char* c="Batt.";
 const char* d="TempIn";
 const char* e="TempEx";
 int f=123;
 float g=(3.7);
 float h=(12.4);
 const char* s=0;
 float t=0;
 
 float tempin;
 int B=3975;
 float resistance;
 
 int x=0;
 #define valeurMax 2
 
 byte subaru1[8] = {
  B00100,
  B00100,
  B01110,
  B11111,
  B01110,
  B00100,
  B00100,
  B00000
};
byte subaru2[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00010,
  B00111,
  B00010
};
byte subaru3[8] = {
  B00000, 
  B00000, 
  B00000,
  B00010,
  B00111,
  B00010,
  B00000,
  B00000
};
byte subaru4[8] = {
  B01000,
  B11100,
  B01000, 
  B00010,
  B00111,
  B00010,
  B00000,
  B00000
};
byte subaru5[8] = {
  B01000,
  B11100, 
  B01000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
byte subaru6[8] = {
  B10000,
  B01000,
  B00100,
  B00010,
  B00010,
  B00001,
  B00001,
  B00001
};
byte subaru7[8] = {
  B00001,
  B00001,
  B00001,
  B00010,
  B00010,
  B00100,
  B01000,
  B10000
};
 
void setup() {
  
  lcd.begin(16, 2); // paramètre lcd
  pinMode(ledv, OUTPUT);
  pinMode(ledr, OUTPUT);
  pinMode(9,INPUT); // bouton sur pin 8
  digitalWrite(9, HIGH); // alimentation pin 8
  
  lcd.clear(); // nettoyer l'écran
  // création des caractères personnalisés
  lcd.createChar(1, subaru1);
  lcd.createChar(2, subaru2);
  lcd.createChar(3, subaru3);
  lcd.createChar(4, subaru4);
  lcd.createChar(5, subaru5);
  lcd.createChar(6, subaru6);
  lcd.createChar(7, subaru7);
  
  
  lcd.setCursor(0,0);
  lcd.print((char)1); lcd.print((char)2);
  lcd.setCursor(3,0); lcd.print((char)6);
  lcd.setCursor(3,1); lcd.print((char)7);
  lcd.setCursor(6,0); lcd.print("SUBARU");
  lcd.setCursor(0,1); lcd.print((char)3);lcd.print((char)4); lcd.print((char)5);
  delay(5000); // Ecran vide 5 seconde
  lcd.clear();
  
  for (int positionCounter = 0; positionCounter < 12; positionCounter++) {
    // Décalle le curseur de 12 colonnes vers la gauche
    lcd.scrollDisplayLeft();
    // wait a bit:
    delay(150);   }
    
  lcd.print("LEGACY TURBO");
  
  for (int positionCounter = 0; positionCounter < 14; positionCounter++) {
    // Décalle le texte vers la droite et le centre
    lcd.scrollDisplayRight();
    // wait a bit:
    delay(150);   }
  
  // Réinitialisation de l'affichage et de la position du curseur
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("  LEGACY TURBO");
  delay(2000);
     
  lcd.setCursor(16,1);
  lcd.print("Bienvenue a bord");
     
  for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
    // scroll one position right:
    lcd.scrollDisplayLeft();
    // wait a bit:
    delay(150);   }
   
      
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("LEGACY TURBO");
  lcd.setCursor(0,1);
  lcd.print("Bienvenue a bord");
  delay(2000);
   }
void loop(){
  // Interprétation sonde temperature grove
  resistance=(float)(1023-analogRead(A4))*10000/analogRead(A4);
  tempin=1/(log(resistance/10000)/B+1/298.15)-273.15;
  
    // Afficher la température en degres Celcius sonde virtuelle
       int potent = analogRead(A5);
       float tempVolts = potent * 5.0 / 1024.0;
    //pour atteindre 0° il faut 0.4V: on retire 0.4 pour avoir les t° négatives.
      float tempex = (tempVolts - 0.4) * 100.0;
  
  if (tempex < 50 || tempin < 20) {    
    // turn LED on:   
    digitalWrite(ledr, HIGH);   }
  else {digitalWrite(ledr, LOW); }
  
  if (tempex > 120 || tempin > 26) {    
    // turn LED on:   
    digitalWrite(ledv, HIGH);   }
  else {digitalWrite(ledv, LOW); }
  
  if (digitalRead(9)==HIGH) // incrément x par appui bouton
  { lcd.clear();
    if (x<valeurMax){ x++;} else {x=0;}
    delay(200);
    while((digitalRead(9)==HIGH));
  } 
 
  switch (x) { // en fonction de la valeur de x, on modifie l'affichage
   case 0: s=c; t=h; break;
   case 1: s=d; t=tempin; break;
   case 2: s=e; t=tempex; break; }
 
   lcd.clear();
 
 // Affichage sur lcd
   lcd.setCursor(0,0); lcd.print(a);
   lcd.setCursor(5,0); lcd.print(b);
   lcd.setCursor(10,0); lcd.print(s);
   lcd.setCursor(0,1); lcd.print(f, 1);
   lcd.setCursor(5,1); lcd.print(g, 1);
   lcd.setCursor(10,1); lcd.print(t, 1);
  
  delay(250);
}
Revenir en haut
arnaud39
Débutant

Hors ligne

Inscrit le: 01 Avr 2013
Messages: 378
Masculin
Niveau d'éléctronique: Dieu vivant

MessagePosté le: Lun 13 Mai - 16:46 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

Salut merci beaucoup de ce partage et belle réussite :-)
____________________________
Ancien admin du forum, co-fondateur tutoarduino.com
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Lun 13 Mai - 18:47 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

Encore Bravo
____________________________
http://simple-duino.com
Revenir en haut
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Lun 13 Mai - 18:56 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

 Merci.

Mais je n'ai pas encore fini. J'ai bien avancé sur l'intégration dans mon bloc compteur. Je suis en train de voir pour faire varier l'intensité de l'éclairage du lcd:


Donc rétroéclairage gérable depuis arduino sans forcement passer par un potentiomètre. Le rétroéclairage est branché sur 5V par défaut. Il suffit de le brancher sur une broche "PWM" de l'arduino (repérées par symbol ~). En effet, il est assuré par une Led...

Ensuite, Une fois la broche déclarée, on peut lui attribuer une tension via la commande analogWrite et le tour est joué (oui je sais ce n'est pas grand chose, mais je découvre à chaque étape et ai l'impression d'être un génie! ):

http://www.youtube.com/watch?feature=player_embedded&v=HNEVCjTegmU

On peut imaginer un affichage qui varie en fonction de la lumière dans la voiture (via un capteur de lumière à ajouter) ou bien simplement via un diviseur de tension, relier le commodo de l'éclairage à l'Arduino: Si on allume les feus, Arduino détecte du courant et modifie la valeur de tension dans la ligne analogWrite dédiée au rétroéclairage (à paramétrer via des tests en conditions réelles...)

Si ça intéresse quelqu'un, ci-dessous, le programme correspondant à la chtite vidéo:

#include

LiquidCrystal lcd(7,8,9,10,11,12);

int ledPin = 3;

void setup() {

lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("LEGACY TURBO");
lcd.setCursor(0,1);
lcd.print("Bienvenue a bord");
delay(150);
}

void loop() {

for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
{analogWrite(ledPin, fadeValue);
delay(30);
}

for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5)
{ analogWrite(ledPin, fadeValue);
delay(30);
}
}
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Mar 14 Mai - 17:17 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

pas mal du toutIl te manque encore quoi au niveau de ton projet ?
____________________________
http://simple-duino.com
Revenir en haut
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Mar 14 Mai - 17:24 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

 Acheter les sondes définitives et les paramétrer suivant le principe des petites sondes de température.

Ensuite, aborder un point que je ne maitrise pas pour le moment: La communication avec l'ecu pour récupérer tout un tas d'infos que je pourrai afficher: (température d'eau, boost, compte tour, vitesse, ...).
Je sais que l'on peut faire du port série via les broches 0 et 1 de l'arduino et la biblio Sérial. De ce côté, avec quelques exemples, je devrais y arriver.

C'est du côté de Subaru que ça se complique (vieille Legacy et donc pas d'OBD classique). J'ai une connectique qui permet de communiquer, je sais quelle broche permet d'envoyer une commande à l'ecu et quelle broche me permet de recevoir des infos.
Il me faut trouver les codes de commandes correspondant aux infos à récupérer...
Revenir en haut
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Mar 14 Mai - 19:42 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

 
Voilà les commandes nécessaires pour dialoguer avec l'ECU:

Byte 1 __ Byte 2 __ Byte 3 __ Byte 4 __ Byte 5 __ Byte 6 __ Byte 7 ___ Function
7F _____ addr1 __ addr2 ___ addr3 __ addr4 ___ 30 _____ 30 ______ Read data from ECU address
20 _____ addr1 __ addr2 ___ addr3 __ addr4 ___ msb ____ lsb ______ Write data to address


En gros, pour lire les infos à l'adresse AB12, je dois envoyer la commande 7FAB123030 à l'ECU. On peut le coder en binaire ou bien en ASCII. L'avantage du ASCII est qu'il n'est pas nécessaire d'envoyer une instruction "Stop" car l' ECU retourne l'info une seule fois. Donc pas besoin de décortiquer le message pour savoir où est le début et où se trouve la fin.

En ASCII, la commande 7FAB123030 devient: 7F313241423030

En gros, dans mon programme arduino, je dois faire un truc du genre:
Serial.print(7F313241423030)

While (Serial.available() > 0) {
Valeur adresse AB12 = serial.read()

Après, il faut "traduire"...

Alors, j'ai bon?
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Jeu 16 Mai - 17:02 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

heu j'ai pas tout compris
____________________________
http://simple-duino.com
Revenir en haut
supertotof78
Débutant

Hors ligne

Inscrit le: 05 Mar 2013
Messages: 11
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Jeu 16 Mai - 20:19 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

 En fait, afin que l'ecu transmette des infos, il faut lui envoyer un ordre. Sous la forme ASCII. Il commence par 7F, ensuite suivi de 4 caractères et terminé par 3030. Les 4 caractères sont spécifiques à chaque type d'info.

J'ai un tableau à disposition avec la liste de ces codes à 4 chiffres.

Une question: Arduino supporterait-il d'être allimenté directement par la batterie ou bien faut-il un régulateur de tension?
Revenir en haut
arnaud39
Débutant

Hors ligne

Inscrit le: 01 Avr 2013
Messages: 378
Masculin
Niveau d'éléctronique: Dieu vivant

MessagePosté le: Jeu 16 Mai - 20:24 (2013)    Sujet du message: Afficheur tableau de bord Répondre en citant

Normalement pour la batterie c bon, après tu peux avoir des modèles spéciaux qui posent problème
____________________________
Ancien admin du forum, co-fondateur tutoarduino.com
Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 19:42 (2017)    Sujet du message: Afficheur tableau de bord

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Projets -> Vos projets Toutes les heures sont au format GMT + 1 Heure
Aller à la page: 1, 2  >
Page 1 sur 2

 
Sauter vers:  

Index | creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino