création Library Arduino

Bonjour
Je suis en train de travailler sur une bibliothèque Arduino, et dans mon ficher source "TestMenu.cpp" j'ai le programme suivant:

#include "TestMenu.h"
#include "Arduino.h"
#include "SoftwareSerial.h"
#include <avr/io.h>
#include <avr/wdt.h>
//---------------
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);



 TestMenu::TestMenu (String TitreMenu, String Titre1, String Titre2, String Titre3, int BoutonS, int BoutonB, int BoutonR, int BoutonV, int BoutonH)
 {
	
	monTitreMenu=TitreMenu; 
	monTitre1=Titre1;
	monTitre2=Titre2;
	monTitre3=Titre3;
	
	// This is for the buttons
	BoutonSelect=BoutonS;
	BoutonBas=BoutonB;
	boutonRouge=BoutonR;
	BoutonVert=BoutonV;
	BoutonHaut=BoutonH;
}

void TestMenu::monSetup() {

  Serial.begin(9600);                               // Initialisation de la communication serie avec le PC
  lcd.begin(20,4); 


  pinMode(BoutonSelect, INPUT_PULLUP);              // definition bouton select en pullup
//  pinMode(Buzzer, OUTPUT);

  lcd.createChar(1, FlecheHaut2);
  lcd.createChar(2, FlecheBas2);
  lcd.createChar(3, FlecheMenu2);
  lcd.createChar(4, FlecheGauche2);
  lcd.createChar(5, indic2);

}


void TestMenu::monMenuTest()
{

	while(1) {

	  EtatBoutonHAUT = digitalRead(BoutonHaut);
	  EtatBoutonBAS = digitalRead(BoutonBas);
	  EtatBoutonSELECT = digitalRead(BoutonSelect);

	  if(EtatBoutonHAUT == HIGH && EtatBoutonSELECT == HIGH) { // redemarrage par appui sur boutons Haut et Select
		resetFunc();
	  }

	  if(EtatBoutonHAUT == HIGH && EtatBoutonBAS == HIGH) { // affichage du menu principal par appui sur boutons Haut et Bas
		loop(); // MenuPrincipal(); 
	  }

    //---------------------------------------------
	// début de mon programme ici
	
	  if(digitalRead(BoutonHaut) == HIGH) {
		// tone(Buzzer, 200, 50);
		ValMenu--;
	  }
	  if(digitalRead(BoutonBas) == HIGH) {
		// tone(Buzzer, 200, 50); 
		ValMenu++;
	  }
	  if(ValMenu >=4) {ValMenu = 1;}
	  if(ValMenu <=0) {ValMenu = 3;}
	  
	  
	  
	  switch (ValMenu) { // debut de la structure
		case 1: // cas 1
		lcd.clear();
		lcd.setCursor(0,0);
		//lcd.print(TitreMenu);
		lcd.print(monTitreMenu);
		lcd.setCursor(0,1);
		lcd.write(3);         // indicateur sur option 1
		lcd.print("1:");   // option 1
		lcd.print(monTitre1);
		lcd.setCursor(1,2);
		lcd.print("2:");     // option 2
		lcd.print(monTitre2);
		lcd.setCursor(1,3);
		lcd.print("3:");     // option 3
		lcd.print(monTitre3);
		  
		  if(EtatBoutonSELECT ==1){
			delay(50);
			EtatBoutonSELECT = digitalRead(BoutonSelect);
			if(EtatBoutonSELECT ==0){
			  action=1;
			}
		  } else {delay(150);}
		break;
	//************************************************************************
	   case 2: // cas 2
		lcd.clear();
		lcd.setCursor(0,0);
		//lcd.print(TitreMenu);
		lcd.print(monTitreMenu);
		lcd.setCursor(1,1);
		lcd.print("1:");  // option 1
		lcd.print(monTitre1);
		lcd.setCursor(0,2);
		lcd.write(3);                      // indicateur sur option 2
		lcd.print("2:"); // option 2
		lcd.print(monTitre2);
		lcd.setCursor(1,3);
		lcd.print("3:"); // option 3
		lcd.print(monTitre3);
		
		  if(EtatBoutonSELECT ==1){
			delay(50);
			EtatBoutonSELECT = digitalRead(BoutonSelect);
			if(EtatBoutonSELECT ==0){
			  action=2;
			}
		  } else {delay(150);}
	  break;
	//****************************************************************************
		
	} // switch

	// fin de mon programme
    //---------------------------------------------     
  } // fin while
}

Maintenant dans mon croquis Arduino je fais appel à la fonction:

 samaMenu.monMenuTest(); // creation par TestMenu samaMenu();

Après l'exécution de la fonction, je veux recupérer la valeur de la variable "action" qui dans mon fihier TestMenu.cpp pour démarer une action dans Arduino.
Par exemple, si action=1, j'allume la LED rouge.
si action=2, j'allume la LED verte.

Comment je dois procéder?

Merci d'avance.

Action est déclaré dans TestMenu.h je suppose?

Cela dépend un peu de sa définition.

Tu peux par exemple changer le
void TestMenu::monMenuTest()
en
uint8_t TestMenu::monMenuTest()
si action est un uint8_t

et en fin de mettre;
// fin de mon programme

  • //--------------------------------------------- *
  • } // fin while*
  • return action;*
    }

puis remplacer le
samaMenu.monMenuTest(); // creation par TestMenu samaMenu();
par
if (samaMenu.monMenuTest()==1) <j'allume la LED rouge.>
else <j'allume la LED verte.>

Merci olivier_pecheux .
Je vais voir ce que ça va donner.

A+

olivier_pecheux:
Action est déclaré dans TestMenu.h je suppose?

Cela dépend un peu de sa définition.

Tu peux par exemple changer le
void TestMenu::monMenuTest()
en
uint8_t TestMenu::monMenuTest()
si action est un uint8_t

et en fin de mettre;
// fin de mon programme

  • //--------------------------------------------- *
  • } // fin while*
  • return action;*
    }

puis remplacer le
samaMenu.monMenuTest(); // creation par TestMenu samaMenu();
par
if (samaMenu.monMenuTest()==1) <j'allume la LED rouge.>
else <j'allume la LED verte.>

Bonjour Olivier
Merci beaucoup. Ca marche très bien. Mais au lieu de mettre le "return action" à la fin de la boucle "while", j'ai mis ça à l'intérieur, juste après action=1...

Merci mille fois.

Mais au lieu de mettre le "return action" à la fin de la boucle "while", j'ai mis ça à l'intérieur, juste après action=1...

Je ne donne que l'idée, c'est toi qui écris le programme.

On peut mettre effectivement plusieurs return dans la fonction, il faut être conscient que lorsque l'on déroule le code, on n'ira pas plus loin que le premier return rencontré.

Je ne suis pas rentré dans le détail de ton code (le nouveau), mais si tu as un test sur led, c'est normal de ne pas faire la suite. Dans ce cas évidemment, un ou plusieurs return von se trouver au milieu de la fonction.

Merci mille fois.

Bonne suite.