Go Down

Topic: I2C et texte en string (Read 594 times) previous topic - next topic

Geeks

Bonjour,

Pour les besoins de mon projet, j'envoie une fonction spécifique qui me simplifie la tache pour l'I2C:
ecrireCarte("Telecommande 433Mhz", 01);

Ensuite, je fais
void ecrireCarte(String texte, int positionEcran) {
  Wire.begin();  //Amorce la connection sur SDA et SCL
  Wire.beginTransmission(adresse); //Appelle la carte
  Wire.write(position);  //Sur la carte
  Wire.write(texte);  //Ecrire un texte
  Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
}

Hélas, ça plante sur Wire.write(texte);  //Ecrire un texte car il met "T_l_commande_V_1_0:113: error: no matching function for call to 'TwoWire::write(String&)'" à la compilation.

Je songe à une conversion String to Byte. Mais pas sûr que ça vienne de là. Vous aurez noté que j'ai utilisé la librairie Wire.

Merci de m'indiquer s'il y a un moyen simple de passé en paramètre du texte pour la retransmettre sur la carte annexe via l'I2c et la librairie Wire.

Merci.

barbudor

Les seules formes de write sont :

Code: [Select]
    size_t write(uint8_t);
    size_t write(const uint8_t *, size_t);


Mais comme TwoWire dérive de Stream qui dérive de Print, tu hérite de :

Code: [Select]
    size_t print(const String &);
    size_t println(const String &s);


Donc la solution est
Code: [Select]
Wire.print( texte );

RTFC
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Geeks

Ok, ça fonctionne parfaitement :)

Au départ j'avais mis un char, comme je transmet aussi par le biais de Serial1.write(), char dans un cas et char dans l'autre.

Je suppose que Serial.print() aura le même effet que Serial.write() mais avec des strings ?

Geeks

Finalement ça le fait parfaitement ;)

barbudor

Compte tenu de la hierarchie de classe que j'ai expliqué plus haut (TwoWire -> Stream -> Print) je t'invite a regarder l'API de Stream dont toute classe dérivée hérite : http://arduino.cc/en/Reference/Stream
Ainsi que celle de Print qui n'est pas documenté sur le site mais tu trouveras Print.h dans arduino/hardware/arduino/core

C'est le cas de Serial, LiquidCrystal (et les classes LCD dérivées), EthernetClient, ....

D'ailleurs pour piloter ton LCD, je t'invite a implémenter une classe similaire à LiquidCrystal et LiquidCrystalI2C.
Le principe est de respecter une API standardisée pour les LCD caratères tout en héritant des méthodes de Stream/Print. Ainsi n'importe quel code qui utilise cette API peut passer d'un modèle de LCD a un autre juste en changeant le module (bibliothèque) d'interface.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Go Up