Bonjour à tous,
Je retourche mon code et je sépare ce dernier dans une librairie. Je fais donc une librairie pour lire un anénometre DEVIS.
Dans mon code initial, je fais ceci. Je commence à déclarer une variable volatile
volatile unsigned long Rotations; // (ANENO) cup rotation counter used in interrupt routine
volatile unsigned long ContactBounceTime; // /ANENO) Timer to avoid contact bounce in interrupt routine
Puis dans mon setup(), j'initie la pin qui va déclancher l'interrupt ainsi que le fonction qui va être appelée
pinMode(read_pin_wind_speed, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(read_pin_wind_speed), isr_rotation, FALLING);
QO: Est-ce que isr_rotation
peux faire appel à une fonction void Ecoaneno::_isr_rotation () {}
déclarée dans fichier.cpp?
puis ma fonction
// This is the function that the interrupt calls to increment the rotation count
void isr_rotation_aneno ()
{
if ((millis() - ContactBounceTime) > 15 ) // debounce the switch contact.
{
Rotations++;
ContactBounceTime = millis();
}
}
Donc à chaque fois que ma girouette va faire un tour, la variable Rotations va incrémenter.
Voilà, ceci fonctionne.
J'ai donc écrit une librairie et je me pose la question comment déplacer ceci dans mon fichier.cpp
Je vais donc vous décrire comment je pense le faire et si vous pouviez me corriger, ca serait cool.
Premièrement, dans mon fichier.h, dans la partie public:, je pensais créer mes deux variables
Q1: Est-ce nécessaire qu'elle soit dans public, peuvent-elle être dans private?
public:
Ecoaneno();
volatile unsigned long Rotations; // (ANENO) cup rotation counter used in interrupt routine
volatile unsigned long ContactBounceTime; // /ANENO) Timer to avoid contact bounce in interrupt
int get_winddirection(int read_pin, bool debug);
float get_windspeed(int read_pin_wind_speed, bool debug);
//int WDdirection[18];
int WindDirectionOffset = 0; // 0 : the van is directed to the north
int WDdirection[18] {
// Analog value, direction direction (° degre)
0, 0, // N
270, 45, // NE
561, 90, // E
642, 135, // ES
743, 180, // S
814, 225, // SW
870, 270, // W
920, 315, // WN
987, 360, // N
};
maintenant, je dois m'occuper de ces deux déclarations qui se trouve dans le setup()
pinMode(read_pin_wind_speed, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(read_pin_wind_speed), isr_rotation, FALLING);
Q2: Comment puis déplacer ces deux lignes soit dans mon fichier.h ou mon fichier.cpp?
Il faut savoir que déclare ma librairie ainsi
#include <EcoAneno.h>
Ecoaneno aneno;
Donc je ne passe aucun numéro d'une broche (pin) à ce niveau, donc sauf erreur de ma part, je ne peux rien faire à ce niveau (dans mon fichier.cpp)
Ecoaneno::Ecoaneno()
{
}
par contre, je fais appelle à la fonction float Ecoaneno::get_windspeed(int read_pin_wind_speed, bool debug){}
ou je passe le numéro de la broche, mais sauf erreur de ma part, je ne peux définir le mode de ma broche dans cette fonction.
Si c'est bien juste, je devrais plus tôt m'orienter vers une solution qui se raproche de ceci (et adapter mon fichier.h en conséquence)
Ecoaneno aneno(14,true); //Dans mon fichier.ino
Ecoaneno(int read_pin_wind_speed, bool debug); dans mon fichier.h (public:)
// Dans mon fichier.cpp
Ecoaneno::Ecoaneno(int read_pin_wind_speed, bool debug)
{
int _read_pin_wind_speed = read_pin_wind_speed;
bool _debug = debug;
pinMode(_read_pin_wind_speed, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(_read_pin_wind_speed), isr_rotation, FALLING);
}
puis j'ajoute en bas de mon fichier.cpp, la fonction isr_rotation.
En autre, ceci me permettrait de supprimer les deux paramètres de cette fonction
float get_windspeed(int read_pin_wind_speed, bool debug);
et d'utiliser les variables privée _debug
et _read_pin_wind_speed
dans cette dernière
Est-ce que mon dernier raisonnement tient la route?, si oui que me proposeriez-vous de plus optimal?
Merci pour vos lumières