utilisation .h .cpp

Bonsoir à tous,

je me lance dans un gros projet ou j’aurais besoin de gérer un certain nombre de composants et avoir un paquet d’inter-action avec.

Donc j’ai commencé par m’occuper de mes barregraphes 10 leds . Mon projet en comptera 3 . Chaque barregraphe affiche la valeur d’un potentiomètre . Donc j’ai commencé “petit” en essayant d’en codé un . Mais comme les 3 aurons le même fonctionnement j’ai essayé de faire un librairie pour n’avoir qu’une seul fois les lignes qui gère l’affichage des leds (programme moins lourd et plus facile à lire). Et c’est la que cela ce complique (je précise que j’ai appris le codage “sur le tas” et donc que je suis assez limité niveau connaissance). Malgré les tutos lu sur le sujet des librairies je n’ai pas compris grand choses(entre les define, class, et autre. Tous me semble flou et je ne comprend pas leurs fonctionnements). Voici donc la ou j’en suis :

le fichier test.ino

int pot; //definition potentiometre utilisé par le cpp
int barfan[]={16,17,18,19,20,23,24,25,26,27}; //définition broche du 1er bargraphe

void setup(){

for(int pinbarfan =0; pinbarfan < 10; pinbarfan++ ){
  pinMode(barfan[pinbarfan], OUTPUT); //Boucle pour définir les pin utilisees comme sorties du 1er bargraphe
}}

void loop(){
  pot = analogRead(A0); //lecture de la valeur du 1er potar et le rend commun au cpp

 //enplacement appel fonction du bargraphe fan
 
 
 }}

le A_tete.h

#define "A_tete.h"

int potar(pot);


void gestbar();

le gestbar.cpp

#include "A_tete.h"


 void gestbar(){
 int bardef = map(pot,0,1023,0,10);//Creation d'une valeur en 0 et 10 fonction de la mesure
 
 for(int pinbarfan =0; pinbarfan < 10; pinbarfan++){
   if(pinbarfan < bardef){
     digitalWrite(barfan[pinbarfan], HIGH);}
   else{
     digitalWrite(barfan[pinbarfan], LOW);}
 }}

Je n’ai pas encore regardé comme je vais gérer les pin des barregraphes par rapport à la librairie . je me suis déja concentré sur les variables pour ajouté facilement plusieurs potentiomètres, et faire fonctionner le .h et le .cpp

or à la compilation j’ai :

In file included from gestbar.cpp:1:
/A_tete.h:1:9: error: macro names must be identifiers
In file included from gestbar.cpp:1:
A_tete.h:3: error: 'pot' was not declared in this scope
gestbar.cpp: In function 'void gestbar()':
gestbar.cpp:5: error: 'pot' was not declared in this scope
gestbar.cpp:5: error: 'map' was not declared in this scope
gestbar.cpp:9: error: 'barfan' was not declared in this scope
gestbar.cpp:9: error: 'HIGH' was not declared in this scope
gestbar.cpp:9: error: 'digitalWrite' was not declared in this scope
gestbar.cpp:11: error: 'barfan' was not declared in this scope
gestbar.cpp:11: error: 'LOW' was not declared in this scope
gestbar.cpp:11: error: 'digitalWrite' was not declared in this scope

donc j’imagine que j’ai mal gérer les #define, et autres mais alors pourquoi ? :confused: Autres il semblerais que mes variables définis dans le .ino ne soit pas pris en compte dans le .h et .cpp comment faire pour passer mes variables du .ino au .h ?

Bonjour,

Dans #define, le nom du define répond à la même syntaxe que les variables → donc pas de "
Dans ton cpp si utilises des fonction arduino il faut inclure arduino.h

#include <Adruino.h>

Dans ton cpp toutes les variables ou constantes doivent être définies (dans le cpp ou déclarées extern dans le .h)

#include <Adruino.h>

:smiley: Je pense que le compilateur va raler…rrrrrrrrrr.

Vision d’un débutant ++
Chaque fichier est compilé séparément pour obtenir des fichiers objets (extension ***.o)
Tout les résultats de compilation sont liés entre eux pour former le programme.

La conséquence: comme chaque fichier est compilé séparément le compilateur doit tout savoir : il faut donc bien ajouter tous les fichiers inclus dont le compilateur aura besoin.
Au final le même fichier *.h peut être inclu dans plusieurs fichiers *.c mais ce n’est pas grave car il y a une protection pour qu’au final il n’y ait pas de collision.
Tous les fichier h ont la structure :

#ifndef TOTO_H
#define TOTO_H
// contenu duFichier H


#endif // TOTO_H

Idem pour les variables GLOBALES
Elles sont normalement déclarée dans 1 seul fichier où un emplacement mémoire leur sera réservée.
Pour que les autre fichiers puissent les utiliser il faut le signaler au compilateur et aussi lui dire qu’il ne faut pas leur affecter une place en mémoire car cela sera fait avec un autre fichier.
extern int toto ;
extern float mesure ;

C’est simplement l’application des règles du C/C++

PS : l’IDE transforme le code du fichier ino en un vrai code C/C++ et à cette occasion elle inclue automatiquement le fichier Arduino.h et l’appel du programme init() qui positionne les réglages entre autre pour les fonctions delay(), millis() , la PWM etc…

68tjs:

#include <Adruino.h>

:smiley: Je pense que le compilateur va raler…rrrrrrrrrr.

Le compilateur ne va pas râler du tout car comme j’ai indiqué le #include <Arduino.h> doit être dans le fichier .cpp

#include ardRuino.h :smiley:

oups! effectivement

Alors merci à vous deux pour l’aide fournis, je n’ai plus d’erreur de compilation . Sauf que je doit avoir encore mal piger certain truc car il semblerais que ma carte ne lise j’aimais les programmes .h et .cpp (aucune de mes leds ne s’allume :confused: ). Donc avez-vous une idée d’où ce trouve mon erreur ? j’ai surement mal intégrée ma boucle dans le programme en .ino

le test.ino

int pot; //definition potentiometre utilisé par le cpp
int barfan[]={28,29,30,31,32,33,34,35,36,37}; //définition broche du 1er bargraphe
void setup(){
  
for(int pinbarfan =0; pinbarfan < 10; pinbarfan++ ){
  pinMode(barfan[pinbarfan], OUTPUT); //Boucle pour définir les pin utilisees comme sorties du 1er bargraphe
}}

void loop(){
 


  pot = analogRead(A0); //lecture de la valeur du 1er potar et le rend commun au cpp

 //appel fonction du 1er bargraphe 
 void gestbar();
 }

le programme A_tete.h

#ifndef A_tete.h
#define A_tete.h
#include <Arduino.h>
extern int pot;
extern int barfan[];



void gestbar();

#endif // A_tete.h

le programme gestbar.cpp

#include "A_tete.h"
#include <Arduino.h>

 void gestbar(){
 int bardef = map(pot,0,1023,0,10);//Creation d'une valeur en 0 et 10 fonction de la mesure
 for(int pinbarfan =0; pinbarfan < 10; pinbarfan++){
   if(pinbarfan < bardef){
     digitalWrite(barfan[pinbarfan], HIGH);}
   else{
     digitalWrite(barfan[pinbarfan], LOW);}}}

Tu n'aurais pas oublier des includes dans le fichier test.ino par le plus grand des hasards ?
#include "A_tete.h";

Le fichier test.ino est transformé par l'IDE en un vrai fichier cpp avant d'être envoyé au compilateur.
Les règles C/C++ s'appliquent à lui aussi.

Arrfff en effet cela semble logique :’( . Mais malgré cela ça ne marche pas . je précise que le problème ne viens pas de mon montage électrique (je l’ai testé avec le même code mais non découpé en h et cpp et il fonctionne parfaitement).

Bonjour,

Dans ta loop tu as

 //appel fonction du 1er bargraphe 
 void gestbar();

Ca ce n'est pas un appel, c'est une déclaration. Pour appeler la fonction:

 //appel fonction du 1er bargraphe 
 gestbar();