Go Down

Topic: appel de plusieurs programmes (Read 936 times) previous topic - next topic

caco74

Bonjour à tous dans le cas d'un ecran embarqué sur un tableau de bord de moto, je recherche la syntaxe ( si elle existe ) de facon à appeler un programme lors de l'appuie d'un BP.

j'utilise un arduino uno et un shield deuligne. Le programme de base utilise un GPS pour ce positionner avec affichage des coordonnées et de la vitesse.
Avec l'appuie du bouton centrale je souhaite basculer en mode temperatures .

Le premier programmme GPS fonctionne déjà pas mal, mais l'incorporation du programme temperature avec un DALLAS 18B20 me pose probleme dans la lourdeur.
j ai peur d'être limité par le UNO.
Le programme des sondes de temperatures fonctionne lui aussi bien separement. Maintenant il me reste à les compiler à le demande.

existe t'il une particularité relativement simple permettant de rappeler un programme existant dans un autre programme.
qui dit appelé dit avoir le programme en memoire quelque part  mais OU ?
me faut il un shield memoire ?

Merci du coup de main.

infobarquee

bonjour,
tu pourrais utiliser la fonction case

Code: [Select]
case 1:
gps();
break;
case 2:
temp();
break;

osaka


appeler un programme lors de l'appuie d'un BP.


Appellé une fonction ou méthode oui un programme non.  :smiley-sweat:


Le premier programmme GPS fonctionne déjà pas mal, mais l'incorporation du programme temperature avec un DALLAS 18B20 me pose probleme dans la lourdeur.
j ai peur d'être limité par le UNO.


Limite mémoire flash (mémoire programme) ou sram ?


Maintenant il me reste à les compiler à le demande.


La compilation se fait sur ton ordinateur et non sur le µc  ...  :smiley-mr-green:


existe t'il une particularité relativement simple permettant de rappeler un programme existant dans un autre programme.
qui dit appelé dit avoir le programme en memoire quelque part  mais OU ?
me faut il un shield memoire ?


Tout simplement non.  :~

Le mieux c'est de faire comme infobarquee te le propose par exemple (structure conditionnel switch, if, ...) , ou appel de fonctions.
Maintenant si c'est réellement un problème de mémoire programme il n'y a pas 10 000 solutions, soit tu passe à une mega par ex qui a une plus grande mémoire ou tu optimise ton code (évité les print(ln), chaines de caractères, les float inutiles, le core arduino  :smiley-mr-green:, ... ).
Montre nous ton code histoire de voir s'il n'y a pas moyen de faire mieux.

caco74

voici mon programme GPS. toutes les commandes d'affichage sur le terminal seront supprimés sur la version finale. elles ne servent que pour les tests.

Code: [Select]

#include <NewSoftSerial.h>
#include "Wire.h"
#include <TinyGPS.h>
#include <Deuligne.h>
Deuligne lcd;
int escape=0;


int  x; //variable servant au calcul de conversion
int  y;
int d;
int m;
int D;
int M;
const int brocheTX=2; // Constante pour la broche 2
const int brocheRX=3; // Constante pour la broche 3
String chaineReceptionGPS=""; // chaine réception
NewSoftSerial mySoftSerial(brocheRX, brocheTX);
TinyGPS gps; // déclare un objet GPS

void setup()   { // debut de la fonction setup()
Serial.begin(115200);
mySoftSerial.begin(4800);

lcd.init();

// désactivation envoi automatique des trames GPS par le module GPS
envoiGPS("PSRF103,00,00,00,01");
envoiGPS("PSRF103,01,00,00,01");
envoiGPS("PSRF103,02,00,00,01");
envoiGPS("PSRF103,03,00,00,01");
envoiGPS("PSRF103,04,00,00,01");
envoiGPS("PSRF103,05,00,00,01");


mySoftSerial.flush(); // vide le buffer série logiciel

} // fin de la fonction setup()

void loop(){ // debut de la fonction loop()


   mySoftSerial.flush();

   
     Serial.print("Requete trame GGA :");
      envoiGPS("PSRF103,00,01,00,01");
     Serial.print("Reponse du GPS : "); // message
     while(!mySoftSerial.available()); // attend une réponse du GPS - stop si pas de réponse
    receptionGPS(); // analyse réponse GPS

   
     Serial.print("Requete trame RMC :");
     envoiGPS("PSRF103,04,01,00,01"); // Demande de trame RMC avec controle activé
    Serial.print("Reponse du GPS : ");
    while(!mySoftSerial.available());
    receptionGPS();

            Serial.println();
     
       gestionGPS(gps);         // appel la fonction de gestion du GPS

   
   Serial.println();
      Serial.println();
     
     
     
     
}






//while(1); // stop loop



// fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************


// ////////////////////////// FONCTIONS DE GESTION DES INTERRUPTIONS ////////////////////


// ////////////////////////// AUTRES FONCTIONS DU PROGRAMME ////////////////////

//----- fonction analyse réponse GPS ----

void receptionGPS() {

  while(mySoftSerial.available())  {  

     int c = mySoftSerial.read();    
     chaineReceptionGPS=chaineReceptionGPS+char(c);
     Serial.print(char(c)); // affiche le caractère reçu

    boolean test=gps.encode(c);
   delay(1); // entre 2 réceptions... laisse le temps au caractère suivant d'arriver...

     if(test==true) {    

       Serial.println();
       Serial.print("Une chaine valide (GGA ou RMC) a ete recue par la librairie TinyGPS :");

       Serial.println(chaineReceptionGPS); // affiche la chaine reçue
       chaineReceptionGPS=""; // RAZ chaine de réception


     } // fin nouvelle trame valide
  } // fin while SoftSerial

} //-- fin fonction receptionGPS

//----- fonction envoi instruction GPS ---
void envoiGPS ( String chaineEnvoi) {


 
 String checksumChaine=String (checkSum(chaineEnvoi),HEX);

 Serial.println();
 
 
 chaineEnvoi="$"+chaineEnvoi+"*"+checksumChaine+char(0xD)+char(0xA);

 Serial.print("Commande envoyee au GPS : ");
 Serial.print(chaineEnvoi); // debug - affiche commande GPS
 //Serial.println();

 mySoftSerial.flush(); // vide le buffer série logiciel avant requete GPS
 mySoftSerial.print(chaineEnvoi); // envoi la chaine sur le port série logiciel

} // fin fonction envoi GPS




int checkSum (String chaineTest) {
 int test=0; // initialise variable locale

for (int i=0; i<chaineTest.length(); i++) {
 char c=chaineTest.charAt(i); // extrait le caractère de la chaine

 // Serial.print(c); // debug - affiche caractère


         // si c'est le premier passage
         if (test == 0) {
               // on initialise la variable test avec la valeur du caractère
               test = byte(c);
               }
         else {
               // sinon on fait un XOR entre la variable test et la valeur du caractère
               test = test ^ byte(c);
               }


} // fin for i

return test; // renvoie la valeur de controle


} // fin fonction Checksum


//---- fonction de Gestion du GPS ----

void gestionGPS(TinyGPS &gps) { // la fonction reçoit le pointeur de l'objet GPS

 float latitude, longitude; // variable locale de latitude et longitude
 x = latitude ;
 y = longitude ;
 gps.f_get_position(&latitude, &longitude); // la fonction reçoit les pointeurs des variables
 //et met les valeurs dans les variables

 Serial.print("Lat/Long: ");
 Serial.print(latitude,5); // avec 5 décimales
 Serial.print(", ");
 Serial.println(longitude,5); // avec 5 décimales


 int annee; // variable locale
 byte mois, jour, heure, minute, seconde, centiemes;// variables locales

 gps.crack_datetime(&annee,&mois,&jour,&heure,&minute,&seconde,&centiemes); // la fonction reçoit les pointeurs des variables
 //et met les valeurs dans les variables

 Serial.print("Date: "); Serial.print(mois, DEC); Serial.print("/");
 Serial.print(jour, DEC); Serial.print("/"); Serial.print(annee);
 Serial.print("  Time: "); Serial.print(heure, DEC); Serial.print(":");
 Serial.print(minute, DEC); Serial.print(":"); Serial.print(seconde, DEC);
 Serial.print("."); Serial.println(centiemes, DEC);

 // les fonctions suivantes renvoient directement la valeur float
 Serial.print("Altitude (metres): "); Serial.println(gps.f_altitude());  
 Serial.print("Course (degres): "); Serial.println(gps.f_course()); // ?
 Serial.print("Speed(kmph): "); Serial.println(gps.f_speed_kmph());
 Serial.println();

 //--- statistiques décodage GPS ---
 unsigned long chars; // variable locale
 unsigned short sentences, failed_checksum;
 gps.stats(&chars, &sentences, &failed_checksum); // la fonction reçoit les pointeurs des variables
 //et met les valeurs dans les variables

 Serial.print("Erreurs Checksums: ");Serial.print(failed_checksum); // message indiquant si erreur de validité des chaines reçues
 Serial.println(); Serial.println();

 //---- génération de l'adresse utilisable dans Googlemap
// Serial.println("Adresse pour google map : ");
// Serial.print("http://maps.google.com/maps?q=");
 Serial.print(latitude,5);
 Serial.print(",+");
 Serial.println(longitude,5);

               
       
         lcd.clear ();
                   x=latitude;//mise en x de la valeur de latitude
                   y=longitude;// mise en y de la valeur longitude
         d=(((latitude-x)*1000*60)/1000);// formule de conversion en degres sexagesime
         m=((((latitude-x)*1000*60)/1000)-d)*60;// conversion pour latitude
         lcd.print ( x  ); lcd.print ( "d"); lcd.print (d); lcd.print ( "m");lcd.print (m); // affichage des coordonnées
         D=(((longitude-y)*1000*60)/1000); // conversion en degres sexagesime
         M=((((longitude-y)*1000*60)/1000)-D)*60;
         lcd.setCursor ( 0,1);
         lcd.print ( y  ); lcd.print ("d");lcd.print (D); lcd.print ( "m");lcd.print (M);;// affichage du resultat
   
       lcd.setCursor ( 9,1);
       lcd.print(gps.f_altitude());  // affichage de l'altitude.
       lcd.setCursor ( 14 , 1);
       lcd.print ("m");
       





osaka

ah oki, donc la lourdeur c'est avec le debug (tout les serial.print()) ou sans  ?
Le fait d'utilisé NewSoftSerial pour le gps je suppose que tu utiliseras l'uart natif arduino ?
Enfin pour l'instant tu peux t'en servir pour le côté pratique (debug, programmation) mais au final tu peux t'en passé.
Utilise deux fichiers, un pour le debug et une version semi "final", dans un nouveau pde ou ino supprime une fois tout les serial.print() et utilise serial pour le gps voir la taille que prend le programme réellement.

caco74

sur l exemple que je viens de mettre c est le programme brute. J'utilise le serial pour mes essais d'affichages sur terminal qui ne me serviront plus pour le modele embarqué.

je vais raccourcir tout cela au strict minimum.

Go Up