programmation POO

Bonjour,
je debute avec arduino et je suis a la recherche d'un tuto ou d'exemple qui traitent la programmation objet sous arduino (si cela est possible?)
cordialement
Alain

Pourquoi sous arduino ?

Arduino c'est juste une carte électronique.
La programmation c'est du C et du C++.
Tout tuto de C++ conviendra.
On trouve tous les niveaux ici :
developpez.com

Si tu trouve que c'est rassurant de rester dans l'univers Arduino après avoir potassé des tutos pour le C++ tu pourra toujours ouvrir des bibliothèques de l'IDE arduino, t'en inspirer, les modifier, etc

je programme avec le langage arduino "classique"
je voulais savoir si la syntaxe de ce langage permettait de crer des objets

cordialement
Alain

En fait la syntaxe arduino est une surcouche sur du C ou C++, je ne sais plus. Mais il est tout à fait possible d'écrire une classe en C++, et le compilateur fera comme si tout était normal.

Et on trouve effectivement plusieurs librairie standard Arduino écrites en C++, qui passent par la création d'objet. Par exemple la bibliothèque HardwareSerial définit un objet UART, lequel objet est déclaré pour nous sous le nom Serial.
Pareil pour la classe qui gère l'I2C. La bibliothèque définit un objet TwoWire, lequel objet est instancié pour nous sous le nom de Wire, que nous utilisons pour accéder aux fonctions liées.

:wink:

alainav1:
... je voulais savoir si la syntaxe de ce langage permettait de crer des objets ...

Pour sûr :slight_smile:

En programmation objet, j'ai créé toutes une série de composants visuels qui sont tous plus moins descendants hiérarchiques d'un composant de base.. Ca peut te servir d'exemple.

Cordialement.

Pierre

je programme avec le langage arduino "classique"

Gros gneu gnieu
Ce que tu utilises c'est du C et du C++ tout de qu'il y a de classique
Il n'existe pas de langage arduino.

Les bibliothèques Wiring/arduino sont des fonctions et des classes que les gens de Wiring/Arduino ont écrit pour te faciliter la tache. Mais ils les ont écrites en C et C++****.

La seul point particulier est l'IDE.
En C/C++ classique il te faut écrire une fonction main(), déclarer les fonctions avant de les utiliser et créer une boucle infinie.
Toutes ces choses sont faites automatiquement par l'IDE Wiring/arduino qui te demande au minimum une fonction setup() pour les actions à ne faire qu'une seule fois et une fonction loop() pour "remplir" la boucle infinie.
Mais cela n'a rien à voir avec le langage ni avec le compilateur : c'est juste une particularité de l'IDE.

je voulais savoir si la syntaxe de ce langage permettait de crer des objets

Bien évidement puisque c'est du C et C++ classiques.

Soit curieux : c'est une qualité pour un développeur :grin:.
Ouvre les répertoires où est rangée l'IDE et regarde tu y trouveras des fichiers avec l'extention *.c et d'autre avec l'extension *.cpp.
Pour ces derniers il y a de fortes chances que ce soit de la programmation objet.
C'est la meilleure démonstration possible.
Certains, trop peu il est vrai, utilisent même l'héritage.

Pareil pour la classe qui gère l'I2C. La bibliothèque définit un objet TwoWire, lequel objet est instancié pour nous sous le nom de Wire, que nous utilisons pour accéder aux fonctions liées.

Justement l'instanciation d'un objet Wire de classeTwoWire est un usage dévoyé de la programmation objet--> c'est une négation de l'héritage.

J'insiste, sans doute très lourdement, mais la meilleure documentation ne se trouvera pas sur ce site mais sur des sites généralistes de programmation en C et C++.

68tjs:
Justement l'instanciation d'un objet Wire de classeTwoWire est un usage dévoyé de la programmation objet--> c'est une négation de l'héritage.

Pourquoi un usage dévoyé? Parce que l'instanciation est faite en "sous-main" dans les sources Arduino, et pas par nous dans nos propres programmes? Ou bien il y a une autre raison?

Parce que l'instanciation est faite en "sous-main" dans les sources Arduino, et pas par nous dans nos propres programmes? Ou bien il y a une autre raison?

Ce n'est pas qui fait l'instanciation qui est en cause c'est le principe même de l'instanciation qui fait fi de l'héritage.

On lit partout que l'un des gros avantages de la programmation objet c'est l'héritage.
Dans tous les tutos on trouve que la classe chaise hérite de la classe pied et de la classe dossier.
La classe tabouret n'hérite elle que de la classe pied.

Il est où l'héritage dans l'utilisation TwoWire avec Wire ?

Normalement si je prend l'exemple d'un DS3231 la classe DS3231 devrait hériter de la classe TwoWire.
Si write() est une méthode de TwoWire et si on instancie un objet tocante de classe DS3231
DS3231 tocante() ;
pour écrire dans un registre de tocante on écrirait
tocante.write(xxx) ;
Or ce n'est jamais dans dans l'univers arduino alors que c'est systématiquement le cas dans Mbed --> j'ai ouvert des fichiers et c'est très clair que l'héritage est systématiquement utilisé..

68tjs:
Ce n'est pas qui fait l'instanciation qui est en cause c'est le principe même de l'instanciation qui fait fi de l'héritage.

Je ne suis pas sûr de comprendre. TwoWire est la classe qui gère l'I2C. Elle hérite de la classe Stream, tout comme Serial, et peut-être d'autres. La classe Stream hérite elle-même de la classe Print.
Du coup il est bien question d'héritage, non? Wire est le nom qui est donné à l'instanciation de TwoWire qui est faite par Arduino pour faciliter la vie des clampins que nous sommes. L'utilisation d'une majuscule rend par contre la chose ambigüe, comme pour la classe Serial.

Il faut bien qu'il y ait une instanciation de la classe à un moment ou un autre si on veut pouvoir s'en servir, non? N'est-ce pas l'intérêt d'une classe que de permettre que l'on puisse en créer plusieurs instances?

Ce sont peut-être des questions simples, mais à chaque fois que je me penche sur le concept d'héritage, l'intérêt me parait évident, mais la mise en place me semble parfois plus délicate, malgré les excellents cours que j'ai lu sur la question...

Bonjour,
pour info j'ai trouvé ça sur les class

cordialement
Alain

Je ne suis pas sûr de comprendre. TwoWire est la classe qui gère l'I2C. Elle hérite de la classe Stream, tout comme Serial, et peut-être d'autres. La classe Stream hérite elle-même de la classe Print.

Il faut bien qu'il y ait une instanciation de la classe à un moment ou un autre si on veut pouvoir s'en servir, non?

Tu instancies les classes Print, Stream et Serial avant de faire un Serial.print() sur le moniteur ?
Je n'en ai pas l'impression.
Elles sont héritées et je ne suis pas un spécialiste mais tout doit se passer au moment de l'instanciation de l'objet final.
C'est comme cela que cela se passe dans Mbed c'est donc que ça fonctionne.

N'est-ce pas l'intérêt d'une classe que de permettre que l'on puisse en créer plusieurs instances?

Oui totalement mais cela n'a rien à voir avec l'héritage.
Rien ne t'empêche de créer un objet i2c sur la classe TwoWire en plus de l'objet Wire.
A part que le nom sera plus naturel cela ne mettra pas plus en jeu le principe de l'héritage.

68tjs:
Tu instancies les classes Print, Stream et Serial avant de faire un Serial.print() sur le moniteur ?
Je n'en ai pas l'impression.
Elles sont héritées et je ne suis pas un spécialiste mais tout doit se passer au moment de l'instanciation de l'objet final.
C'est comme cela que cela se passe dans Mbed c'est donc que ça fonctionne.

Non, et en même temps oui. Je n'instancie pas Print et Stream pour faire un Serial.print(). Par contre Arduino crée pour moi un objet Serial, qui est une instance de la classe HardwareSerial, qui hérite de Stream. Donc je ne l'instancie pas moi-même, mais l'instance Serial hérite bien de Stream et de Print. Et si je décide d'utiliser plutôt une instance que je crée moi-même parce que je veux l'appeler liaisonSerie et pas Serial, mon objet liaisonSerie, instance de HardwareSerial, héritera aussi de Stream et Print.

PS: je présente mes excuses pour ce hors-sujet. Je déplacerais bien cette discussion sur l'héritage et Arduino, mais comment scinder la discussion?