Problema su display

Buonasera a tutti, riposto qui un codice per il quale alcuni di voi già mi avevano aiutato a correggere alcuni errori.
Il problema è il seguente: ho acquistato questo display https://www.amazon.it/gp/product/B07V9CRSKJ/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

Ho caricato il codice e inizialmente pareva funzionare, decido cosi di collegare la cella di carico ad arduino per visualizzare i valori che variano, ma mi accorgo che il display inizia a sgranare soprattutto dove i valori dovrebbero cambiare. Al che penso è un problema dato dalla cella di carico per cui scollego e metto da parte la cella di carico e carico il codice che vedete qui sotto dove avrei dovuto vedere la prima riga in alto scorrere ma proprio il dove il display dovrebbe lavorare inizia a sgranare, mi informo un po’ qui sul forum e leggo che a volte e bene mettere due resistenze da 10k che alimentino con il 5v i pin scl sda, ma il risultato è ancora lo stesso. cambio alimentatore, aggiungo un condensatore tra il pin A0 e il gnd ma nulla, aumento il tempo di delay fino a 10 secondi ma nulla.
Cosa posso ancora provare?

#include "HX711.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

HX711 scale(2, 3);

float calibration_factor = -1020; //valore che differisce per ogni tipo di cella di carico
float units;//misurazione peso
int peso_impostato=500; //peso da raggiungere
int tolleranza=20;  //tolleranza sul peso
long t = 0;  // valore di millis
long debounce_delay = 3000; // attesa ripetizione incremento con pulsante



void setup() {
   Serial.begin(9600);
  pinMode(8, INPUT);//pulsante 1
  pinMode(9, INPUT);//pulsante 2
  pinMode(4, INPUT); //da verificare con lcd
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Error..."));
    for (;;);
  }
  // the library initializes this with an Adafruit splash screen.
  display.display();
  display.clearDisplay();

  scale.set_scale();//inizializzazione
  scale.tare(); //tara
  scale.set_scale(calibration_factor); //calibrazione in base al valore sopra definito
  


}
int x = 0; // variabile che incrementa per far scorrere il testo


void loop() {
  units = scale.get_units(); //esegue una singola lettura e la salva dentro units
  if (units < 0) {
    units = 0.00;
  }//se il peso è minore di zero units = a 0
  if (digitalRead (8)){
    if ( (millis() - t) > debounce_delay) {
    peso_impostato+=1;
    t = millis();
    }
  }
   if (digitalRead (9)){
    if ((millis () - t) > debounce_delay) {
    (peso_impostato-=1);
    t = millis ();
    }
   }
   display.setTextSize(1);
  display.setCursor(x, 0);
  display.print("Peso impostato ");
  display.setTextSize(2.5);
  display.print(peso_impostato);
  display.print(" g.");  
   display.setTextSize(1); 
  display.setCursor(0, 24);
  display.print("Peso rilevato");
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.setCursor(0, 35);
  display.print(units);
  display.print(" g.");
  display.display();
  Serial.println(peso_impostato);
  Serial.println(units);
  delay(200);//verificare con display se può essere rimosso o ridotto
  x++;
  if (x>=128) x = 0;
 
   
if (units<=(peso_impostato-tolleranza)) {
    digitalWrite(5,LOW);
    }
    else{ digitalWrite(5,HIGH); }
    
    if (units>(peso_impostato+tolleranza)) {
    digitalWrite(6,LOW); //allarme cicalino segnaletico
    } 
    else{ digitalWrite(6,HIGH); }
    
    if (units>=(peso_impostato-100)&&units<peso_impostato) {
    digitalWrite(7,LOW);//100 sono i grammi mancanti al raggiungimento pieno che rallenteranno il nastro
    }
     else{ digitalWrite(7,HIGH); }
    
}

Dimenticavo, con l'esempio proposto dalla libreria il display funziona correttamente o almeno è quanto sembra.
E' possibile che il problema sia causato dal formato delle variabili?

mah i display oled (ne sto usando uno simile 1,5" a colori) vanno "capiti" se si cambia la dimensione del font va pulito sempre il display prima di riscriverlo dare un occhiata anche alla memoria rimasta,
es: il mio arduino nano la usa quasi tutta solo caricando le librerie :confused:

Si è un OLED, io lo pulisco inizialmente, mentre se lo pulisco ogni volta che cambio font in poche parole vedrò una sola scritta per volta o sbaglio?
Comunque per quanto riguarda la memoria quando mi carica il programma mi dice che sto occupando il 51%

ho provato a pulire il display alla fine ma mi resta bloccato sul logo adafruit

Cosa intendi con il display sgrana ? Posta una foto.

Usi variabile x per posizionare con SetCursor, ma incrementi x di 1 facendo x++ (+1 pixel)
Ma tra una riga e l'altra di un testo mica basta aumentare x di 1 pixel
Se font alto 8 pixel devi almeno aumentare di 9

Poi...scrivi nel codice:

  display.setCursor(x, 0);
  display.print("Peso impostato ");
...
  display.setCursor(0, 24);
  display.print("Peso rilevato");

Ma se x va da 0 a 127, c'e' un momento in cui x=0 quindi scrivi le due frasi una sopra l'altra.

Ma il primo valore sono le righe il secondo le colonne quindi siccome sotto ho uno 0, 24 sarò più in basso di 24 pixel e per cui la prima riga non andrà mai a sovrapporsi a quella sotto o sbaglio?

Comunque eliminando il problema dello scorrimento testo che potrei anche farne a meno mi da lo stesso problema quando mi deve rendere il valore del peso (units) quindi se mai lavoriamo sul codice qui sotto in cui tutto è fermo.

include "HX711.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

HX711 scale(2, 3);

float calibration_factor = -1020; //valore che differisce per ogni tipo di cella di carico
float units;//misurazione peso
int peso_impostato=500; //peso da raggiungere
int tolleranza=20;  //tolleranza sul peso
long t = 0;  // valore di millis
long debounce_delay = 3000; // attesa ripetizione incremento con pulsante



void setup() {
   Serial.begin(9600);
  pinMode(8, INPUT);//pulsante 1
  pinMode(9, INPUT);//pulsante 2
  pinMode(4, INPUT); //da verificare con lcd
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Error..."));
    for (;;);
  }
  // the library initializes this with an Adafruit splash screen.
  display.display();
  display.clearDisplay();

  scale.set_scale();//inizializzazione
  scale.tare(); //tara
  scale.set_scale(calibration_factor); //calibrazione in base al valore sopra definito
 


}


void loop() {
  units = scale.get_units(); //esegue una singola lettura e la salva dentro units
  if (units < 0) {
    units = 0.00;
  }//se il peso è minore di zero units = a 0
  if (digitalRead (8)){
    if ( (millis() - t) > debounce_delay) {
    peso_impostato+=1;
    t = millis();
    }
  }
   if (digitalRead (9)){
    if ((millis () - t) > debounce_delay) {
    (peso_impostato-=1);
    t = millis ();
    }
   }
   display.setTextSize(0.8);
  display.setCursor(0, 0);
  display.print("Peso impostato");
  display.setCursor(0, 9);
  display.setTextSize(2.2);
  display.print(peso_impostato);
  display.print("g."); 
   display.setTextSize(1);
  display.setCursor(0, 26);
  display.print("Peso rilevato");
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.setCursor(0, 37);
  display.print(units,0);
  display.print(" g.");
  display.display();
  Serial.println(peso_impostato);
  Serial.println(units);
  delay(200);//verificare con display se può essere rimosso o ridotto

 
   
if (units<=(peso_impostato-tolleranza)) {
    digitalWrite(5,LOW);
    }
    else{ digitalWrite(5,HIGH); }
   
    if (units>(peso_impostato+tolleranza)) {
    digitalWrite(6,LOW); //allarme cicalino segnaletico
    }
    else{ digitalWrite(6,HIGH); }
   
    if (units>=(peso_impostato-100)&&units<peso_impostato) {
    digitalWrite(7,LOW);//100 sono i grammi mancanti al raggiungimento pieno che rallenteranno il nastro
    }
     else{ digitalWrite(7,HIGH); }
   
}

Ecco il link per la foto oled — ImgBB
Scusate ma non riuscivo a pubblicarla diversamente. (la foto che vedete quì si riferisce al programma dove tutto è fermo mentre se lo mettevo in movimento non vedevo proprio più nulla a meno che non scolleghi la cella a quel punto vedo nuovamente Units)

Dalla foto mi pare semplicemente che stai stampando sempre sulla stessa posizione numeri diversi che si sovrappongono.
Se prima c'e' 10 poi 345 vedrai sovrapporsi 3 su 1 e 4 su 0
devi cancellare la zona.
Prova a stampare nella posizione " " una frase con spazi e poi sempre nella stessa zona (rimetti setcursor a stessa posizione) stampi il numero.
Oppure prova a cancellare la zona con un rettangolo pieno con colore invertito con fillRect
Qui in sezione "Rectangles":

Okay sta sera provo e ti faccio sapere! Grazie intanto.

Fantastico ho risolto, era proprio come dicevate voi!
Non pulivo il display o meglio quando avevo provato a pulirlo inserivo il comando nel posto sbagliato e quindi non funzionava, comunque grazie mille a tutti!!!

#include "HX711.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

HX711 scale(2, 3);

float calibration_factor = -1020; //valore che differisce per ogni tipo di cella di carico
float units;//misurazione peso
int peso_impostato=500; //peso da raggiungere
int tolleranza=20;  //tolleranza sul peso
long t = 0;  // valore di millis
long debounce_delay = 3000; // attesa ripetizione incremento con pulsante



void setup() {
   Serial.begin(9600);
  pinMode(8, INPUT);//pulsante 1
  pinMode(9, INPUT);//pulsante 2
  pinMode(4, INPUT); //da verificare con lcd
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Error..."));
    for (;;);
  }
  // the library initializes this with an Adafruit splash screen.
  display.display();
  display.clearDisplay();

  scale.set_scale();//inizializzazione
  scale.tare(); //tara
  scale.set_scale(calibration_factor); //calibrazione in base al valore sopra definito
 


}


void loop() {
  units = scale.get_units(); //esegue una singola lettura e la salva dentro units
  if (units < 0) {
    units = 0.00;
  }//se il peso è minore di zero units = a 0
  if (digitalRead (8)){
    if ( (millis() - t) > debounce_delay) {
    peso_impostato+=1;
    t = millis();
    }
  }
   if (digitalRead (9)){
    if ((millis () - t) > debounce_delay) {
    (peso_impostato-=1);
    t = millis ();
    }
   }
   display.clearDisplay();
   display.setTextSize(0.8);
  display.setCursor(0, 0);
  display.print("Peso impostato");
  display.setCursor(0, 9);
  display.setTextSize(2.2);
  display.print(peso_impostato);
  display.print("g."); 
   display.setTextSize(1);
  display.setCursor(0, 26);
  display.print("Peso rilevato");
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.setCursor(0, 37);
  display.print(units,0);
  display.print(" g.");
  display.display();
  Serial.println(peso_impostato);
  Serial.println(units);
  delay(200);//verificare con display se può essere rimosso o ridotto

 
   
if (units<=(peso_impostato-tolleranza)) {
    digitalWrite(5,LOW);
    }
    else{ digitalWrite(5,HIGH); }
   
    if (units>(peso_impostato+tolleranza)) {
    digitalWrite(6,LOW); //allarme cicalino segnaletico
    }
    else{ digitalWrite(6,HIGH); }
   
    if (units>=(peso_impostato-100)&&units<peso_impostato) {
    digitalWrite(7,LOW);//100 sono i grammi mancanti al raggiungimento pieno che rallenteranno il nastro
    }
     else{ digitalWrite(7,HIGH); }
   
}

In un programma del genere come posso contare il tempo ciclo dove il ciclo inizia quando:

if (units<=(peso_impostato-tolleranza)) {
digitalWrite(5,LOW);
}
else{ digitalWrite(5,HIGH); }

e finisce quando mi trovo nuovamente in quella condizione?

Perchè ho provato a farlo settando una variabile da 0 a 1, ma il problema è che lei mi diventa 0 non appena rimuovo il peso, per cui mi conterebbe soltanto quanto tempo ci ho messo espellerlo.

Come potrei fare?