ordi de bord

pour les sondes de température, tu pourrais utiliser sinon des capteurs oneWire de type DS18b20, comme ça ils sont tous en // sur une seule broche numérique, et tu conserves tes entrés analogiques pour les capteurs que tu ne peux pas remplacer.

Je vais y zieuter ça de très près ! Es tu le bricofoy qui a réaliser un tuto sur le rejointage d une pompe VE?

Je vais faire un montage similaire au display pour vr6, je vais modifier la partie rpm qui sera reprise sur le volant moteur ou le vilebrequin avec un capteur effet hall

oui :slight_smile: j'ai d'ailleurs depuis 6 ans les photos pour faire le même avec la pompe à LDA (pour turbo) mais je n'ai pas trouvé le temps...

à ma connaissance, personne ne m'a encore piqué mon pseudo nulle part, donc si tu croise un bricofoy ailleurs, c'est moi :slight_smile:

d'ailleurs je pense à un truc, il existe aussi des convertisseurs A/D sur le bus oneWire, si vraiment il te faut des entrées en plus.

bricofoy:
...
d'ailleurs je pense à un truc, il existe aussi des convertisseurs A/D sur le bus oneWire, si vraiment il te faut des entrées en plus.

Bonjour

Oui, j'aime bien les compos 1W, MAIS attention à une chose importante :
si le bus 1W est agréable d'interfaçage c'est aussi un bus lent, donc bien cerner les contraintes de temporalité des process

bricofoy:
oui :slight_smile: j'ai d'ailleurs depuis 6 ans les photos pour faire le même avec la pompe à LDA (pour turbo) mais je n'ai pas trouvé le temps...

à ma connaissance, personne ne m'a encore piqué mon pseudo nulle part, donc si tu croise un bricofoy ailleurs, c'est moi :slight_smile:

d'ailleurs je pense à un truc, il existe aussi des convertisseurs A/D sur le bus oneWire, si vraiment il te faut des entrées en plus.

Je fais parti d un forum dieseliste (fioul engine) d ailleur j ai une prepa sur le bloc de la golf :slight_smile:

Avez vous zieuter le lien code source google? J aimerai un avis.

ouais, mais en l’occurrence mesurer des températures sur un moteur, les variations ne sont pas à la milliseconde... et la lenteur du bus dépend aussi beaucoup du nombre de trucs qui y sont reliés, donc si il n'a a que 4 capteurs, tu vas avoir une lecture des 4 capteurs toutes les 2 secondes dans le pire des cas. ça reste une vitesse raisonnable vu l'application.

ben pour ce qui est de relier une sonde via un circuit RC, comme te l'a expliqué artouste, c'est peu précis. et il est bien plus compétant que moi sur la question :slight_smile:

d'une manière générale, j'aime pas les bidouilles analogiques, je préfère de loin utiliser un composant dédié qui me donne directement une valeur numérique. Pour l'analogique, il faut faire plein de calculs, prendre en compte plein de truc pouvant donner des perturbations, etc etc...

bricofoy:
ouais, mais en l’occurrence mesurer des températures sur un moteur, les variations ne sont pas à la milliseconde... et la lenteur du bus dépend aussi beaucoup du nombre de trucs qui y sont reliés, donc si il n'a a que 4 capteurs, tu vas avoir une lecture des 4 capteurs toutes les 2 secondes dans le pire des cas. ça reste une vitesse raisonnable vu l'application.

oui ! peut etre ! ou peut etre pas ! :grin:

Mais c'est mon coté ... "toujours reflechir un peu d'abord" 8)
déjà pour simple exemple en restant sur du 1W pour 4 DS18B20 (les compos 1W les plus utilisés/referencés)
la conversion intrinseque seule à resolution max ,cela demande 750 ms (le bus étant alors captif) , par habitude et par confort (integration des demandes/lectures sur le bus)
je table mini sur une acquisition capteur/seconde, ce qui peut etre parfaitement acceptable et parfaitement inacceptable selon "ce que l'on veut faire" 8)
Et là on est déjà facteur 2 sur tes 4 capteurs toutes les 2 secondes 8)

rien de pire que de choisir des capteurs, qui s’avèrent finalement inutilisables pour une appli

pour débuter , il me faudrait les sondes suivantes:

T°C d'huile, une sonde deux fil (+ et -)
Pression d'huile sonde deux fil (+ et -)
T°C d'admission: 2 fils (+ et moins)
T°C EGT: 2 fils (+ et -)
prm: 3 fils : +, signal et masse.

Salut a tous!

Je n'ai pas trouver de section pour me présenter donc si il en a une j’irais faire ma petite présentation.
Novice dans la programmation arduino, j'ai déjà monter une gestion pour turbo a géométrie variable trouver sur le net sur base de uno.

Salut Beru tu va bien? j'ai trouver ton projet ici et vue que je vais faire la même chose sur notre camion je venais au nouvelles.

Pour ma part j'ai commencer a plancher sur le sujet je vais utiliser un arduino mega 2560 avec un écran 20X4
Le montage sera prévu pour un lt35 dépanneuse ou l'on viens de changer le moteur par un 5 cylindres tdi-m. Vue que l'ancien moteur a couler une bielle a cause des mauvaise information donner par le tableau de bord rudimentaire, je veut essayer de lui faire un petit ordinateur de bord évolutif.

Les bases a mesurer sont diverse températures, pression collecteur.
Les sorties, deux niveau de refroidissement, 4 niveau de led de couleur pour faire un schift light (car il n'y a pas de compte tour) et une alarme sonore
Sur l'afficheur les tr/min, pression de sural et en défilement les températures.

Pour le calcul des valeur de sonde de température j'ai un autre programme ou çà a déjà été intégrer il faudra donc extraire les bonne ligne de programmation.

pour le calcul des tr/min, j'ai fait ça dans ma gestion de groupe électrogène disponible ici : Commande automatique de groupe électrogène - machine à états et autres questions - Réalisations et Projets Finis - Arduino Forum (voir la dernière version du code) en utilisant un capteur de proximité qui compte des dents sur le volant moteur

merci de l'info je vais aller voir çà de plus prêt. :wink:

Salut,

Pour revenir à la lecture des infos analogiques, je me suis posé pas mal de questions. J'ai constaté que déjà, la référence du CAN, c'est VCC, et que le petit régulateur de l'arduino est vraiment crade, et VCC bouge beaucoup. Donc pour commencer, il faut lui donner une vraie référence bien stable. Il faut peut-être intervenir au niveau du core arduino également, car dans wiring_analog.c, on peut lire :

uint8_t analog_reference = DEFAULT;

void analogReference(uint8_t mode)
{
	// can't actually set the register here because the default setting
	// will connect AVCC and the AREF pin, which would cause a short if
	// there's something connected to AREF.
	analog_reference = mode;
}

L'idée d'un court-circuit n'est pas très engageante...

Pour les capteurs en eux-même, si on peut les déconnecter du circuit 12V, j'utilise un petit générateur de courant à base d'un PNP (genre 2N2905 ou 2N2907). Si on fait passer un courant constant dans une résistance, on obtient alors une tension constante, complètement indépendante de l'alimentation, c'est déjà un grand pas en avant! de plus, la tension obtenue est directement proportionnelle à la valeur de la résistance (mesure linéaire).
Par exemple, si on fait passer 1mA dans une résistance, alors la tension mesurée en mV sera égale à la résistance (utile pour faire des mesures, non?).

Autre exemple, on veut mesurer un capteur qui donne une résistance de 1000 à 3500 ohms, on en déduit que pour un courant de (5/3500) = 1,43mA, on peut alors mesurer une tension de 5V pour 3500ohms et 1,43V pour 1000ohms. La conversion donnera alors une valeur entre 293 pour 1000ohms et 1023 pour 3500ohms, sous une tension de référence AREF de 5V.

hi hi hi...

Pour mon précédent montage j'avais utiliser un transistor (7808) pour réguler la tentions d’alimentation de l'arduino avec les réutilisation de 5V de celui ci pour les capteur.
Je n'ai pas noter de tentions bizarres ou de fonctionnement aléatoire. Seulement sur mon capteur de régime moteur après avoir rallonger les fils qui ce sont mis a capter des interférences. (je n'avais pas utiliser des fils blindées...)

Je vais citer ici le programme que j'ai déjà utiliser qui proviens du net.
Ce programme sert a gérer un turbo a géométrie variable et la lda sur une pompe a injection de turbo diesel.
Il mesure également deux sondes de température.

J'aimerais me baser sur ce programme pour extraire les gestion de sondes et de régime moteur.

};

// R1 = 2400ohm, R2 = old style Bosch temp sensor
unsigned char tempMap[] = {
    'M','1','D',
    0x8,0x1,0xAB,0x00,0xAA,
    // values at -64,-32,0,32, 64,96,128,160 °C
    175+64,120+64,90+64,62+64,44+64,30+64,6+64,-55+64,
//    255,227,179,109,51,19,9,0,  Calculated from bosch reference, does not seems to be accurate?
    00,00,00,                  // lastX,lastY,lastRet
};

// Use slighly logaritmic output positions instead of plain linear
/*unsigned char vntActuatorMovementRemap[] = {
 'M','1','D',
 0x8,0x0,0xDE,0xAD,0x00,
 0,2,8,20,50,90,180,255
 };

// used for RPM counting
volatile unsigned long rpmLastTeethSeenTime = 0;
volatile unsigned long rpmNow = 0;


[code]

Vous pouvez trouver le programme entier ici -> [url=http://dmn.kuulalaakeri.org/vnt-lda/]http://dmn.kuulalaakeri.org/vnt-lda/[/url]

[/code]

bon j'ai commencer a taper un code je me suis inspirer de la base de bricofoy merci a lui XD.

Je ne comprend pas encore bien tous ce que je fait, il y a des erreurs pour le moment que je ne comprend pas... "assignment of read-only variable 'A..' "

voici mon début de code

/*
Ordinateur de bord pour lt 35 2.5 tdi
V1
*/

// donées mécaniques

#define nbr_phases_vilo  5     // nombre de phases capter sur le vilbrequin pour un tour moteur
#define rpm_led1         4000  // led vertes
#define rpm_led2         4250  // led vertes
#define rpm_led3         4500  // led orange
#define rpm_led4         5000  // led rouge
#define temp_eau_def     108   // température de déclenchement de l'alarme surchauffe en C°
#define vent1_on         92    // température de déclenchement du premiere ventilateur en C°
#define vent2_on         96    // température de déclenchement du second ventilateur en C°
#define vent1_off        82    // température de d'arret du premier ventilateur en C°
#define vent2_off        86    // température de d'arret du second ventilateur en C°
#define temp_oil_def     130   // température de déclenchement de l'alarme température d'huile en C°



// brochage des entrées

#define eauPin    A0    //sonde de température d'eau moteur
#define oilPin    A1    //Sonde de température d'huile moteur
#define airPin    A2    //Sonde de température d'air d'admission
#define mapPin    A3    //capteur pression suralimentation
#define g28Pin    13   //entrée capteur régime moteur
#define g80Pin    12    //capteur levée d'aiguille

// brochage des sorties

#define g28Pin    13    //entrée capteur régime moteur
#define g80Pin    12    //capteur levée d'aiguille
#define N75Pin    11    //commande de vanne de turbo
#define wPin      10    //sortie info W pour ancien compteur vag
#define vent1Pin  A8 
#define vent2Pin  A9
#define alPin     A10   //alarme sonore
#define led1Pin   A12
#define led2Pin   A13
#define led3Pin   A14
#define led4Pin   A15

// variables globales
unsigned int rpm_moteur; 	//vitesse de rotation moteur.

//variables utilisees en interruption (volatile = stockees en RAM)
volatile unsigned int rpm_cpt;                     //compteur de passage en interruption. Pour savoir cb de périodes sont utilisées pour le calcul de F
volatile unsigned long rpm_periode;                //periode des implulsion du capteur de rotation
volatile unsigned long rpm_tprecedent,rpm_tcourant;//temps utilisés pour calculer la périod


;void setup()
{
  pinMode(eauPin, INPUT);
  pinMode(oilPin, INPUT);
  pinMode(airPin, INPUT);
  pinMode(mapPin, INPUT);
  pinMode(g28Pin, INPUT_PULLUP);
  pinMode(g80Pin, INPUT_PULLUP);
  
  pinMode(vent1Pin, OUTPUT);
  pinMode(vent2Pin, OUTPUT);
  pinMode(alPin,    OUTPUT);
  pinMode(led1Pin,  OUTPUT);
  pinMode(led2Pin,  OUTPUT);
  pinMode(led3Pin,  OUTPUT);
  pinMode(led4Pin,  OUTPUT);
  pinMode(N75Pin,   OUTPUT);
  pinMode(wPin,     OUTPUT);
}

void calcule_rpm() {
  //calcul de la vitesse de rotation du moteur.
  
  //on calcule la fréquence avec 1*60*1000/période car la période est en ms (*1000), et que l'on veut la fréquence en tr/min et non en Hz ou tr/s (*60)
  //on divise ensuite le total par le nombre de dents comptées par le capteur sur 1 tour moteur
  //la periode est une moyenne des rpm_cpt periodes mesurees en interruption avant passage par ici
  
  //Serial.print(rpm_cpt);
  //Serial.println(" ");  
  if (rpm_cpt)
    rpm_moteur = (unsigned int)(60000/(rpm_periode/rpm_cpt))/nbr_phases_vilo;
    rpm_cpt = 0; 			//remise à zero du compteur pour les prochaines mesures
    rpm_periode = 0;			//idem pour la periode 
}

//Gestion des ventilateurs

void ventilateurs(){
 
  vent1Pin = digitalRead(eauPin);


  if (eauPin > vent1_on) {       // enclenchement du premier ventilateur
        
    digitalWrite(vent1Pin, HIGH);  
  } 
  else (eauPin < vent1_off); {
   
    digitalWrite(vent1Pin, LOW); // déclenchement du ventilateur
  }
    vent1Pin = digitalRead(eauPin);


  if (eauPin > vent2_on) {       // enclenchement du second ventilateur
        
    digitalWrite(vent2Pin, HIGH);  
  } 
  else (eauPin < vent2_off); {
   
    digitalWrite(vent2Pin, LOW); // déclenchement du ventilateur
  }
}
 // gestion des led pour passage de vitesse
 
 void led(){
    led1Pin = (rpm_led1);


  if (rpm_moteur > rpm_led1) {       // enclenchement led verte premier niveau
        
    digitalWrite(led1Pin, HIGH);  
  } 
  else (rpm_moteur < rpm_led1); {
   
    digitalWrite(rpm_led1, LOW);     // déclenchement led
  }
      led2Pin = (rpm_led2);


  if (rpm_moteur > rpm_led2) {       // enclenchement led verte deuxiemme niveau
        
    digitalWrite(led2Pin, HIGH);  
  } 
  else (rpm_moteur < rpm_led2); {
   
    digitalWrite(rpm_led2, LOW);     // déclenchement led
  }
      led3Pin = (rpm_led3);


  if (rpm_moteur > rpm_led3) {       // enclenchement led orange
        
    digitalWrite(led3Pin, HIGH);  
  } 
  else (rpm_moteur < rpm_led3); {
   
    digitalWrite(rpm_led3, LOW);     // déclenchement led
  }
      led4Pin = (rpm_led4);


  if (rpm_moteur > rpm_led4) {       // enclenchement led rouge
        
    digitalWrite(led1Pin, HIGH);  
  } 
  else (rpm_moteur < rpm_led4); {
   
    digitalWrite(rpm_led4, LOW);     // déclenchement led
  }
}

la fatigue prenant le dessus, je te dirais juste que quand tu fais "if (eauPin > vent1_on)", le compilateur traduit en "if (A0 > 92)", ce qui sera toujours faux (A0 = qqchose comme 14 je crois).

il faut donc faire "if (analogRead(eauPin) > vent1_on)" pour déclencher une conversion de eauPin.

ensuite, ";void setup()" ne doit pas trop marcher (le point-virgule)

"vent1Pin = digitalRead(eauPin);" ne peut pas marcher, vent1Pin est un alias, une constante, tu ne peut pas lui assigner une valeur. par contre, digitalWrite(vent1Pin, digitalRead(eauPin)); devrait te rendre un petit service.

Je ne vais pas plus loin, j'aurais plus vite fait de réécrire ton code que de le corriger en t'expliquant.

relis tout et bon courage,

Cinci

Merci beaucoup d'avoir pris le temps de me répondre.

Je vais reprendre mon travail et corriger çà déjà. XD

Bon j'ai reçu tous le matos et hier j'ai commencer a programmer pour tester l'écran lcd.

J'y vais par étapes car je ne comprend pas tous encore mais déjà çà commence a m'éclater XD

Donc j'ai commencer par programmer ce que je veut afficher:

Depuis j'en ai rajouter et j'ai également programmer un capteur map pour mesurer la pression du collecteur d'admission.
Mon code actuel:

/*

 
 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
  */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
   // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  
    lcd.begin(20, 4);
  
      
   lcd.setCursor(0,0);
  lcd.print("RPM");
    lcd.setCursor(8,0);
  lcd.print("Tr");
  
 
    lcd.setCursor(16,0);
  lcd.print("Bar");
  
   lcd.setCursor(0,1);
  lcd.print("Eau");
    lcd.setCursor(6,1);
  lcd.print("C");
    lcd.setCursor(0,3);
  lcd.print("Huile");
    lcd.setCursor(8,3);
  lcd.print("C");
    lcd.setCursor(0,2);
  lcd.print("Air");
    lcd.setCursor(6,2);
  lcd.print("C");
  
   lcd.setCursor(10,1);
  lcd.print("Vent1");
    lcd.setCursor(10,2);
  lcd.print("Vent2");
  
}

void loop() {
    int capteurMap = analogRead(A0);                 // capteur MAP
                                                      // Converssion lecture annalogique (de 0 - 1023) en pression de (-1 à 1bar):
  float pression =0.441*(capteurMap*(5/1023.0))-1;    // 0.44 et la valeur a modifien en fonction du capteur map. (0.44 pour capteur de 200Kpa)
  // print out the value you read:
  Serial.println(pression);
  
     lcd.setCursor(11,0);
  lcd.print(pression);
}

beau boulot, tu avance bien!
Si je peux me permettre un conseil, (j'ai déjà réalisé ce type de code pour un obd et un mano) j'ai remarqué qu'avec l’acquisition de multiple capteurs, la mise a jour des données pouvais ralentir. C'est flagrant sur le régime moteur, les pics de régimes ne sont pas affichés car l'arduino doit voir tous les autres capteurs avant de revenir sur celui des tr/min. L'astuce que j'utilise consiste a écrire un fonction en dehors de la void loop pour chaque capteur, et d'appeler la fonction tr/min entre tous les capteurs. Ça permet de mettre a jour les tr/min beaucoup plus souvent, sans surcharger le code, il faut bien entendu inclure la mise a jour du lcd dans la fonction tr/min.

Oui je voie ce que tu veut dire mais je ne sais pas encore ques que tu entend par écrire une fonction pour les capteurs en dehors de " Void loop"
Car si tel est le cas elle ne sera pas rafraichie a chaque tour du programme. Non?

De plus j'ai mis une tempo pour faire clignoter ma sortie d'alarme mais cette tempo me ralentis toute l’exécution du programme. Y a t'il une solution pour que la tempo soit uniquement affecter a mon utilisation sans bloquer le rafraichissement tous le programme?

Sinon j'ai bosser toute la journée et j'ai bien avancer! :astonished:

/*

 
 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Capteurs:
 * Map sur Analogic A0
 
  */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int eauPin = A0;    // sonde d'eau
int vent1Pin = A8;
int vent2Pin = A9;
int alarme = A10;

void setup() {
   // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  
  lcd.begin(20, 4);
      
  pinMode(vent1Pin, OUTPUT); 
  pinMode(vent2Pin, OUTPUT);
  pinMode(alarme, OUTPUT);
  
      
   lcd.setCursor(0,0);
  lcd.print("RPM");
    lcd.setCursor(8,0);
  lcd.print("Tr");
  
 
    lcd.setCursor(16,0);
  lcd.print("Bar");
  
   lcd.setCursor(0,1);
  lcd.print("Eau");
    lcd.setCursor(7,1);
  lcd.print("C");
    lcd.setCursor(0,3);
  lcd.print("Huile");
    lcd.setCursor(9,3);
  lcd.print("C");
    lcd.setCursor(0,2);
  lcd.print("Air");
    lcd.setCursor(7,2);
  lcd.print("C");
  
   lcd.setCursor(10,1);
  lcd.print("Vent1");
    lcd.setCursor(10,2);
  lcd.print("Vent2");
  
}

void loop() {
    int capteurMap = analogRead(A0);                 // capteur MAP
                                                      // Converssion lecture annalogique (de 0 - 1023) en pression de (-1 à 1bar):
  float pression =0.441*(capteurMap*(5/1023.0))-1;    // 0.44 et la valeur a modifien en fonction du capteur map. (0.44 pour capteur de 200Kpa)
  // print out the value you read:
  Serial.print("pression:");
  Serial.print(pression);
  
     lcd.setCursor(11,0);
  lcd.print(pression);

  
  // Gestion des ventilateurs et aficheage temp d'eau
  
  int eauValue = analogRead(A0);  // variable température d'eau
  int tempEau = eauValue*0.12; 
  
   { if (tempEau >= 70)          // enchlenchement V1        
  digitalWrite(vent1Pin, HIGH);
     if (tempEau >= 90)          // enchlenchement V2         
  digitalWrite(vent2Pin, HIGH);
     } 
   { if (tempEau <= 75)          // déchlenchement V1 
  digitalWrite(vent1Pin, LOW);
     if (tempEau <= 85)          // déchlenchement V2
  digitalWrite(vent2Pin, LOW);  
     }
   
  Serial.print("tempEau:");
  Serial.print(tempEau);
  
    lcd.setCursor(4,1);          // effacement valeur d'eau précédente
  lcd.print("   ");
    lcd.setCursor(4,1);
  lcd.print(tempEau);            // affichage temps d'eau
  
  // Affichage temps D'huile
  
  int HuileValue = analogRead(A0);  // variable température d'huile
  int tempHuile = HuileValue*0.15; 
  
   Serial.print("tempHuile:");
  Serial.print(tempHuile);
  
   lcd.setCursor(6,3);          // effacement valeur d'huile précédente
  lcd.print("   ");
    lcd.setCursor(6,3);
  lcd.print(tempHuile);            // affichage temps d'huile
  
    // Affichage temps D'Air
  
  int AirValue = analogRead(A0);  // variable température d'air
  int tempAir = AirValue*0.1; 
  
   Serial.print("tempAir:");
  Serial.println(tempAir);
  
   lcd.setCursor(4,2);          // effacement valeur d'Air précédente
  lcd.print("   ");
    lcd.setCursor(4,2);
  lcd.print(tempAir);            // affichage temps d'air
 
  
  // alarme
  
  {if ((tempEau >= 110) || (tempHuile >= 130) || (tempAir >= 90)) 
    digitalWrite(alarme, HIGH);
    delay(500);
    digitalWrite(alarme,LOW);
    delay(500);
  
 
 }
}

petite vidéo a suivre pour montrer le fonctionnement.
J'ai volontairement utiliser qu'une seule entrer pour tester actuellement...