ordi de bord

Trais intéressant! Merci de prêter autan d'attention a mon problème.

pour le programme en fait au premier voyage j'avais pas bien compris ce que je devais faire.
Du coup j'ai redresser le tir avec le programme suivant de test:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup(){
  Serial.begin(9600);
  
  lcd.begin(20, 4);
  
   lcd.setCursor(0,0);
 lcd.print("Ti");
 lcd.setCursor(0,1);
 lcd.print("To");
 
  pinMode(A0, INPUT);
}

void loop() {
 int sonde=A0; 
 int temp_val=0;
 int temp_in=analogRead(sonde);
 int quadran= map(temp_in,220,756,0,6);
 int Temp;

switch(quadran)
 {
  case 0:
  temp_val=218;
  Temp= map(temp_in,220,235,0,20);//metre la formule ajuster a la portion de courbe
    break; 
 
 case 1:
 temp_val=235;//metre la formule ajuster a la portion de courbe
    Temp = map (temp_in,235,247,20,30);
     break; 
    
    case 2:
    temp_val=247;//metre la formule ajuster a la portion de courbe
     Temp = map(temp_in,247,343,30,50);
       break;
    
  case 3:
  temp_val=343;//metre la formule ajuster a la portion de courbe
        Temp = map(temp_in,343,611,50,80);
     break; 
 
 case 4:
 temp_val=611;//metre la formule ajuster a la portion de courbe
 Temp = map (temp_in,611,756,80,100);
    break; 
    




}

  Serial.print("temp_val");   
 Serial.print(temp_in);
 Serial.print("temp_val");
 Serial.println(Temp);

 lcd.setCursor(3,0);
 lcd.print("   ");
 lcd.setCursor(3,1);
 lcd.print("   ");
 lcd.setCursor(3,0);
 lcd.print(temp_in);
 lcd.setCursor(3,1);
 lcd.print(Temp);
  lcd.setCursor(0,2);
 lcd.print("   ");
 lcd.setCursor(0,2);
 lcd.print(quadran);

 delay(500);
 
 
}

Seul problème et que si je change pas de centaine entre deux "case" au moment de la transition entre deux état que je souhaite il ne ce passe rien.
Deuxième problème est que si je triche en modifiant la valeur de "case 1" a 300 je vais avoir la transition, mais je vais rester sur la map du "case 0" au lieux de celle du case 1.

Tu donnes 7 valeurs a quadran mais tu n'utilise que 5 case. Du coup, les valeurs de temps_in sont en dehors de celle que tu cibles dans les map de tes case.

ah oui petit détail que j'avais oublier de corriger... Merci!

ahhhhhhh forcément je commençait a désespérer de ne pas arriver a fractionner mes quadran comme je le souhaitais!

Bon je vais corriger tous çà est modifier ce qu'il faut. Merci beaucoup pour les info!

ouf c'est bon, je commençait a m’arracher les cheveux. Mais là c'est nickel. 8)

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);



void setup(){
  Serial.begin(9600);
  
  lcd.begin(20, 4);
  
   lcd.setCursor(0,0);
 lcd.print("Ti");
 lcd.setCursor(0,1);
 lcd.print("To");
 
  pinMode(A0, INPUT);
}

void loop() {
 int sonde=A0; 
 int temp_val=0;
 int temp_in=analogRead(sonde);
 int quadran= map(temp_in,220,756,0,4);
 int Temp;

if (temp_in >= 220 && temp_in <235 ) quadran =0;
if (temp_in >= 235 && temp_in <247 ) quadran =1;
if (temp_in >= 247 && temp_in <343 ) quadran =2;
if (temp_in >= 343 && temp_in <611 ) quadran =3;
if (temp_in >= 611 && temp_in <756 ) quadran =4;

switch(quadran)
 {
 case 0:
 Temp= map(temp_in,220,235,0,20);
 break; 
  
 case 1:
 Temp = map (temp_in,235,247,20,30);
 break; 
 
 case 2:
 Temp = map(temp_in,247,343,30,50);
 break;
    
 case 3:
 Temp = map(temp_in,343,611,50,80);
 break; 
 
 case 4:
 Temp = map (temp_in,611,756,80,100);
 break; 

}

  Serial.print("temp_val");   
 Serial.print(temp_in);
 Serial.print("temp_val");
 Serial.println(Temp);

 lcd.setCursor(3,0);
 lcd.print("   ");
 lcd.setCursor(3,1);
 lcd.print("   ");
 lcd.setCursor(3,0);
 lcd.print(temp_in);
 lcd.setCursor(3,1);
 lcd.print(Temp);
  lcd.setCursor(0,2);
 lcd.print("   ");
 lcd.setCursor(0,2);
 lcd.print(quadran);

 delay(500);
 
 
}

Par contre c'est de quel variable que tu ma parle a décaler?

parce que j'ai tenter de les déplacer mais ensuite je pense que les variable ne sont pas réactualiser car les valeur étaient nul ou fixe.

Bonsoir,

5_cylindres:

int quadran= map(temp_in,220,756,0,6);

3ème remarque :
la fonction "switch...case" ne sait gérer que des valeurs uniques en entrée, pas des fourchettes : c'est à toi de créer ces valeurs (0, 1 ... maxi) en fonction de ta lecture, par plages.

J'arrive un peu tard, mais si je peux me permettre...juste pour vous simplifier la vie.
comme map joue sur des entiers, il retournera 0 ou 1 ou ....6 (donc les if avec fourchettes sont inutiles)
"The map() function uses integer math so will not generate fractions, when the math might indicate that it should do so. Fractional remainders are truncated, and are not rounded or averaged. "

je ne suis plus totalement sure, mais il me semble que, si tu utilise des else if quand tu détermine les valeurs de quadran, ça peut éviter la lecture des else if suivant celui où la condition est validée. ça peut faire gagner du temps d’exécution, si tu place les conditions correspondants à la température de fonctionnement du moteur au début de la liste. Vue que le moteur chauffe en quelques minutes pas la peine que les lignes de code pour les températures en dessous de 70 degrés soit lue en premier.

si tu copie colle le code, pense a retirer la fonction map dans int quadran= map(temp_in,220,756,0,4); elle ne sert plus a rien.

Ah oui effectivement.

Je vais mètre tous çà en forme et l’intégrer a mon code principal.

genre comme çà:

 int sonde; 
 int temp_in;
 int quadran;
 int Temp;

void setup(){

   pinMode(A0, INPUT);

}

void loop() {
 
 sonde=A0; 
 temp_in=analogRead(sonde);

if (temp_in >= 611 ) quadran =4;
else if (temp_in >= 343 && temp_in <611 ) quadran =3;
else if (temp_in >= 247 && temp_in <343 ) quadran =2;
else if (temp_in >= 235 && temp_in <247 ) quadran =1;
else if (temp_in >= 220 && temp_in <235 ) quadran =0;

switch(quadran)
 {
 case 0:
 Temp= map(temp_in,220,235,0,20);
 break; 
  
 case 1:
 Temp = map (temp_in,235,247,20,30);
 break; 
 
 case 2:
 Temp = map(temp_in,247,343,30,50);
 break;
    
 case 3:
 Temp = map(temp_in,343,611,50,80);
 break; 
 
 case 4:
 Temp = map (temp_in,611,756,80,100);
 break; 
}

Oui la vitesse m'importe peut dans mon cas, mais si je peut directement apprendre de la bonne manière c'est encore mieux!

Je pense que je trouverais bien d'autre applications a programmer. :grin:

En utilisant un ADC externe qui se branche sur le port SPI tu peux facilement ajouter 8 entrés analogues en utilisant que 4 broches sur le port digitale.

Le circuit suivant, le TLC1518, a une résolution de 10 bits, donc la même que le port analogue qu'on retrouve sur le Arduino.

Si tu utilises déjà la bibliothèque SPI dans ton projet, ça ne fera pas une grande différence au niveau de la mémoire que tu utilises.

5_cylindres:
mais dans l'absolu, tu ne gagneras que qqs µs, c'est surtout utile quand tu dois gérer des phénomènes rapides, ou savoir réagir vite à une capture, or les t° ne varient pas si vite, il y a une certaine inertie thermique dans un moteur, pas comme dans un proc qui peut passer de 45 à 60°C en qqs s (ce qui est déjà lent pour l'électronique même si c'est rapide pour nous)

bye

En faite c'est pas pour le capteur de température qu'il faut gagner des µs mais pour la boucle complète, il faut vraiment optimiser le code de chaque sonde et le traitement de son signal. C'est toujours dans le but de pouvoir rafraichir les tr/min le plus souvent possible, et avoir un affichage plus fluide sans perdre d'informations.

En fait pour le moment le rafraichissement ce fait a chaque phase de détection d'un cran sur mon vilebrequin. Donc 5 fois plus souvent que mon régime moteur.
J'ai due mètre un petit délai pour avoir une lecture plus stable.

Mais hier soir je réfléchissais au problème car je souhaiterais gérer ma pression de turbo avec une électrovanne en PWM.
Je pense que je vais donc devoir modifier mon compte tour pour qu'il n'influe pas sur le déroulement du programme...

Merci de ton soutien 5_cylindres, car effectivement ce n'est pas le projet du siècle mais pour me faire la main c'est déjà sympa je trouve. :smiley:

Sinon pour mon turbo pensez vous que je doive utiliser une régulation PID pour gérer mon électrovanne ou avec de simple limites ou niveau de pwm a l’approche de la pression voulue?
Sachant toujours que c'est un camion avec une montée en régime qui n'est pas fulgurante mais la pression de turbo est plutôt réactive.

Initialement le type demandait si c'était possible de brancher plus que 6 trucs analogues la réponse est oui, mais ça prend un ADC externe. Le reste du bla bla ne m’intéresse guère.

pas grave je vais cherche sur les pid. Je vais bien trouver quelque chose!

le "type" comme tu dis était Beru et non McFleury

Possible, je n'ai nommé aucun nom. Mais une chose est certaine, c'est que t'as plus de jasette que moi.lol Et je suis pourtant assez dur à battre habituellement

Salut tous le monde!

Me voila de retour après une petite période d’absence suite entre autre a l’arrivée d'un petit bout.

Donc aujourd’hui"huit je me décide enfin vue que j'ai le camion sous la main a reprendre le travail sur l'ordi de bord!
Au moment du câblage petit problème avec ma mesure des sondes.
Je recherche donc le schéma que câblage qui avait été poster ici et là misère les post on disparut! :fearful:

Quelqu'un sais t'il pour quoi il manque des messages sur le post?

Sinon petite photo en cour d’intégration a la place du cendrier:

J'ai pas fait le ménage... mais il y a eu un peu de houle certaine fois sur le serveur.... peut-être une explication