u8gLib Zahlen fehlerhafte Darstellung. Hilfe

Hallo, ich bin neu und fange gerade an mich mit dem Arduino auseinanderzusetzen. Ich habe mir durch verschiedene Quellen einen Code zusammengestrickt, der mir auf einen Grafik LCD (128x64) Temperaturen und Geschwindigkeit anzeigt. Jetzt ist es nur so das wenn ich das Rad drehe mir auf dem Display zwar angezeigt wird wie schnell aber es kommt öfter vor das die Zahlen Fehler haben, also nicht das falsche Zahlen dort stehen sonder die Grafik.
Also die Zahlen haben dann Pixelausreisser oder einen Strich quer durch die Zahl. Manchmal passt es auch.
Kann mir wer Tipps geben was ich falsch gemacht habe? Hier ist erstmal der Code

#include "U8glib.h"
#include <OneWire.h> 
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3

#define Tankanzeige_width 18
#define Tankanzeige_height 18

#define Tankanzeige1_width 30
#define Tankanzeige1_height 30


static unsigned char Tankanzeige_bits[] U8G_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
   0x00, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x02, 0x00,
   0x00, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x06, 0x07, 0x03,
   0xc8, 0x8f, 0x00, 0x30, 0x72, 0x00, 0x06, 0x07, 0x01, 0xf8, 0xd8, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   
 };

 static unsigned char Tankanzeige1_bits[] U8G_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03,
   0x00, 0x00, 0xfe, 0x3f, 0x00, 0xe0, 0xe7, 0x3f, 0x00, 0x9e, 0x3f, 0x38,
   0x80, 0x8f, 0x03, 0x00, 0xc0, 0x80, 0x01, 0x00, 0x30, 0x80, 0x00, 0x00,
   0x10, 0x80, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x10, 0x83, 0x00, 0x00,
   0x90, 0x87, 0x00, 0x00, 0xc8, 0x4f, 0x00, 0x00, 0xcc, 0x29, 0x00, 0x00,
   0xa4, 0x29, 0x00, 0x00, 0xb2, 0x3d, 0x00, 0x00, 0xb3, 0x1c, 0x00, 0x00,
   0xe1, 0x0f, 0x00, 0x00, 0x8e, 0x05, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00,
   0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
   
 };

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);

U8GLIB_ST7920_128X64 u8g(13, 11, 10, U8G_PIN_NONE); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10

#define CHANGE 1
#define FALLING 2
#define RISING 3

unsigned long start, finished;
unsigned long elapsed, time;
float circ=0.88; // wheel circumference relative to sensor position (in meters)
float speedkph;  // holds calculated speed values in kilometres per hour
const int debounce = 20;  // debounce in milliseconds

void setup() 
{
   pinMode(2, INPUT_PULLUP); //external interrupt on pin2
  attachInterrupt(0, speedCalc, RISING); // interrupt called when rising edge is detected on digital pin 2
  start=millis();
  
sensors.begin(); 
 
}

void speedCalc()
{
  unsigned long now = millis();
  if(digitalRead(0) == HIGH) // check if the pin is really high
  {
    if (now - start > debounce)
    {
      elapsed = now - start;
      start = now;
      speedkph=(3600*circ)/elapsed; // kph
    }
  }
}

void loop() 
{
  {
    

  sensors.requestTemperatures();

  Serial.print("Temperature is: "); 
  Serial.print(sensors.getTempCByIndex(0));
  delay(1000);  }
 
 { if ((millis() - start) >= 2000){ 
    speedkph = 0;
    }

  u8g.firstPage();  
  do {
    draw();
    u8g.setRot90(); 
u8g.setFont(u8g_font_fub25);
u8g.setPrintPos(32, 60);

    if(speedkph <1) u8g.print("0"); 

    
    u8g.setFont(u8g_font_fub25);
    u8g.setPrintPos(15, 60);
    u8g.print(speedkph,0);
    u8g.setFont(u8g_font_8x13);
    u8g.drawStr( 17, 32, "km/h");
    u8g.setFont(u8g_font_8x13);
    u8g.setPrintPos(22, 14);
    u8g.print(sensors.getTempCByIndex(0),0);
    u8g.drawLine(0, 20, 64, 20);
    u8g.drawLine(0, 70, 64, 70);
    } while( u8g.nextPage() );
    delay(500);

}
}


void draw(void) { 
  u8g.drawXBMP(1,1, Tankanzeige_width,Tankanzeige_height,Tankanzeige_bits);



  u8g.drawXBMP(1,80, Tankanzeige1_width,Tankanzeige1_height,Tankanzeige1_bits);
}

Also der Sketch ist noch nicht fertig, ich probiere halt gerade etwas rum. Ich danke euch für die Hilfe und wünsche noch ein schönes WE.

LG Heiko

Was macht denn u8g.nextPage()?

Wenn die Ausgabe wirklich in mehreren Blöcken erfolgt, dann dürfen sich die Werte zwischendrin nicht ändern, also auch nicht per Interrupt.

Deine Klammerung ist sehr kreativ ;-) Kannst Du Deinen Code mal formatieren lassen und die überflüssigen Klammern rauswerfen?

Hallo, ganz ehrlich ich weiß leider noch so überhaupt nichts von der Programmierung des Arduino. Das ist mein erstes mal das ich mich daran austobe.wie kann ich denn den Code formatieren? Gibt es da Tools für? Ich besorge mir bald ein Buch und lerne erstmal ein bisschen. Habe nur gehofft das mir evtl. Wer helfen kann. Was heißt denn, wenn die Ausgabe in mehreren Blöcken erfolgt? Kann mir das jemand erklären? Ich bitte um etwas Nachsicht meiner "nicht Erfahrung"

Die u8g Library benutzt keinen großen Buffer in dem alle Bits des Bildes aufgebaut werden, sondern zeichnet für jedes Update alles neu, zum Löschen mit der Hintergrundfarbe.

Dazu braucht die Library dieses merkwürdige u8g.nextPage() Konstrukt, in dem jeweils Teile des Gesamtbilds generiert und übertragen werden.

Zumindestens habe ich das so verstanden. ;)

Formatieren geht in der IDE, mit Tools|Auto Format (CTRL+T)

Zum Lernen solltest Du erst mal die einfachen Beispiele (File|Examples...) durchprobieren und verstehen, dann die Beispiele zu Deiner TFT Bibliothek.