Problème Attiny85 et affichage LCD en I2C

Bonjour à tous,

Je souhaite réaliser un système d'affichage de température / humidité. J'ai à ma disposition un DHT11, un Attiny 85 et un afficheur LCD fonctionnant en I2C. La partie DHT11 n'a pas posé de problème mais je butte sur le fait de faire fonctionner le l'afficheur LCD avec l'Attiny.

Concernant l'afficheur en question il s'agit de celui-ci : Grove - 16x2 LCD | Seeed Studio Wiki . Il a théoriquement des résistances de pull-up sur les broches SDA et SCL, chose que j'ai pu confirmer avec une mesure à l'ohmmètre. L'adresse I2C d'après la documentation est 0X3E que j'ai également confirmé avec un programme de scan. L'afficheur fonctionne bien sur un UNO, mais lorsque je souhaite le faire fonctionner sur l'Attiny, j'ai seulement la première ligne qui s'allume en noir (et ma LED qui clignote sur le PIN PB4) .

En cherchant sur google, j'ai pu me rendre compte qu'il y a beaucoup de sujets qui traitent de ce problème et notamment des soucis de librairies. J'ai donc fait différents essais et la seule configuration qui a aboutit est celle-ci :

Le code :

#include <TinyWireM.h>
#include <LiquidCrystal_attiny.h>
LiquidCrystal_I2C lcd(0x3E,16,2);

void setup() {

  pinMode(4, OUTPUT);
  lcd.init();
  lcd.print("Hello");
  delay(2000);
}
void loop() {
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
}

Avec les librairies suivantes :

J'utilise un programmer USBasp avec le core suivant : GitHub - vprimachenko/ArduinoTiny: Arduino (^1.6) cores for Atmel ATTiny family et ma version de l'IDE est à jour. Les paramètres de la carte sont bien réglés sur le Attiny85 et l'horloge fixée à 8MHz en interne.

Toutes ces sources proviennent de projet (qui fait du hasard est en français) : https://arduino.stackovernet.com/fr/q/9217

Bref, à ce stade je suis un peu perdu et ne sais plus où chercher le problème. Le code se compile bien et la LED qui clignote montre que téléversement est bien effectué. J'ai noté une chose, lorsque je débranche l'afficheur et que je reset l'Attiny, la LED ne clignote pas tant que l'afficheur n'est pas branché. Ceci me laisse à penser que la fonction lcd.init, bloque le code tant qu'elle n'a pas détecté l'afficheur, ce qui (hypothèse) voudrait dire que l'Attiny détecte bien l'afficheur ?

Si quelqu'un a une idée, ou a alors déjà réalisé ce type de projet avec d'autres librairies je suis prenneur.

Merci d'avance !

Il faut bien initialiser le TiniWireM. Non?

vu ici

il faudrait les 2 codes :
celui qui fonctionne sur UNO et celui sur attiny85

ce que je vais écrire comporte peut etre des erreurs, veuillez me corriger si adéquat :

un lcd i2c est un lcd "normal" auquel on a ajouté une interface i2c, soit un module externe soudé sur le lcd, soit intégré dans le lcd comme çà à l'air d'etre le cas sur le groove, l'adresse 0x3E signifie que l'interface est basé sur pcf8574A, celui-ci ayant la fonction de traduire les commandes series i2c en sorties parrallelles (parfois nommée 8080 en reference aux anciens microprocessseurs)
il y a 8 sorties reliées à 7 "entrées" lcd : 4 bits data+en+dc+rw, RW pas certain vu qu'en général il est tout le temps au gnd, + le backlight éventuellement
le probleme : comment le fabricant a-t-il relié les sorties du pcf8574 aux entrées du lcd ?
avec les modules externes pcf8574 : ils ont l'air d'etre cablé à l'identique quelle que soit le fabricant

pour faire fonctionner votre module groove sur l'UNO vous avez utilisé quelle biblio ?

J'ai tenté en rajoutant TinyWireM.begin() avant le lcd.init() mais sans succès.

Pour les librairies que j'ai utilisées sur le UNO, je les ai prises ici : https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight/archive/master.zip , le lien était donné sur le site où j'ai acheté l'écran.

Dans ces librairies j'ai utilisé l'exemple HelloWorld, tel quel, et ça a fonctionné tout de suite.

Merci de votre aide.

Bonjour,

Je viens d’essayer ton programme (avec un lcd i2c générique pas avec un lcd grove) avec un attiny85 et ça fonctionne.
Par contre

  • le backlight n'est pas allumé et on ne voit presque rien. Il faut ajouter lcd.backlight();
  • mon lcd est à l'adresse 0x27. Est ce que tu as vérifié l'adresse de ton afficheur avec un scanner I2C?
  • mon lcd est à l'adresse 0x27. Est ce que tu as vérifié l'adresse de ton afficheur avec un scanner I2C?

J'ai vérifié dans la librairie Grove_LCD_RGB_Backlight que par défaut prend l'adresse (0x7c>>1) que, si j'ai bien compris, ça donne 0x3E.

Oui, j'ai réfléchi après. Si ça a fonctionné sur une UNO, l'adresse est correcte.

Bonsoir,

Bon c'est déjà un départ de savoir que le code fonctionne autre part. Reste à trouver ce qui cloche chez moi.

Concernant l'adresse de l'afficheur, je confirme que c'est bien 0x3E, j'ai testé avec un programme de scan. L'afficheur fonctionne bien avec le UNO mais pas avec l'Attiny, j'ai remarqué qu'avec l'Attiny, l'afficheur reste en fait dans son état "par défaut" (rétroéclairage allumé, première ligne noire et seconde ligne éteinte). C'est l'état dans lequel il se trouve, par défaut, lorsque je l’alimente sans brancher les pins SDA et SCL.

Cela pourrait-il venir des librairies ? kamill, avez-vous utilisé les libraires que j'utilise ou bien d'autres ? Sinon, se pourrait-il que ça vienne du programmer USB (bien que j'en doute puisque le téléversement s'effectue sans erreur). Dernière hypothèse, que mon afficheur soit incompatible avec l'attiny ?

J'utilise strictement les librairies que tu as utilisé dans ton post initial.
Par contre je n'ai pas le même afficheur apparemment.

Je serai toi, j'essaierai le même programme qui fonctionne sur uno, mais en remplaçant #include <wire.h> par #include <TinyWireM.h>

lcd groove fonctionne avec biblio groove sur uno
le hardware groove n'est pas identique aux modules i2c pcf8574 externes

Bonjour à tous,

Merci pour votre aide, j'ai enfin réussi à faire fonctionner l'afficheur avec l'Attiny85. Pour cela j'ai réutilisé la librairie Grove rgb_lcd en l'adaptant pour fonctionner avec TinyWireM. Voici les deux fichiers que j'ai renommés rgb_lcd_attiny.h et rgb_lcd_attiny.cpp (voir PJ).

Et voici le code dans l'Attiny

#include <rgb_lcd_attiny.h>
rgb_lcd lcd;

void setup() 
{
    lcd.begin(16, 2);  
    lcd.clear();
    lcd.home();
    lcd.setCursor(0,0);
    lcd.print("Hello World !");

    delay(1000);
}

void loop() 
{
    // set the cursor to column 0, line 1
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(0, 1);
    // print the number of seconds since reset:
    lcd.print(millis()/1000);

    delay(100);
}

J'ai viré le #include <TinyWireM.h> car il est déjà appelé dans rgb_lcd_attiny.cpp .

Sinon, un dernier point, je ne suis pas satisfait du résultat car il m'est impossible de toucher au rétroéclairage qui reste allumé en permanence. Comme je n'ai pas envie d'une nouvelle veilleuse haute intensité chez moi je vais me tourner vers un autre afficheur (le temps de vérifier s'il n'y a pas de solution pour mon grove). Auriez-vous un afficheur 16x2 à me recommander sachant que je dois pouvoir le commander en I2C et régler le rétroéclairage (par potentiomètre ou dans le code) ?

rgb_lcd_attiny.cpp (7.76 KB)

rgb_lcd_attiny.h (3.83 KB)

pourtant avec l'afficheur groove que j'ai (un clone, pas l'original) le rétroéclairage est bien commandé par le programme