Demande de conseil à des développeurs ou passionnés plus expérimentés que moi!

Bonjour,

Avant de parler de mon souci, je tiens à remercier ce forum est tous les acteurs cela ma bien aider à la compréhension de certaine chose sur Arduino.
En cette période de confinement je souhaite également beaucoup de courage à vous tous.

Voila ceci étant dit je vous pose mon souci.

J'utilise le bus I2C pour piloter un écran Oled SSD1306, je désire que c'est écran ce mette en veille après une période d'inactivité, j'ai vu que il fallait gérer cette veille par la gestion des esclaves avec Wire. J'ai lu pas mal de documentation mais je voudrais choisir la meilleure option. Voici une idée de code permis surement tant d'autre.

Exemple :

While(i2cstatus>0)
{
Wire.beginTransmission (0x3c);
i2cstatus = Wire.endTransmission();
}

0x3c étant l'adresse de mon écran.

Je précise que le système possède un capteur de mouvement qui déclenche des informations sur l'écran et que quand il y à plus de mouvement l'afficheur s'éteint (c'est le but recherché) et dés que le capteur de mouvement perçois un mouvement il se rallume ( encore le but à atteindre).

Voila de façon sommaire l'exposé de mon souci.

Merci de m'avoir lu.

Je ne pense pas qu'il y ait de technique générique pour endormir un périphérique I2C.

Le SSD1306 possède une commande de mise en veille.
SSD1306.pdf

Voir Set Display ON/OFF (AEh/AFh)

Tu envisages d'utiliser une librairie je suppose ?

Bonjour,

Merci de votre réponse je vais regarder Set Display et oui j'utilise U8g2lib comme libraire.

Il faut regarder si cette librairie a une méthode de mise en veille.
Je ne la connais pas.

setPowerSave dans u8g2

#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  u8g2.begin();
    u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
  u8g2.drawStr(0,10,"Hello World!");  // write something to the internal memory
  u8g2.sendBuffer();          // transfer internal memory to the display
  // affiche message 
}

void loop(void) {

  delay(1000); // ecran reste allumé 1 seconde
  u8g2.setPowerSave(1); // éteint écran
  delay(500); //durant 500 millisecondes
  u8g2.setPowerSave(0);  // allume écran
 
}

exemple hello world de la biblio
testé avec oled ssd1306 : constructeur
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
à adapter suivant votre croquis, en fonction de quelle "inactivité" l'écran doit s'éteindre
ce qui me fascine avec cette biblio c'est qu'elle convient à des dizaines d'écrans monochrome différents, tous les écrans ont un registre "display on/off" ? réponse : NON
fonction qui est sleep on off dans u8glib, IF POSSIBLE : Supported for ST7565 and SSD13xx controller.
j'ai testé avec succes 3 modeles glcd de recup(depuis 15 ans au fond d'un tiroir) avec u8glib : t6963c toshiba varitronix 128x64, powertip 240x128,
ks108 JE-AN1286404, pas testé la fonction sleep

Apparemment la commande 0xae est envoyée sur setPowerSave(1) : OK

Par contre c'est très gourmand en RAM : 1477 octets (72%)
La démo Adafruit : 1572 octets (76%)
La démo Greiman : 332 octets (16%)

Seule la u8g2 propose le power off.

Bonjour,

J'utilise la lib U8g2, je vais essayer de faire avec cette lib pour répondre à Elektrax j'utilise un capteur de mouvement apds9960 l'extinction du ssd1306 va ce faire après un Delay et quand le capteur capte un geste il le rallume, voila pour la fonctionnalité.

Effectivement 72% cela fait beaucoup pour une gestion de veille. Je vais regarder la démo Greiman.

Merci à tous

Les deux librairies Adafruit et u8g2 utilisent un tampon en RAM.
Il est donc deux fois plus grand en 128x64 qu'en 126x32.

Un petit comparatif :
afficheur-oled-ssd1306-comparons

La librairie GreiMan ne possède pas de méthodes graphiques.
Mais j'arrive à fabriquer par exemple un indicateur de niveau batterie avec une police de 6 caractères (voir le code dans l'article).

Très intéressant ce comparatif je viens de finir une prévision qui fonctionne et voila ma consommation de ressource.

Le croquis utilise 285644 octets (29%) de l'espace de stockage de programmes. Le maximum est de 958448 octets.
Les variables globales utilisent 29316 octets (35%) de mémoire dynamique, ce qui laisse 52604 octets pour les variables locales. Le maximum est de 81920 octets.

Ce n'est pas un ARDUINO ...

Non un 8266 ESP12E

Avec un ESP8266 tu peux utiliser la librairie que tu veux. On n'est pas à l'étroit comme sur un ARDUINO.

C'est sur je suis d'accord avec sa, je vais me concentrer sur un autre sujet à savoir, adapter une batterie sur mon PCB, je n'ai pas de carte adaptatrice je conçoit les PCB sous kicad.

J'ai commencer travailler sur la compréhension de la consommation de mon circuit et à propos de cela, je conseille ces deux liens de hbachetti qui sont vraiment une base de travail importante sur le sujet.

Ah ... ça fait plaisir de voir que mon travail est utile.
Merci.

Un module nu sur un PCB maison est imbattable d'un point de vue consommation, ESP32 en premier.