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 .