Go Down

Topic: Problème appel de fonction  (Read 1 time) previous topic - next topic

steven63

Jun 10, 2017, 02:07 pm Last Edit: Jun 10, 2017, 11:39 pm by steven63
Bonjour je bloc dans mon codage, j'ai une fonction que j'arrive pas a appeler et je ne vois pas pourquoi et je n'es aucun message d'erreur lors de la compilation.Merci par avance si vous pouvez m'aider.
Dsl des fautes d'orthographe^^.

Le problème ce trouve la
Code: [Select]
     case 24:                                    // H sortie D = OFF
        tX(7);
        break;
      case 25:                                    // H sortie D = OFF
        //Call the main menu.
         mainMenuwhiskycoca();
        lcd.setCursor(0,0);
        lcd.print(" test ");
 
  delay (100);
  
        tX(8);
        break;


J'ai bien le message test sur mon écran mais la fonction mainMenuwhiskycoca(); et pas appelé.

Voila le code entier :
Code: [Select]
///////////////////Ecran LCD///////////////////////////
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN     13
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
//LiquidCrystal_I2C lcd(0x38, BACKLIGHT_PIN, POSITIVE);  // Set the LCD I2C address
// Creat a set of new characters
const uint8_t charBitmap[][8] = {
   { 0xc, 0x12, 0x12, 0xc, 0, 0, 0, 0 },
   { 0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0 },
   { 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0, 0x0 },
   { 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0, 0x0 },
   { 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0x0 },
   { 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0x0 },
   { 0x0, 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0x0 },
   { 0x0, 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0x0 }  
};
///////////////////Fin ecran LCd/////////////////////////////
///////////////////////
const int s1 = 12;                               // pin de la sortie 1 led verte
int message;                                    // contenu de la commande venant du Pi
// int i ;                                                    // indice tableau
int cpt = 0;                    // compteur (inutilise)

// tableau contenant les codes de commande on/off des 4 voies A, B, C et D
char* codetx[] = {"F000F0FFFF0F 1", "F000F0FFFFF0 2", "F000FF0FFF0F 3", "F000FF0FFFF0 4",
                  "F000FFF0FF0F 5", "F000FFF0FFF0 6", "F000FFFF0F0F 7", "F000FFFF0FF0 8"
                 };

int tX ( int i) {                               // fonction émission du code
  digitalWrite(s1, HIGH);                  // debug permettant de savoir si la
  delay(150);                            // commande a bien été reçue par l'arduino.
  digitalWrite(s1, LOW);

  delay(500);

  delay(100);
}
////////////////////////////////////////////


  int pinBoutonup;
  int pinBoutondown;
  int pinBoutonselect;
//States for the menu.
int Menuwhiskycoca = 0;
int lastState = 0;
 
void setup() {
  //////////////////////////////
  Serial.begin(9600);                          // initialisation voie série à  9600 bauds
  pinMode(s1, OUTPUT);// mode pin1  = SORTIE
//////////////////////////////////
   //Set the characters and column numbers.
   lcd.begin(20, 4);
   pinBoutonup = 53;
   pinMode(pinBoutonup, INPUT);
   pinBoutondown = 51;
   pinMode(pinBoutondown, INPUT);
   pinBoutonselect = 49;
   pinMode(pinBoutonselect, INPUT);
   //Print default title.
   clearPrintTitle();
}
 
void loop() {
////////////////////////////////////////////////////////::
home();
///////////////////////////////////////////////////////////

}
void home() {
////////////////////////////////////////////////////////::
  if (Serial.available() > 0) {                 // si liaison série Pi <=> Duino = OK
    message = Serial.read() - '0';             // on soustrait le caractère 0, (48 en ASCII)
    // pour passer le caractere en numerique
    switch (message) {
      case 17:                                    // A CHR$[65]-CHR$[48] = valeur numérique 17
        break;
      case 18:                                    // B CHR$[66]-CHR$[48] = valeur numérique 18
        break;                                      // et ainsi de suite
      case 19:   // C sortie B = ON
        tX(2);
        break;
      case 20:                                    // D sortie B = OFF
        tX(3);
        break;
      case 21: // E sortie C = ON
        tX(4);
        break;
      case 22:                                    // F sortie C = OFF;
        tX(5);
        break;
      case 23:                                    // G sortie D = ON
        tX(6);
        break;
      case 24:                                    // H sortie D = OFF
        tX(7);
        break;
      case 25:                                    // H sortie D = OFF
        //Call the main menu.
         mainMenuwhiskycoca();
        lcd.setCursor(0,0);
        lcd.print(" test ");
 
  delay (100);
  
        tX(8);
        break;
    }
  }
///////////////////////////////////////////////////////////

}
void mainMenuwhiskycoca() {

  //State = 0 every loop cycle.
  int state = 0;
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0,0);
  boolean etatBoutonup = digitalRead(pinBoutonup);
  boolean etatBoutondown = digitalRead(pinBoutondown);
  boolean etatBoutonselect = digitalRead(pinBoutonselect);
  //Check analog values from LCD Keypad Shield
  if (etatBoutonup==HIGH) {
   //Up
    state = 1;
  } else if (etatBoutondown==HIGH){
   //Down
    state = 2;
  } else if (etatBoutonselect==HIGH){
   //Down
    state = 3;
  }
 
  //If we are out of bounds on th menu then reset it.
  if (Menuwhiskycoca < 0 || Menuwhiskycoca > 2) {
   Menuwhiskycoca = 0;
  }
 
   //If we have changed Index, saves re-draws.
   if (state != lastState) {
      if (state == 1) {
         //If Up
          Menuwhiskycoca = 1;
          displayMenu(Menuwhiskycoca);
      } else if (state == 2) {
         //If Down
          Menuwhiskycoca = 2;  
          displayMenu(Menuwhiskycoca);
      } else if (state == 3) {
         //If Selected
         selectMenu(Menuwhiskycoca);
      }
      //Save the last State to compare.
      lastState = state;
   }
   //Small delay
  delay(5);
}
 
//Display Menu Option based on Index.
void displayMenu(int x) {
     switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("Valider");
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("Annuler");
        break;
    }
}
 
//Print a basic header on Row 1.
void clearPrintTitle() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" HACKSHED.CO.UK ");
  lcd.setCursor(0,1);
}
 
//Show the selection on Screen.
void selectMenu(int x) {
   switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("Initialisation");
        //Call the function that belongs to Option 1
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("Commande annuler");
        //Call the function that belongs to Option 2
        break;

    }
}

hazerty565

#1
Jun 10, 2017, 02:47 pm Last Edit: Jun 10, 2017, 02:51 pm by hazerty565
en faite, ta fonction tX


int tX ( int i) {                               // fonction émission du code
digitalWrite(s1, HIGH);                  // debug permettant de savoir si la
delay(150);                            // commande a bien été reçue par l'arduino.
digitalWrite(s1, LOW);

delay(500);

delay(100);
}


tu l'as mis de type int... se type de fonction implique un retour.. il n'y a pas de retour;;

soit il est void sans retour, soi tu met un retour, a mon avis, tu as du te tromper, je pense que tu dois mettre void au lieu de int, car 'est une procedure et non une fonction... une fonction qui ne te retourne rien, mais qui fait quelque chose, comme la tienne, c'est a dire ecrire quelque chose digitalWrite(s1, LOW);



void  tX( int i){
....
}


De plus, tu as

 delay(500);

delay(100);

pourquoi ne pas faire delay (600);

J-M-L

#2
Jun 10, 2017, 04:10 pm Last Edit: Jun 10, 2017, 04:11 pm by J-M-L
en faite, ta fonction tX
int tX ( int i) {...}
tu l'as mis de type int... se type de fonction implique un retour.. il n'y a pas de retour;;
c'est une erreur effectivement mais implicitement la fonction va retourner 0 donc ce n'est pas le problème, ni non plus les les 2 delays


Quelle librairie LiquidCrystal_I2C.h utilisez vous?


vous dites: case 25: // H sortie D = OFF pour déclencher l'appel à mainMenuwhiskycoca

--> 25 c'est I, ce n'est pas H... sur quelle touche appuyez vous ?

--> pour ne  pas vous ennuyez pas à soustraire '0' pour faire votre switch / case - vous pouvez faire directement un test vers le code des caractères si vous définissez message comme étant de type char

Code: [Select]
char message;
...

  if (Serial.available() > 0) {                 // si liaison série Pi <=> Duino = OK
    message = (char) Serial.read();             
    // pour passer le caractere en numerique
    switch (message) {
      case 'A':                                   
        break;
      case 'B':                                   
        break;                                     
      case 'C':
        tX(2);
        break;
      case 'D':                                   
        tX(3);
        break;
....
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

steven63

#3
Jun 11, 2017, 12:07 am Last Edit: Jun 11, 2017, 12:13 am by steven63
J'ai du mal m'exprimé dans mon problème.
Je vais expliquer mon projet.
Je suis en train de faire un bar automatique du style inibriator.
Sauf que j'utilise un rasberry qui est connecté à mon arduino pour avoir une interface web pour ma sélection des cocktails.

Ma première fonction switch (message) récupère l'information de ma page php. qui va me permettre de définir à chaque case un cocktail, jusque la tous marche.
Mais j'ai voulu rajouter sur la machine un écran avec des boutons pour valider la demande avant de lancer la préparation.
Pour cela j'ai créer un menu void mainMenuwhiskycoca()  qui va me permettre de choisir si je veut valider ou annuler la commande.

J'ai tester le programme a part, ça marche.

Hors mon problème ces que quand j'ai voulu imbriquer les 2 programmes ensemble le menu (mainMenuwhiskycoca() ) et pas appeler lorsque je le demande
ici.
 
Code: [Select]
      case 25:                                    // H sortie D = OFF
        //Call the main menu.
        mainMenuwhiskycoca();
        lcd.setCursor(0,0);
        lcd.print(" test ");


Mon écran affiche bien "test" donc il reçoit bien l'info du rasberry mais il me lance pas la fonction   mainMenuwhiskycoca();

Mon problème est l'appel de la fonction qui ne s'effectue pas.





 

dfgh

HELLO
et si ton prg appelle la fonction, mais en ressort sans rien faire...
rajoute en tout début de la fonction "mainMenuwhiskycoca()" une instruction d'écriture sur l'écran
au moins, tu sauras si ton prg y passe.

J-M-L

#5
Jun 11, 2017, 04:59 am Last Edit: Jun 11, 2017, 05:02 am by J-M-L
Moi je pense qu'elle est appelée votre fonction mais elle ne fait rien....Mettez le lcd.print dans la fonction avec un delay(10000); par exemple et vous le verrez

Quote
J'ai testé le programme à part, ça marche.
Entendez vous par là que vous aviez ce code d'exécutant en permanence dans la boucle? (parce que dans le code ici ce ne sera appelé qu'une fois et vous aurez  à être sacrément rapide sur les boutons (et pour n'avoir qu'une seuLe action))

(Et sinon ce n'est pas H mais bien I que vous envoyez, n'est-ce pas?)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

steven63

Re et merci déjà d'avoir participé à mon problème.

J-M-L effectivement j'ai rajouté un lcd.print dans la fonction void mainMenuwhiskycoca() et le message reste bien activé, donc la fonction est bien appelée.

Du coup le problème ce trouverait au niveau en dessous au niveau de mon code pour afficher le menu.

Ce qui est bizard ces que si dans le void loop j'active directement mainMenuwhiskycoca() tous marche bien le menu s'affiche et les boutons marchent bien .

Lol je suis perdu à force j'ai du loupé des explication dans les tutos .


Ps : (Et sinon ce n'est pas H mais bien I que vous envoyez, n'est-ce pas?)
Oui ces bien I que j'envoie, j'ai juste oublié de modifier le commentaire quand j'ai du faire un copier coller.

dfgh

le prg appelle bien la fonction et la parcourt à la vitesse de l'éclair. 16Mégas

comme tu n'as pas eu le temps d'appuyer sur une touche,
_les 3 premiers if sont traversés ( ignorés )
_le ctrl de la cohérence du N° de menu:  aussi puisque tu ne risques pas d'avoir eu des rebonds
_les états (mémos des changement) des appuis n'ont pas changé non plus

donc tu n'entres dans rien et le prg retourne d'ou il vient.

si en entrant dans cette fonction tu veux saisir l'appui sur une touche, il faut y mettre une boucle qui attende un appui ( tant que état1==old_état1, attendre un appui sur BP1)

J-M-L

#8
Jun 11, 2017, 11:27 am Last Edit: Jun 11, 2017, 03:34 pm by J-M-L
On revient à ce que je disais dans un autre post sur votre projet - il faudra reconcevoir le système comme programmation par machine à états (cf mon tuto éventuellement)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

steven63

OKi j'ai comprit le soucis du coup il faut que je rajoute une boucle « while »  avec les conditions des boutons.

Code: [Select]


while ( (etatBoutonselect==LOW) || (etatBoutondown==LOW) || (etatBoutonup==LOW) ){
mainMenuwhiskycoca()

}





Ps : JML ton tuto a l'air sympa je vais y jeter un coup d'œil, pour toi ma structure est pas bonne faut que je parte sur le principe de ton tuto ?

steven63

J-M-L je viens de lire ton tuto génial, ces exactement ce que je cherche à faire il me reste plus cas appliquer tous ça.
Effectivement je suis pas partie sur des bonnes bases je vais essayer ta technique qui me parait beaucoup plus simple.
Enfin j'espère que tu saura la au cas ou ^^.

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up