Pages: [1]   Go Down
Author Topic: appel de plusieurs programmes  (Read 860 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1991
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour,
tu pourrais utiliser la fonction case

Code:
case 1:
gps();
break;
case 2:
temp();
break;
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-confuse

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.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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");
        



Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
 
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: