Blocage d'arduino pour afficher un texte sur OLED[résolu] et sur RTC[non résolu]

Bonjour à tous,

Pour moins consommer, je voudrais allumer et éteindre un OLED avec un bouton. Cela parait simple, au début je pensais qu'il suffirait de couper l'alimentation avec un relais (pour l'instant je fais les tests en débranchant des fils) mais même après l'avoir remis, ça n'a affiche rien, normal puisque qu'on doit faire un "begin".
Mais la lecture des boutons (et de tout d'ailleurs) est stoppée et donc un appui sur le bouton pour faire un "begin" ne sert à rien.
Je crois que l'arduino se bloque sur l'opération d'écrire sur l'OLED (quand il n'est pas alimenté). J'ai essayé de faire plusieurs codes mais rien n'y fait.
Vous pourriez peut-être m'éclaircir ?

Tout est testé sur arduino UNO.

Le code que j'essaye:

#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"


SSD1306AsciiAvrI2c display;

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
boolean ON;


void setup() {
  Wire.begin();
  display.begin(&Adafruit128x64, 0x3C);
  display.setFont(System5x7);
  Serial.begin(9600);
  pinMode(7, INPUT_PULLUP);
}

void loop() {
  Serial.println(digitalRead(7));

  if((digitalRead(7))==0) {
    ON=!ON;
    delay(1000);
    display.begin(&Adafruit128x64, 0x3C);
    delay(1000);
    while((digitalRead(7))==0);
  }

if(ON==1) {
  display.set1X();
  display.setCursor(35, 5);
  display.print("test");
}
}

Ce qui consomme le plus dans un afficheur OLED, ce sont les pixels allumés.
Pour éteindre, tu pourrais tout simplement essayer de faire un

ssd1306WriteCmd(SSD1306_DISPLAYOFF)

et pour le rallumer un

ssd1306WriteCmd(SSD1306_DISPLAYON)

Tu n'auras sans doute pas une consommation aussi faible qu'en coupant l'alimentation puisque le contrôleur reste sous tension mais sa consommation est de l'ordre de la centaine de microampère..

Merci beaucoup pour ta réponse ! Ça marche parfaitement ! Désolé pour le temps que j’ai mis à répondre mais j’ai un nouveau problème(le meme) avec un RTC :sob: . L’arduino se bloque alors qu’on ne demande pas de lire le RTC :’( :’( .

Je mets le code que j’ai testé:

#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"

SSD1306AsciiAvrI2c display;

boolean aaa;


#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val){
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val){
  return( (val/16*10) + (val%16) );
}
void setup(){
  Wire.begin();
  Serial.begin(9600);
  pinMode(7, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  
  digitalWrite(13, HIGH);
  aaa=1;

  
  display.begin(&Adafruit128x64, 0x3C);
  display.setFont(System5x7);
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
}

void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year){
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void displayTime(){
  digitalWrite(13, HIGH);

  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  // send it to the serial monitor

  display.set2X();
  display.setCursor(30 , 2);
  
  display.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  display.print(":");
  if (minute<10){
    display.print("0");
  }
  display.print(minute, DEC);


}
void loop(){
 
if(aaa==1){
  digitalWrite(13, HIGH);
  delay(500);
  displayTime();
  display.ssd1306WriteCmd(0xAF);
  
}
else{
  display.ssd1306WriteCmd(0xAE);
  delay(500);
  digitalWrite(13, LOW);
}

if((digitalRead(7))==0) {
  aaa=!aaa;
while((digitalRead(7))==0);
}
// display the real-time clock data on the Serial Monitor,
  
  }

L'arduino se bloque alors qu'on ne demande pas de lire le RTC

C'est-à-dire?

L'arduino à l'air de se bloquer(ici je pense qu'il veut lire le RTC mais comme il n'ai pas alimenté...), c'est à dire que tout le code ne se fait plus, on ne peut donc plus lire les boutons et remettre l'alimentation...
Pourtant l'Arduino ne devrait pas se bloquer car je ne demande pas de le lire avec l'instruction "displayTime".

L’arduino à l’air de se bloquer(ici je pense qu’il veut lire le RTC mais comme il n’ai pas alimenté…),

Lire un composant I2C (DS3231 apparemment), alors qu’il n’est pas alimenté ?
Tout dépend comment c’est implémenté. Blocage avec timeout, ou pas …

Tout dépend comment c'est implémenté. Blocage avec timeout, ou pas ...

C'est à dire ?

L’I2C attend une réponse qui ne vient pas, il abandonne au bout d’un certain temps, ou pas.

Comment faire alors pour empêcher ça ?

S'il n'est pas alimenté, ne pas communiquer avec.

L'arduino à l'air de se bloquer(ici je pense qu'il veut lire le RTC mais comme il n'ai pas alimenté...)

Qu'est ce que tu entends par là ? Tu coupes l'alimentation de la RTC ?

Oui je veux couper l'alimentation du RTC mais l'arduino se bloque(quand le RTC n'est plus alimenté) alors que je crois ne pas demander à l'arduino de lire le RTC. Et donc je ne trouve pas de code pour que quand on coupe l'allimentation avec un relay l'arduino n'ai plus besoin de lire le RTC et donc ne se bloque pas.
Plus d'informations au 3eme topic je crois.

Je ne vois pas trop l’intérêt de couper l'alimentation de la RTC.

Vu la consommation ridicule ...

J'ai un RTC monté avec une LED(et peut-être d'autres choses). Dois je désolidariser la led pour moins consommer ?

Je pense que cette LED peut être virée sans problème.

La led a été virée sans problème. Du coup merci :slight_smile: ! Y-a t il d'autres choses qu'on peut enlever ?

Vérifier la consommation avec un multimètre ...