Aller au contenu

Microprix  MECATECHNIC - Pièces et accessoires pour Volkswagen Coccinelle, Cox cabriolet, Buggy, Combi split, Bay window, Transporter

Photo

Pilotage De L'ecu Arduino Diy: Le Combiduino

Arduino ECU

36 réponses à ce sujet

#1 sarahconnors

sarahconnors

    VW Addicted

  • Membres
  • 510 messages
  • Localisation:cannes 06

Posté 09 septembre 2015 - 13:27

J'ouvre ce nouveau post en rapport avec celui ci http://www.old-dropp...showtopic=38723

pour ne pas le polluer avec ce nouveau développement.

L'objectif de ce post est de créer une gestion autonome de l'ECU, à bas coût, sans soudure, sans connaissance en electronique ni informatique.

 

Cet outil sera plus sommaire que l'Apps Iphone que veut créer Scourtaud. Mais elle permettra de piloter L'ECU sans smart phone.

 

Le cahier des charges, pour l'instant est :

- l'outil doit être autonome il fonctionnera donc en bluetooth avec l'ECU

- permet de récupérer les données essentielle de l'ECU : RPM, dépression, cartographie actuelle, degré avance actuel, activation multispark, cliquetis détecté par l'ECU, etc

- il permettra de programmer l'ECU : changement de cartographie, activation/désactivation multispark, avance/retard manuel, seuil de cliquetis, etc

 

Toutes ces informations seront affichées sur un petit écran LCD. Des boutons permettront de naviguer dans les menus, de modifier des valeur de l'ECU.

 

1/ Le materiel

Pour faire cela le matériel suivant sera nécessaire :

- une carte arduino Uno (ou autre) env 5$

par exemple : http://www.ebay.fr/i...=item51d61dca74

 

- une fiche pour l'alimenter avec une pile (pas obligatoire) env 3$

par exemple http://www.ebay.fr/i...=item5b0903fe4e

 

- Une carte bluetooth arduino env 10$

par exemple : http://imall.itead.c...ster-slave.html

 

- Un écran LCD avec des boutons intégrés (important ! ) env 5$

par exemple : http://www.ebay.fr/i...=item5b16912040

 

- Une boite pour mettre tout cela dedans (pas obligatoire mais plus joli !) env 4 $

par exemple :http://www.ebay.fr/i...=item4192c669c4

 

ET C'EST TOUT !!!!!!!!

 

Non, vous ne rêvez pas pour environ 30 euros vous pouvez avoir tout le matériel !

 

2/ Le montage

Passons à l'étape 2, le montage...

c'est hyper compliqué prévoyez 12 Heures de montage, soudure, etc .......Non, je déconnes faut 2 minutes !

 

Vous emboîtez la carte bluetooth sur la carte arduino, puis vous emboîtez la carte LCD sur la carte bluetooth.

Vous connectez la fiche jack sur l'arduino, vous branchez la pile 9V. et vous mettez tout dans la boite

 

ET C'EST FINI pour le montage !!!

 

3/ La programmation

Vous télécharger le software "arduino" sur votre PC.

 

Vous copiez le code ci dessous dans l'éditeur arduino.

Vous connectez la carte arduino par le port USB

Vous cliquez sur le bouton Transfert vers arduino

 

ET c'est TOUT !!

 

Voila le code de l'application arduino :

//-- INCLUDE-------
#include <LiquidCrystal.h>

boolean debugging = true;
String debugstring="";
//Serial input initailisation
String inputString = "";            // a string to hold incoming data
boolean stringComplete = false;     // whether the string is complete



// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// gestion des boutons
int lcd_key     = 0;
#define btnMENU   1
#define btnRIGHT  2
#define btnLEFT   3
#define btnUP     4
#define btnDOWN   5
#define btnNONE   0
int adc_key_in  = 0;
int pinbouton = A0;  // pin des boutons


// gestion des menus
const int nombre_de_menu = 2;
int menu_actuel = 1;
#define menu_principal  1
#define menu_1  2
#define menu_2  3
boolean rebuild_menu = true;
boolean refresh_menu = true;

// gestion des sous menu du menu 1
int sous_menu_1 = 1;
const int nombre_de_sous_menu_1 = 2;
#define sous_menu_1_carto  1
#define sous_menu_1_MS  2



// gestion des variable ECU
int KPA = 100;
int RPM = 1000;

int avance = 10 ;


// gestion des variables sous menu
int carto_demande = 1;
int carto_actuel = 1 ;
boolean carto_change = false;
const int carto_max = 3;

boolean multispark_demande = true;
boolean multispark_actuel = true;
boolean multispark_change = false;



unsigned long time = 0;
unsigned long timeold = 0;
unsigned const delai_rafraichissement = 300 ; // toute les secondes
void setup()
{
 lcd.begin(16, 2);              // start the library
 lcd.setCursor(1,0);
 lcd.print("Initialisation"); // print a simple message
 delay(1000);
 time = millis();
  Serial.begin(38400);    
 inputString.reserve(200);   
 gestion_affichage_des_menus();
}
 
void loop(){
time = millis();

  if (time - timeold >= delai_rafraichissement ){ // rafraichissemnt des menus complet
    timeold=time;
    gestion_des_actions();
  }
 
 //gestion_affichage_des_menus(); 
 
 }
 
 //----------------------------------------------------------
 //             ROUTINE
 //-----------------------------------------------------------

//----------------------------------
// gestion des actions utilisateurs
//----------------------------------
void gestion_des_actions(){
   debug(String(menu_actuel) + "|" + rebuild_menu + "|" + refresh_menu);
 lcd_key = read_LCD_buttons();  // lecture des boutons
 
 // action du menu principal
 if (menu_actuel == menu_principal) {
// gestion du changement de menu
  if (lcd_key == btnMENU) {
    debug("principal bouton menu");
     menu_actuel++;
     if (menu_actuel > nombre_de_menu ){menu_actuel = menu_principal;}
     rebuild_menu = true;
     refresh_menu = true;
     gestion_affichage_des_menus();
     return;
     }
 }
 
  // action du menu 1
 if (menu_actuel == menu_1) {
    // gestion du changement de menu
  if (lcd_key == btnMENU) {
    debug("menu1 bouton menu");
     menu_actuel++;
     if (menu_actuel > nombre_de_menu ){menu_actuel = menu_principal;}
     rebuild_menu = true;
     refresh_menu = true;
     gestion_affichage_des_menus();
     return;
     }
   //gestion du sous menu CARTO <==> MS
   if (lcd_key == btnLEFT) {
     debug("LEFT");
     sous_menu_1++;
     if (sous_menu_1 > nombre_de_sous_menu_1 ){sous_menu_1 = 1;}
     refresh_menu = true;
     gestion_affichage_des_menus();
   }  
    // gestion de la carto
   if (sous_menu_1 == sous_menu_1_carto){
     if (lcd_key == btnDOWN) {
       debug("CARTO DOWN");
       carto_demande++;
       if (carto_demande > carto_max ){carto_demande = 1;}
       refresh_menu = true;
       gestion_affichage_des_menus();
     }  
     if (lcd_key == btnUP) {
       debug("CARTO UP");
       carto_demande--;
       if (carto_demande < 1 ){carto_demande = carto_max;}
       refresh_menu = true;
       gestion_affichage_des_menus();
     }  
     if (lcd_key == btnRIGHT) { // validation du choix
      debug("CARTO RIGHT");
      carto_change = true;
      rebuild_menu = true;
      refresh_menu = true;
      envoiECU();
     }  
   }
      // gestion du multispark
   if (sous_menu_1 == sous_menu_1_MS){
     if ((lcd_key == btnDOWN) || (lcd_key== btnUP) ) {
       debug("MS DOWN UP");
       if (multispark_demande == true){multispark_demande = false;}else{multispark_demande = true;}
       refresh_menu = true;
       gestion_affichage_des_menus();
     }  
     if (lcd_key == btnRIGHT) { // validation du choix
      debug("MS RIGHT");
      multispark_change = true;
      rebuild_menu = true;
      refresh_menu = true;
      envoiECU();
     }  
   }
   
   
 } // de action menu 1
 
}


//------------------------------------
// Gestion des changements de menus
//------------------------------------
void gestion_affichage_des_menus(){
  if (rebuild_menu == true){ // gestion de l'affichage complet du menu
    RAZ_affichage(); // on efface tout
   if (menu_actuel == menu_principal){affichage_menu_principal();}
   if (menu_actuel == menu_1){affichage_menu_1() ;} 
   if (menu_actuel == menu_2){affichage_menu_2() ;} 
   rebuild_menu = false;
  }
  if (refresh_menu == true){ // gestion de l'affichage des valeurs uniquement du menu
    if (menu_actuel == menu_principal){refresh_menu_principal();}
   if (menu_actuel == menu_1){refresh_menu_1() ;} 
   if (menu_actuel == menu_2){refresh_menu_2() ;} 
    refresh_menu = false;
  }
}
//---------------------------------------
// affichage des titre du menu principal
//---------------------------------------
void affichage_menu_principal(){ 
  debug("aff menu princ");
 lcd.setCursor(4,0);
 lcd.print("RPM"); 
 lcd.setCursor(13,0);
 lcd.print("Kpa"); 
 lcd.setCursor(2,1);
 lcd.print("Deg"); 
 lcd.setCursor(9,1);
 lcd.print("Carto"); 
 refresh_menu = true;
  }
//---------------------------------------
// affichage des valeurs du menu principal
//---------------------------------------
void refresh_menu_principal(){ 
  debug("refresh princ"); 
 lcd.setCursor(0,0);
 lcd.print(Right(String(RPM),4) ); 
 lcd.setCursor(10,0);
 lcd.print(Right(String(KPA),3) ); 
 lcd.setCursor(0,1);
 lcd.print(Right(String(avance), 2) ); 
 if (multispark_actuel == true) {
   lcd.setCursor(6,1);
   lcd.print("MS"); 
 }else{
   lcd.setCursor(6,1);
   lcd.print("  "); 
 }
   
 lcd.setCursor(14,1);
 lcd.print(carto_actuel); 
}

//---------------------------------------
// affichage des titre du menu 1
//---------------------------------------
void affichage_menu_1(){ 
  debug("aff menu 1");
   lcd.setCursor(0,0);
   lcd.print(" CARTO"); 
   lcd.setCursor(7,0);
   lcd.print(" MS"); 
   sous_menu_1 = sous_menu_1_carto ; // choix carto par défaut
   carto_demande = carto_actuel;
   multispark_demande = multispark_actuel;
 //  refresh_menu = true;
 
}

//---------------------------------------
// affichage des valeurs du menu 1
//---------------------------------------
void refresh_menu_1(){ 
  debug("refresh menu 1");
 // gestion du * pour selection du menu
if (sous_menu_1 == sous_menu_1_carto){
  lcd.setCursor(0,0);
   lcd.print("*"); 
   lcd.setCursor(7,0);
   lcd.print(" "); 
} 
if (sous_menu_1 == sous_menu_1_MS){
  lcd.setCursor(0,0);
   lcd.print(" "); 
   lcd.setCursor(7,0);
   lcd.print("*"); 
} 
 // gestion des valeurs demandés
  lcd.setCursor(3,1);
  lcd.print(carto_demande); 
  
  if (multispark_demande == true){
    lcd.setCursor(8,1);
    lcd.print("ON "); 
  }else{
    lcd.setCursor(8,1);
    lcd.print("OFF"); 
  }
  
}

void affichage_menu_2(){ 
}

void refresh_menu_2(){
}

//---------------------------------
// Gestion ENTREES/SORTIES vers l'ECU
//---------------------------------
void decodeECU(){
}

void envoiECU(){

 // envoi de la nouvelle carto a l'ECU
  if (carto_change == true ){
   carto_change = false;
   carto_actuel = carto_demande;
   Serial.println("carto " + String(carto_demande) );
   message("  carto changé");
   rebuild_menu = true;
   refresh_menu = true;
   gestion_affichage_des_menus();
  }
  
  // envoi du multispark à l'ECU
  if (multispark_change == true ){
     multispark_change = false;
     multispark_actuel = multispark_demande;
     if (multispark_demande == true){
       Serial.println("ms on");
       message(" multispark ON");
     }else{
       Serial.println("ms off");
       message(" multispark OFF");
     }    
   rebuild_menu = true;
   refresh_menu = true;
   gestion_affichage_des_menus();
  }
  
}




//-----------------------------------
// envoi d'un message + pause de 2s
//-----------------------------------

void message(String str){
  RAZ_affichage();
   lcd.setCursor(0,0);
   lcd.print(str); 
   delay(2000);
}


//----------------------
// lecture des boutons
//----------------------
int read_LCD_buttons(){
 adc_key_in = analogRead(pinbouton);      // read the value from the sensor 
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnMENU;   
 return btnNONE;  // when all others fail, return this...
}
//---------------------------------------
// RAZ des 2 lignes d' affichage 
//---------------------------------------
void RAZ_affichage(){ 
lcd.clear();
}
// ---------------------------------
// cadrage a droite sur n caractere
// ---------------------------------
String Right(String str, int n){
 int iLen= 0;
 str = "              " + str;
    if (n <= 0)
       return "";
    else if (n > str.length()   )
       return str;
    else {
       iLen = str.length();
       return str.substring(iLen - n, iLen);
    }
}
// ----------------------------------
//  Recuperation des infos de l'ECU
//-----------------------------------
void serialEvent() {
 while (Serial.available()) {                    //whilst the serial port is available...
   inputString = Serial.readStringUntil('\n');   //... read in the string until a new line is recieved
   stringComplete = true;                      
 }
}
void debug(String str){
 if (debugging == true){
 Serial.println(str);
 } 
} 

Modifié par sarahconnors, 09 septembre 2015 - 13:49 .

Une 60', une 1500 de 69 et le nouveau venu le combi de 64' mon blog : http://restocombisplit.unblog.fr


#2 mathieu

mathieu

    Grosse bete ..

  • Moderateurs
  • 4 686 messages
  • Localisation:brest / caen

Posté 12 septembre 2015 - 09:39

Vraiment intéressant et super sympa de partager comme ca.

 

Dès que mon remontage est fini je me penche sur ton truc. Je galère pour trouver des pièces d'allumage pour remettre ma blackbox, alors c'est pas inintéressant ton truc :D


Rencard sur Brest http://www.vwbreizh.com/

#3 sarahconnors

sarahconnors

    VW Addicted

  • Membres
  • 510 messages
  • Localisation:cannes 06

Posté 13 septembre 2015 - 00:39

Ouaip, pas cher, pratique et simple a construire
Que demande le peuple!

Une 60', une 1500 de 69 et le nouveau venu le combi de 64' mon blog : http://restocombisplit.unblog.fr


#4 will

will

    VW Addicted

  • Membres
  • 450 messages
  • Localisation:Tours (37)
  • Interets:Les VW's

Posté 22 septembre 2015 - 01:29

Salut,

 

Alors moi je me demande ce qu'il faut comme allumeur pour utiliser ce système, à quelle configuration de moteur le système est il adapté, et surtout le mode d'emploi une fois tous ça assemblé et programmé !!!!!!!

 

Sinon, l'idée à l'air super intéressante même si je ne comprend pas la moitié du quart de se que vous raconté, mais c'est cool de partagé.

 

merci



#5 sarahconnors

sarahconnors

    VW Addicted

  • Membres
  • 510 messages
  • Localisation:cannes 06

Posté 22 septembre 2015 - 16:31

Salut,

en fait ce syteme est fait pour l'allumage du post :http://www.old-dropp...ic=38723&page=1

 

Mais on a un peu abandonné l'idée, car on va faire la même chose avec une Apps Iphone


Une 60', une 1500 de 69 et le nouveau venu le combi de 64' mon blog : http://restocombisplit.unblog.fr


#6 Jaar

Jaar

    Apprenti Pilote

  • Membres
  • 106 messages
  • Localisation:Val d'oise 95

Posté 19 février 2016 - 11:39

Salut

 

Petit état des lieux de mon avancement sur la modification du programme suite a l’évolution de combiduino.

 

J'ai (enfin) réussi a décrypter les donnés envoyés par Combiduino via le port série.

 

L'arduino UNO de pilotage me renvoi bien les valeurs voulues (par le port série pour tester sur mon pc si ca marche) RPM, KPA et avance.

 

Actuellement j'essai des les afficher sur l’écran mais j'ai encore un peut de boulot sur ce point. Il m'affiche 0 a la place des valeurs. Mais bon déjà il ne m'affiche plus les valeurs par défaut c'est déjà ça !!!

 

pilotagearduinoZqr3v.jpg

 

IMG0917_176963.jpg

 

La suite au prochain épisode !

 

Edit : Problème résolu !!!! affichage RPM, KPA et avance opérationnel 

maintenant transmition des changement de carto et Multi spark

 

Edit 2 : envoi ms on/off ok, et envoi carto 1/2/3/4/5 ok 

maintenant faut lire l'etat actuel de combiduino pour voir s'il est en carto 1,2,3,4 ou 5 et savoir s'il est en multi spark ou non vue qu'il y a l'i phone qui peut modifier aussi. 

 

Edit 3 : C'est bon ca marche !!!!

 

 

Voici le code pour l'arduino UNO


 

//-- INCLUDE-------

#include <LiquidCrystal.h>
 
boolean debugging = true;
String debugstring="";
//Serial input initailisation
String inputString = "";            // a string to hold incoming data
boolean stringComplete = false;     // whether the string is complete
 
 
 
// selection des pin utilisés par le LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// gestion des boutons
int lcd_key     = 0; // Variable de stockage du resultat de la fonction read_LCD_buttons()
#define btnMENU   1
#define btnRIGHT  2
#define btnLEFT   3
#define btnUP     4
#define btnDOWN   5
#define btnNONE   0
int adc_key_in  = 0; // variable de stockage des valeurs des boutons sur pin A0
int pinbouton = A0;  // pin des boutons
 
 
// gestion des menus
const int nombre_de_menu = 2;
int menu_actuel = 1;
#define menu_principal  1
#define menu_1  2
#define menu_2  3
boolean rebuild_menu = true;
boolean refresh_menu = true;
 
 
// gestion des sous menu du menu 1
int sous_menu_1 = 1;
const int nombre_de_sous_menu_1 = 2;
#define sous_menu_1_carto  1
#define sous_menu_1_MS  2
 
 
// gestion des variable ECU
int KPA = 100;
int RPM = 1000;
int avance = 10;
 
 
 
// gestion des variables sous menu
int carto_demande = 1;
int carto_actuel = 1 ;
boolean carto_change = false;
const int carto_max = 5;
 
boolean multispark_demande = true;
boolean multispark_actuel = true;
boolean multispark_change = false;
 
unsigned long time = 0;
unsigned long timeold = 0;
unsigned const delai_rafraichissement = 300 ; // toute les secondes
 
 
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//             Fonction de démarage
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
void setup()
{
  lcd.begin(16, 2);              // reglage taille ecran LCD
  lcd.setCursor(3,0);
  lcd.print("Flat4duino");       // message de demarrage
  delay(3000);
  time = millis();
  Serial.begin(115200);           // demarrage de liaison via port serie
  inputString.reserve(50);   
  gestion_affichage_des_menus();
}
 
 
 
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//             Fonction boucle
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
void loop()
{
  time = millis();
  if (time - timeold >= delai_rafraichissement )
  { // rafraichissemnt des menus complet
    timeold=time;
    gestion_des_actions();
    if (menu_actuel == menu_principal) //rafraichissement des valeurs RPM KPA avance 
    {
      refresh_menu_principal();
    }
  }
 //gestion_affichage_des_menus();  
}
 
 
 
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//             ROUTINE
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
 
//----------------------------------
// gestion des actions utilisateurs
//----------------------------------
void gestion_des_actions()
{
   debug(String(menu_actuel) + "|" + rebuild_menu + "|" + refresh_menu);
   lcd_key = read_LCD_buttons();  // lecture des boutons
 
  // action du menu principal
  if (menu_actuel == menu_principal) 
  {
    // gestion du changement de menu
    if (lcd_key == btnMENU) 
    {
      debug("principal bouton menu");
      menu_actuel++;
      if (menu_actuel > nombre_de_menu ){menu_actuel = menu_principal;}
      rebuild_menu = true;
      refresh_menu = true;
      gestion_affichage_des_menus();
      return;
    }
  }
 
  // action du menu 1
  if (menu_actuel == menu_1) 
  {
    // gestion du changement de menu
    if (lcd_key == btnMENU) 
    {
      debug("menu1 bouton menu");
      menu_actuel++;
      if (menu_actuel > nombre_de_menu ){menu_actuel = menu_principal;}
      rebuild_menu = true;
      refresh_menu = true;
      gestion_affichage_des_menus();
      return;
    }
    //gestion du sous menu CARTO <==> MS
    if (lcd_key == btnLEFT) 
    {
      debug("LEFT");
      sous_menu_1++;
      if (sous_menu_1 > nombre_de_sous_menu_1 ){sous_menu_1 = 1;}
      refresh_menu = true;
      gestion_affichage_des_menus();
    }  
    // gestion de la carto
    if (sous_menu_1 == sous_menu_1_carto)
    {
      if (lcd_key == btnDOWN) 
      {
        debug("CARTO DOWN");
        carto_demande++;
        if (carto_demande > carto_max ){carto_demande = 1;}
        refresh_menu = true;
        gestion_affichage_des_menus();
      }  
      if (lcd_key == btnUP) 
      {
        debug("CARTO UP");
        carto_demande--;
        if (carto_demande < 1 ){carto_demande = carto_max;}
        refresh_menu = true;
        gestion_affichage_des_menus();
      } 
      // validation du choix 
      if (lcd_key == btnRIGHT) 
      {
        debug("CARTO RIGHT");
        carto_change = true;
        rebuild_menu = true;
        refresh_menu = true;
        envoiECU();
      }  
    }
    // gestion du multispark
    if (sous_menu_1 == sous_menu_1_MS)
    {
      if ((lcd_key == btnDOWN) || (lcd_key== btnUP) ) 
      {
        debug("MS DOWN UP");
        if (multispark_demande == true){multispark_demande = false;}else{multispark_demande = true;}
        refresh_menu = true;
        gestion_affichage_des_menus();
      }  
      if (lcd_key == btnRIGHT)  // validation du choix
      {
        debug("MS RIGHT");
        multispark_change = true;
        rebuild_menu = true;
        refresh_menu = true;
        envoiECU();
      }  
    }
  } // de action menu 1
} // de gestion des actions utilisateurs
 
 
//------------------------------------
// Gestion des changements de menus
//------------------------------------
void gestion_affichage_des_menus()
{
  // gestion de l'affichage complet du menu
  if (rebuild_menu == true)
  { 
    RAZ_affichage(); // on efface tout
    if (menu_actuel == menu_principal){affichage_menu_principal();}
    if (menu_actuel == menu_1){affichage_menu_1() ;} 
    if (menu_actuel == menu_2){affichage_menu_2() ;} 
    rebuild_menu = false;
  }
  // gestion de l'affichage des valeurs uniquement du menu
  if (refresh_menu == true)
  { 
    if (menu_actuel == menu_principal){refresh_menu_principal();}
    if (menu_actuel == menu_1){refresh_menu_1() ;} 
    if (menu_actuel == menu_2){refresh_menu_2() ;} 
    refresh_menu = false;
  }
}
 
 
//---------------------------------------
// affichage des titre du menu principal
//---------------------------------------
void affichage_menu_principal()
  debug("aff menu princ");
  lcd.setCursor(4,0);
  lcd.print("RPM"); 
  lcd.setCursor(13,0);
  lcd.print("kPa"); 
  lcd.setCursor(2,1);
  lcd.print("Deg"); 
  lcd.setCursor(10,1);
  lcd.print("Carto"); 
  refresh_menu = true;
}
 
 
//---------------------------------------
// affichage des valeurs du menu principal
//---------------------------------------
void refresh_menu_principal()
  debug("refresh princ"); 
  decodeECU(); // lancement de la fonction de decodage du port serie
  lcd.setCursor(0,0);
  lcd.print(Right(String(RPM),4) ); 
  lcd.setCursor(10,0);
  lcd.print(Right(String(KPA),3) ); 
  lcd.setCursor(0,1);
  lcd.print(Right(String(avance), 2) ); 
  if (multispark_actuel == true) 
  {
    lcd.setCursor(7,1);
    lcd.print("MS"); 
  }else{
    lcd.setCursor(7,1);
    lcd.print("  "); 
  }
  lcd.setCursor(15,1);
  lcd.print(carto_actuel);
}
 
 
//---------------------------------------
// affichage des titre du menu 1
//---------------------------------------
void affichage_menu_1()
  debug("aff menu 1");
  lcd.setCursor(0,0);
  lcd.print(" Carto"); 
  lcd.setCursor(7,0);
  lcd.print(" MS"); 
  sous_menu_1 = sous_menu_1_carto ; // choix carto par défaut
  carto_demande = carto_actuel;
  multispark_demande = multispark_actuel;
  //  refresh_menu = true;
}
 
 
//---------------------------------------
// affichage des valeurs du menu 1
//---------------------------------------
void refresh_menu_1()
  debug("refresh menu 1");
  // gestion du * pour selection du menu
  if (sous_menu_1 == sous_menu_1_carto)
  {
    lcd.setCursor(0,0);
    lcd.print("*"); 
    lcd.setCursor(7,0);
    lcd.print(" "); 
  } 
  if (sous_menu_1 == sous_menu_1_MS)
  {
    lcd.setCursor(0,0);
    lcd.print(" "); 
    lcd.setCursor(7,0);
    lcd.print("*"); 
  } 
  // gestion des valeurs demandés
  lcd.setCursor(3,1);
  lcd.print(carto_demande); 
  if (multispark_demande == true)
  {
    lcd.setCursor(8,1);
    lcd.print("ON "); 
  }else{
    lcd.setCursor(8,1);
    lcd.print("OFF"); 
  }
}
 
void affichage_menu_2(){}
 
void refresh_menu_2(){}
 
 
 
//---------------------------------
// Gestion ENTREES/SORTIES vers l'ECU
//---------------------------------
 
// Decodage des donnés port serie
int decodeECU()
{
  String get_RPM = "1000";
  String get_KPA = "100";
  String get_avance = "10";
  String get_carto = "1";
  String get_multispark = "0";
  
  get_RPM = getValue(inputString, ';', 4);
  get_KPA = getValue(inputString, ';', 5);
  get_avance = getValue(inputString, ';', 13);
  get_carto = getValue(inputString, ';', 17);
  get_multispark = getValue(inputString, ';', 18);
 
  RPM = get_RPM.toInt();
  if (RPM == 0)
  {    
    KPA = 0;
    avance = 0;
  }else{
    KPA = get_KPA.toInt();
    avance = get_avance.toInt();
  }
  carto_actuel = get_carto.toInt();
  multispark_actuel = get_multispark.toInt(); 
}
 
void envoiECU()
{
  // envoi de la nouvelle carto a l'ECU
  if (carto_change == true )
  {
    carto_change = false;
    carto_actuel = carto_demande;
    Serial.println("map;" + String(carto_demande) );     // envoi message via port serie
    message("  carto changed");
    rebuild_menu = true;
    refresh_menu = true;
    gestion_affichage_des_menus();
  }
 
  // envoi du multispark à l'ECU
  if (multispark_change == true )
  {
    multispark_change = false;
    multispark_actuel = multispark_demande;
    if (multispark_demande == true)
    {
      Serial.println("ms on");          // envoi message via port serie
      message(" multispark ON");
    }else{
      Serial.println("ms off");         // envoi message via port serie
      message(" multispark OFF");
    }    
    rebuild_menu = true;
    refresh_menu = true;
    gestion_affichage_des_menus();
  }
}
 
 
//-----------------------------------
// envoi d'un message + pause de 2s
//-----------------------------------
 
void message(String str)
{
  RAZ_affichage();
  lcd.setCursor(0,0);
  lcd.print(str); 
  delay(2000);
}
 
 
//----------------------
// lecture des boutons
//----------------------
int read_LCD_buttons()
{
  adc_key_in = analogRead(pinbouton);      // lecture des valeur sur pin A0 
  if (adc_key_in < 50)   return btnRIGHT;  
  if (adc_key_in < 195)  return btnUP; 
  if (adc_key_in < 380)  return btnDOWN; 
  if (adc_key_in < 555)  return btnLEFT; 
  if (adc_key_in < 790)  return btnMENU;   
  return btnNONE;  // when all others fail, return this...
}
 
 
//---------------------------------------
// gestion du parsing
//---------------------------------------
String getValue(String data, char separator, int index)
{
  int stringData = 0;        //variable to count data part nr 
  String dataPart = "";      //variable to hole the return text
  for(unsigned int i = 0; i<data.length(); i++) 
  {
    if(data[i]==separator) 
    {
      stringData++;
    }else if(stringData==index){
      dataPart.concat(data[i]);  
    }else if(stringData>index){
      return dataPart;break;
    }
  }
  return dataPart;
}
 
 
//---------------------------------------
// RAZ des 2 lignes d' affichage 
//---------------------------------------
void RAZ_affichage(){lcd.clear();}
 
 
// ---------------------------------
// cadrage a droite sur n caractere
// ---------------------------------
String Right(String str, int n)
{
  int iLen= 0;
  str = "              " + str;
  if (n <= 0)
  return "";
  else if (n > str.length()   )
  return str;
  else 
  {
    iLen = str.length();
    return str.substring(iLen - n, iLen);
  }
}
 
// ----------------------------------
//  Recuperation des infos de l'ECU
//-----------------------------------
void serialEvent() 
{
  while (Serial.available())     // verification s'il y a des donné recues via le port serie
  {
   inputString = Serial.readStringUntil('\n');   //... read in the string until a new line is recieved
   stringComplete = true;   
   decodeECU();     
  }
}
 
void debug(String str){if(debugging == true){Serial.println(str);}} 

 

Et la toute petite modif du code pour l'arduino Mega 


 

+   bitRead(running_mode, BIT_ENGINE_IDLE )  + ';'

 +  carto_actuel  + ';'
 +  multispark

a rajouter tout en bas de l'onglet combiduino (uniquement ce qui est ecris en rouge)

 

 

 

 

Les fonctions reste rudimentaire, affichage RPM, charge moteur, avance a l'allumage, changement de carto, et activation ou non du multispark. 

Ca reste une interface de secours l'iphone servira les 3/4 du temps.

 

Pour ce qui est des connections entre les 2 arduino, 

 

UNO ------> MEGA

D0/RX ----> D1/TX

D1/TX ----> D0/RX

GND ------> GND

 

pour l’alimentation, au choix, soit on repique sur le mega ou inversement c.a.d, +5V -> VIN

soit on alimente directe chaque arduino via les pin VIN et GND ou encore le connecteur d'alimentation avec un cordon.

 

Dernière option, la carte bluetooth, mais la je sais pas, pas essayé.

 

Il est recommander de mettre un interrupteur bipolaire sur les fils TX / RX afin de pouvoir couper la connection pour charger (mettre a jour) un programme dans les arduinos

 

 

 

 

A noté aussi que sarahconnor a fait les 99% du travail avec son code en haut de page

 

enjoy !


Modifié par Jaar, 20 février 2016 - 11:34 .


#7 n2c_coxiste

n2c_coxiste

    Pilote

  • Membres
  • 344 messages
  • Localisation:OYE PLAGE, France
  • Interets:VW, pourkoi?

Posté 20 février 2016 - 14:45

Chapeau, super taff.

 

Pour l'alimenttion, alternative avec box et switch:

http://www.ebay.fr/i...OoAAOxycD9TS3xF

 

Greg.



#8 sarahconnors

sarahconnors

    VW Addicted

  • Membres
  • 510 messages
  • Localisation:cannes 06

Posté 20 février 2016 - 18:10

bien joué ! 

je fais la modif demandée dans le code de l'ECU, elle sera dispo a la prochaine Maj de github


Une 60', une 1500 de 69 et le nouveau venu le combi de 64' mon blog : http://restocombisplit.unblog.fr


#9 Jaar

Jaar

    Apprenti Pilote

  • Membres
  • 106 messages
  • Localisation:Val d'oise 95

Posté 20 février 2016 - 19:33

bien joué ! 

je fais la modif demandée dans le code de l'ECU, elle sera dispo a la prochaine Maj de github

Ok cool ! merci



#10 florent

florent

    Pilote

  • Membres
  • 203 messages
  • Localisation:44 St nazaire
  • Interets:vw

Posté 20 février 2016 - 22:07

bravo

merci

 

florent



#11 florent

florent

    Pilote

  • Membres
  • 203 messages
  • Localisation:44 St nazaire
  • Interets:vw

Posté 04 mars 2016 - 16:21

salut  j ai reçu ma carte lcd

j ai fait un essais avec les cartes arduino avec le modul bluetooth monte sur les 2 ; mais a priori ça ne fonctionne pas les infos ne sont pas envoyer par la carte d affichage ni reçu , elle m indique toujours carto 0 mème si je la change par la 2.

faut il changer  les shunts noir de place sur une des carte bluetooth pour qu elle communique?

 

florent



#12 n2c_coxiste

n2c_coxiste

    Pilote

  • Membres
  • 344 messages
  • Localisation:OYE PLAGE, France
  • Interets:VW, pourkoi?

Posté 04 mars 2016 - 16:37

non, j'ai rien changé chez moi, et ça fonctionne.

Tu as un GSM pour contrôler que la combiduino envoie des donnnées?



#13 Jaar

Jaar

    Apprenti Pilote

  • Membres
  • 106 messages
  • Localisation:Val d'oise 95

Posté 04 mars 2016 - 16:45

Perso j'ai pas testé si ca fonctionne avec des carte bluetooth. J'ai branché ca en filaire.

 

Mais a mon avis il doit falloir charger la bibliothèque redbear ou un truc dans le genre

 

edit: pour contrôler si le combiduino envoi des donnés, il suffit de jeter un coup d'oeil qd il est branché au pc sur le port serie dans le soft arduino


Modifié par Jaar, 04 mars 2016 - 16:47 .


#14 florent

florent

    Pilote

  • Membres
  • 203 messages
  • Localisation:44 St nazaire
  • Interets:vw

Posté 04 mars 2016 - 17:01

non, j'ai rien changé chez moi, et ça fonctionne.

Tu as un GSM pour contrôler que la combiduino envoie des donnnées?

j arrive a me connecte a la carte combiduino qui vu par mon telephone

mais il ne trouve pas la carte  Bluetooth de la carte afficheur

j ai inverse les cartes et même problème



#15 Jaar

Jaar

    Apprenti Pilote

  • Membres
  • 106 messages
  • Localisation:Val d'oise 95

Posté 04 mars 2016 - 17:18

Je pense qu'il faut modifier le code pour intégrer la lecture via la carte bluetooth. Je viens de jeter un coup d'oeil au code du combiduino et il y a la biblioteque "RBL_nRF8001.h" de chargé. Donc je pense qu'il faut la charger et  pondre un bout de code pour lire les donnés via le bluetooth. Je vais jeter un coup d'oeil a ca ce soir, mais j'ai qu'une carte bluetooth donc je peut pas tester.

 

n2c_coxiste, toi ca fonctionne en bluetooth ou en filaire ?

 

Au passage quelques photos de mon montage "presque fini" (reste les boutons a faire et fignoler 2, 3 trucs)

IMG0923HRFEr.th.jpgIMG0924OncyQ.th.jpgIMG0925evDhO.th.jpgIMG0926.th.jpgIMG0927CAP1V.th.jpg


Modifié par Jaar, 04 mars 2016 - 17:20 .





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users