Bonjour Marc,
Je viens de jeter un coup d'oeil et je me permets de critiquer mais c'est toi qui l'a demandé.
Ou j'ai mal compris ton intention, ou il y a un problème C++. Pourquoi ton objet est static? Du coup tu perds une partie de l'intérêt de la programme orientée objet (je ne dis pas que static ne doit pas être utilisé mais dans cet exemple, je ne comprends pas).
Tu créés une classe dont le but de pouvoir faire un on/off sur 2 pin de ton arduino mais du coup tu utilises qu'un seul objet static mais ce n'est pas ça l'objet (sauf cas particulier).
Un classe c'est un modèle de données + des méthodes (des fonctions/procédures). Un objet c'est une structure donnée propre bâtie sur le modèle de données de la classe. Dans ton exemple, tu a prévu une variable membre qui contient le numéro de pin mais tu ne l'utilises jamais. C'est dommage ! Dans cet exemple, il faut initialiser autant d'objet qu'il y a de pin à piloter et ensuite tu n'as plus besoin de rappeler la pin puisqu'elle est mémorisée par l'objet.
Voici comment je ferais :
Pourquoi ne pas déclarer en global 2 objets (genre juste avant la fonction setup, en dehors de toute fonction) :
Sdigi digi1(3);
Sdigi digi2(4);
Tu modifies ta class pour :
Dans le .h:
Tu remplaces :
void SdigiInit(byte a);
void SdigiOn(byte a);
void SdigiOff(byte a);
par
void SdigiInit(byte a);
void SdigiOn();
void SdigiOff();
Dans le cpp, tu modifies la fonction SdigiInit :
// Fonction qui demande le numéro de pin mais en facultatif car on a créé l'objet avec un constructeur qui a déjà mémorisé le numéro de pin !
void Sdigi::SdigiInit(byte a = 0)
{
if(a != 0) m_numSdigi = a; // Si tu amènes la paramètre facultatif a, c'est que tu veux changer la pin mémorisée, sinon tu utilises m_numSdigi
pinMode(m_numSdigi, OUTPUT);
digitalWrite(m_numSdigi, LOW);
}
et ensuite :
void Sdigi::SdigiOn()
{
digitalWrite(m_numSdigi, HIGH);
}
void Sdigi::SdigiOff()
{
digitalWrite(m_numSdigi, LOW);
}
Maintenant le fichier .ino :
void setup() {
digi1.SdigiInit();
digi2.SdigiInit();
}
La loop :
void loop() {
// essai de la classe dans la boucle
digi1.SdigiOn();
delay(2000);
digi1.SdigiOff();
delay(2000);
digi2.SdigiOn();
delay(2000);
digi2.SdigiOff();
delay(2000);
// essai de la classe via une fonction extérieure
led_delay();
}
Pour la loop, ce n'est pas terrible, on pourrait faire mieux mais pour débuter ça ira car c'est un programme de test.
Globalement c'est plutôt bien codé, le code est propre et tu as bien appréhendé la programmation avec plusieurs fichiers ce qui peut toujours être une prise de tête.
Pour répondre à ta dernière question, oui évidemment que c'est possible mais cela peut vite être compliqué. Pour ma part, je ferai comme ceci :
o Je créé une classe de basse qui contiendrait toutes les propriétés communes ainsi que le fonction commune à tous tes types d'objet
o Je ferai des classes pas objet : lumière, chauffage, prise de courant, etc. qui héritrait de la classe de base. Attention on ne fait pas de classe pour le plaisir, il faut qu'il y ait des comportements différents selon tes objets sinon aucun intérêt, on reste sur la classe de base ou on fait une classe commune.
o Dans le .ino, je ferais un tableau de pointeur d'objet global sur la classe de base. Dans le setup, je ferai des new de tous mes objets selon le pointeur du tableau.
o Dans la loop, je parcours le tableau à la recherche de quelque chose à faire. Aucun delay, on boucle à donf sur tous les objets et surtout sur une fonction d'écouter d'un ordre : communication serial, surveillance de pin d'entrée (de boutons ?), réception d'un message CAN ou Ethernet, etc.)
Il faudrait donc travailler l'aspect polymorphisme et héritage pour arriver à ça. Ce n'est pas si difficile que ça mais le plus dur est d'avoir les idées claires avec ces notions. Après quand on code ce genre de truc, le code final ressemble rarement à l'idée qu'on en avait au début. On fait, refait, recode, remodèlise, et on arrive à la fin à un truc que l'on trouve sympa
J'espère t'avoir aidé.
A+