Problema libreria OLED I2C

Ciao a tutti
Sto conoscendo questa libreria “OLED I2C” consigliata dal forum, avendo la necessità di usare la funzione millis() ho scritto un piccolo codice con questa funzione . Il progettino consiste di visualizzare sul display il valore di una variabile e di far lampeggiare un led. Purtroppo il lampeggio non corrisponde al secondo impostato, ho visto anche gli esempi che propone la libreria ma usano solo il “delay()” .
Grazie a tutti
Guido

#include <OLED_I2C.h>

OLED  myOLED(SDA, SCL);

#define led   13

byte b = 23 ;
byte stato  ;
unsigned long T0 ;
extern uint8_t BigNumbers[];

void setup() {
  myOLED.begin(SSD1306_128X32);
  myOLED.setFont(BigNumbers);
  pinMode (led, OUTPUT);
}

void loop() {

  if (millis() - T0 >= 1000) {
    T0 = millis();
    stato ^= 1;
  }

  myOLED.printNumI(b, 53, 4);
  myOLED.update();

  digitalWrite (led, stato);
}

Premesso che, per avere esattamente l'intervallo di 1 secondo quell'IF deve essere:

if (millis() - T0 >= 1000) {
   T0 += 1000;
   stato ^= 1;
 }

... ricorda che tu stai aggiornando il LED DOPO aver scritto sul OLED, cosa che, per quanto veloce, comunque impiega il suo tempo e quindi ... l'accensione del LED sarà sempre in ritardo.

Prova magari a mettere

digitalWrite (led, stato);

myOLED.printNumI(b, 53, 4);
myOLED.update();

... così da aggiornare prima il LED e poi scrivere sul OLED e vedi se migliora.

Guglielmo

Si l’ho fatto ma è quasi uguale.
Nello sketch che dovrò fare più avanti dovrei visualizzare l’incremento di una variabile quindi mi dici che la vedrò sempre con un certo ritardo ?
Guido

O correggi il ritardo nella costante 1000 (la diminuisci fino a quando non è esattamente quelo che ti serve) o altrimenti, per forza ...

Guido_Laferrari:
Si l’ho fatto ma è quasi uguale.

Beh, come ti ho messo io il lampeggio è esattamente UN secondo (nei limiti della precisione di Arduino).

Se poi, aggiungi cose per cui prima di tornare a quel IF passa più di un secondo ... ovvio rallenta, ma se prendi solo quel codice, il lampeggio è esattamente di un secondo (sempre nel limite della precisione di Arduino).

A che ti serve ?

Guglielmo

OK correggo il ritardo della costante.
grazie mille per la risposta
Guido

Guido_Laferrari:
OK correggo il ritardo della costante.

Purtroppo l'oscillatore ceramico di Arduino UNO NON è il massimo della precisione e, se serva qualche cosa di veramente preciso su lunghi periodi ... beh ... meglio allora utilizzare un generatore di clock di precisione esterno :wink:

Guglielmo