ESP32 Broche I2C et écran LCD

Bonjour,

(j’ai cherché, pas trouvé)

comment simplement affecter d’autre broches pour I2C avec les bibliothèques

LiquidCrystal_I2C ou LCDI2C_Multilingual ?

existe t il une autre bibliothèque qui le permette ?

Il faut pour cela que le microcontroleur qui est sur la carte permette de le faire.
Les microcontroleurs récents le permettent, les anciens ce n’est pas courant.
Et le microcontroleur est un ...... ?

Voir le message d’accueil.

voir titre… ESP32

le problème, si j’ai tout compris..., est que ces bibliothèques utilisent les broches wire par défaut.

Donc à part de faire un clone de la bibliothèque et la modifier, je ne vois pas comment faire autrement.

ces bibliothèques doivent simplement utiliser un Wire.begin(); au sein du code et donc laisser le soin à Wire d'utiliser les bonnes broches en fonction de l'architecture sous jacente.

Regardez la bibliothèque hd44780 qui est plus performante que LiquidCrystal_I2C et qui permet de créer un objet TwoWire personnalisé il me semble (à vérifier)

Il existe plusieurs versions aussi de LiquidCrystal_I2C, je crois que la version maintenue par Marco Schwartz / John Rickman permet de le faire aussi peut être - c'est la plus récente.

sinon il faut modifier le code qui contient le wire.begin()


EDIT: à y regarder de plus près, non il semble que ces bibliothèques utilisent directement Wire donc faudra les modifier.

J’avais les yeux plein de ... désolé.

Mais ..... Cela dépend du modèle d’ESP32, oui je sais c’est petit comme remarque.
Si beaucoup de choses sont possibles avec un esp32, tout ne l’est pas pour toutes les versions du microcontroleur et selon la carte utilisée toutes les GPIO ne sont pas disponibles en bord de carte.
Esp32 c’est un peu le foutoir.

Les pins par defaut sont définies dans le fichier pinarduino.h propre a chaque declinaison d’esp32. Ce fichier se trouve dans le repertoire variant de l’IDE.

Il n’est pas possible, sans toucher a pinarduino.h de faire dans le programme ?
Syntaxe approximative, je n’ai pas mes anti seches.

#If def SDA
#Undef SDA
#Define SDA "nouvel gpio qui va bien”

Comme la bibliothèque two-wire utilise, me semble t-il SDA et SCL pour créer l’objet Wire je pense que cela devrait fonctionner.

On peut aussi créer un nouvel objet avec les bonnes pins et en profirer pour nommer cet objet ”i2c”.
Un
i2c.begin()
a plus d’allure qu’un
fil.begin () :grinning_face:

Note :
L’objet Wire est créé dans le fichier Wire.h ou Wire.cpp
Dans la version pour Esp32 je pense avoir vu comment créer l’objet Wire et l’objet Wire1

Bonjour deb_un

C'est Wire qui utilise les broches par défaut, pas l'interface utilisant l'i2C.

Sur un ESP32 tu peux utiliser Wire.begin(pinSDA, pinSCL); (21, 22 par défaut) en mettant les pin que tu veux, pour autant qu'elles n'interfèrent pas avec les périphériques qui se trouvent sur le module.
Le mieux est d'essayer :wink:

Cordialement
jpbbricole

La doc Espressif pour son framework Arduino se trouve ici :

Pour les bibliothèques du framework (I2C, SPI, etc ):
La documentation est sous le chapitre library/APIs

et pour l'I2c :

La declaration de l'objet Wire se trouve bien à la fin du fichier Wire.cpp

TwoWire Wire = TwoWire(0);
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)
#if SOC_I2C_NUM > 1
TwoWire Wire1 = TwoWire(1);
#elif SOC_I2C_NUM > 2
TwoWire Wire2 = TwoWire(2);
#endif /* SOC_I2C_NUM */
#else
#if SOC_HP_I2C_NUM > 1
TwoWire Wire1 = TwoWire(1);
#endif /* SOC_HP_I2C_NUM */
#endif

On peut voir que le framework peux déclarer, probablement selon la version de l'ESP, plusieurs objets Wire : Wire1, Wire2;

Selon la version de l'ESP plusieurs objets Wire(X) utilisant des pins différentes de Wire sont peut-être déjà déclarés.

Le souci c’est que les bibliothèques font aussi Wire.begin() sans paramètre - à voir donc ce que ça donne.

Bonjour,

Je confirme, le mieux est d'essayer, moi je le fais dans une de mes appli, exactement comme le décrit @jpbbricole, dans le setup.

Et je n'ai pas noté de problème particulier.

A tester.

+1

le tout est de choisir des GPIOS restant disponibles pour l’I2C sur la carte que l’on utilise si l’on délaisse les GPIOS par défaut pour cette carte.

@deb_un : quelle carte utilses-tu ?

les bibliothèques font aussi `Wire.begin()

Çà, cela me met en colère !
Ce n'est pas aux bibliothèques à démarrer les services.
Par flemme de faire une documentation convenable, ou par mépris : pas la peine de perdre son temps ils ne comprennent rien, on enferme les utilisateurs dans des impasses.

L'auteur de la bibliothèque doit indiquer les réglages qu'il préconise.
C'est la responsabilité de l'utilisateur de lancer le service et avec les réglages qu'il veut.

Vécu, j'utilisais deux modules SPI mais chaque "écrivain" de bibliothèque imposait ses propres réglages, bien sûr différents.
J'ai ouvert les fichiers bibliothèque, j'ai supprimé toutes les lignes qui touchaient à l'initialisation du SPI et je ai initialisé le SPI dans le programme principal.
Heureusement je ne risque pas les mises à jour qui effacent tout : avec PIO les bibliothèques sont propres à chaque projet. Un fichier pense_bête.txt dans le répertoire et c'est bon.

En particulier je trouve inadmissible d'imposer la fréquence d'horloge, du SPI comme de l'I2C
L'I2C est quasiment toujours à sa valeur normalisée min 100 kHz alors que de très nombreux composants peuvent faire plus (400 kHz) ou moins si on a des grandes longueurs.
Baisser les résistances de charge (pour diminuer le temps T=RC) ou baisser la fréquence horloge (pour augmenter la période du signal) a le même effet.

Le SPI c'est l'inverse, il est quasiment toujours à sa fréquence max, 20 MHz pour l'ESP32.
Tous les composants n'acceptent pas cette fréquence et faire un câblage correct en connectique Dupont à 20 MHz, ne s'improvise pas.

En résumé la réponse à ma question c’est NON.

pour ce qui est de la doc & co je sais faire/lire…

je cherchais à éviter de toucher à la bibliothèque si il y avait une solution propre

sinon pour cloner la bibliothèque et la modifier je saurais faire (ou pas :face_with_diagonal_mouth: )

pour info: c’est pour modifier un automate dont l’affichage est en rade et le remplacer par un LCD, sans toucher au câblage (SCL_3 => 18, SDA_3 => 19)

Merci pour vos diverses réponses

Lecture du matin chagrin…

Disons que quand on met une bibliothèque en open source on ne peut pas penser qu’il y a envie de mépriser ses utilisateurs.

La bibliothèque dont je parlais commente la décision

Je pense que son argument n’est pas solide (certes on ne peut pas savoir mais il y a des conséquences) - mais il explique son choix…

On peut quand même les prendre pour ce qu'il ne sont pas, si le terme mépris parait trop fort.
Considérer que des gens soient incapables de lancer l'i2c n'est pas vraiment gentil.

Quand on écrit une bibliothèque on fourni des exemples, il est simple de montrer comment démarrer l'I2c ou le SPI dans le programme principal et comment fixer la fréquence d'horloge.

Faire comme si aucun autre composant n'existe à part celui dont on écrit une bibliothèque c'est quand même ne pas s’intéresser au monde qui nous entoure.

On ne peut pas nier que certains limitent les renseignements au strict minimum de peur de se faire embarquer dans des discussions interminables s'ils donnent un peu trop d'explications.
Il faut reconnaître que parfois on ne leur donne pas tord.

J’entends ce que vous dites, après ça reste de l’open source, donc si vous voulez votre propre bibliothèque à votre façon parce que vous avez un besoin très spécifique , il suffit de faire un fork…

j’ai trouvé ça:

quelqu'un qui se pose la même question que moi...

le problème: ce n’est pas dans la langue de molière … si quelqu’un peut me donner un coup de main pour la traduction…je n’arrive pas à comprendre si il ont trouvé une solution

Please apologize for posting in English, but you have linked a post of mine.

On an ESP32 you could use Wire.begin(mySDApin, mySCLpin) to start the Wire object on different pins.

My LCD library will not call Wire.begin() on an ESP32. The Wire.begin() (also in the variant with pin parameters) needs to be in the user sketch before you call the initialisation of the LCD object.

Édit (J-M-L)
La traduction en français :slight_smile:
Veuillez m’excuser de poster en anglais, mais vous avez cité un de mes messages.

Sur un ESP32 vous pouvez utiliser Wire.begin(mySDApin, mySCLpin) pour démarrer l’objet Wire sur d’autres broches.

Ma bibliothèque LCD n’appelle pas Wire.begin() sur un ESP32. L’appel à Wire.begin() (également dans la variante avec paramètres de broches) doit se trouver dans le sketch utilisateur avant l’initialisation de l’objet LCD.

@noiasca Merci pour la réponse rapide. ça compile sans erreur. dés que je peux, je teste avec l’écran

@J-M-L Merci pour la traduction, là j’y étais arrivé seul :thinking: , c’était pour le post cité (il a l'air instructif :innocent:) que c’est beaucoup plus ardu pour moi. J’ai la solution, il me manque plus qu’à tester avec l'écran. Dés que c'est fait je passerais en résolu

Merci à tous

Après vos tests, vérifiez également l'exemple

5011_Convert_French.ino
et
5030_Convert_ASCII

Que la conversion UTF-8 est la raison principale de l'existence de cette bibliothèque. Cela peut peut-être aider pour d’autres projets.