Ersatz Fahrrad Computer durch Uno

Hab es verstanden und die Zahlen etwas besser lesbar gemacht. Aber optimal ist das nicht. Besser wäre gleich ein Display mit größeren Ziffern.

Oder gleich ein Graikdisplay. Damit geht es dann viel einfacher größere Zahlen zu nehmen. Mal sehen.

Micky

-Micky: Besser wäre gleich ein Display mit größeren Ziffern.

Vierzeilige Textdisplays existieren, damit kannst Du Dir Big Digits auch über 4 Zeilen Höhe zusammenbasteln: http://www.phanderson.com/lcd106/lcd115_blue.jpg

Mit einer GPS-Tacho-App auf dem Smartphone, montiert am Lenker, ist der TÜV wohl nicht zufrieden, oder?

jurs: Vierzeilige Textdisplays existieren, damit kannst Du Dir Big Digits auch über 4 Zeilen Höhe zusammenbasteln: http://www.phanderson.com/lcd106/lcd115_blue.jpg

Mit einer GPS-Tacho-App auf dem Smartphone, montiert am Lenker, ist der TÜV wohl nicht zufrieden, oder?

Ja klar kann man das auch über 4 Zeilen machen. Nur finde ich das man viel zu eckige Zahlen erhält. Man kann ja nur 8 Zeichen neu definieren.

Müßte eigentlich durchgehen mit dem Smartphone. Find ich aber nicht so doll, ich möchte nichts außer Km/H und Kilometer angezeigt bekommen.

Vielleicht doch eine 7-Segmentanzeige nehmen. Obwohl, da ist ja auch wieder alles eckig. Ich probiere das mal mit meinem grafischem Display wie das aussieht.

Micky

Hier die geänderte Version:

//Anzahl Spalten des Display (16)
#define LCD_WIDTH 16

//Anzahl Zeilen des Display (2)
#define LCD_HEIGHT 2

// Pin für Reed-Kontakt, Digital-2 für Interrupt 0
#define REEDPIN 2

// Hardware-Interrupt für den Reed-Pin
#define REEDINTERRUPT 0

// Radumfang in mm
#define RADUMFANG 2260


#include 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// build 2-line digit font data array
// Digits are 3 characters wide.
byte bignums[10][2][3] = {
// Define which characters to use for each number. 255 is a solid block; 254 is a space  
// The format is { {TopLeft, TopMiddle, TopRight}, {BottomLeft, BottomMiddle, BottomRight} }
 { {255, 0, 255}, {255, 1, 255} },        // data to display "0"
 { {0, 255, 254}, {1, 255, 1} },          // data to display "1"
 { {0, 5, 255}, {255, 1, 1} },            // data to display "2"
 { {0, 5, 255}, {1, 1, 255} },            // data to display "3"
 { {255, 1, 255}, {254, 254, 255} },      // data to display "4"
 { {255, 5, 5}, {1, 1, 255} },            // data to display "5"
 { {255, 5, 5}, {255, 1, 255} },          // data to display "6"
 { {0, 0, 255}, {254, 255, 254} },        // data to display "7"
 { {255, 5, 255}, {255, 1, 255} },        // data to display "8"
 { {255, 5, 255}, {254, 254, 255} }       // data to display "9"
};

void loadchars() {                        // This subroutine programs the custom character data into the LCD
  lcd.command(64);
// Custom character 0
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  
// Custom character 1
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  
// Custom character 2
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  
// Custom character 3
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B01110));
  lcd.write(byte(B01110));
  lcd.write(byte(B01110));
  
// Custom character 4
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B01110));
  lcd.write(byte(B01110));
  lcd.write(byte(B01110));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  
// Custom character 5
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  
// Custom character 6
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B11110));
  lcd.write(byte(B11111));
  
// Custom character 7
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));

  lcd.home();
}

void printbigchar(byte digit, byte col) { // This subroutine prints the big font characters on the LCD screen
 if (digit > 9) return;                   // reject anything above 9
 for (int i = 0; i < 2; i++) {            // count i from 0 to 1
   lcd.setCursor(col*4 , i);              // set LCD cursor at correct point
   for (int j = 0; j < 3; j++) {          // count j from 0 to 2
     lcd.write(bignums[digit][i][j]);     // write proper block to LCD from array
   }
   lcd.write(254);                        // write an empty space
 }
 lcd.setCursor(col + 4, 0);               // move the cursor to the top line, col + 4
}


void setup(){
  pinMode(REEDPIN, INPUT_PULLUP); // Reedkontakt direkt und ohne Widerstand angeschlossen  
  lcd.begin(LCD_WIDTH, LCD_HEIGHT);
  loadchars();
  attachInterrupt(REEDINTERRUPT, reedISR, FALLING);
}

volatile byte reedCountSum;
volatile long reedMillisSum;

unsigned long lastReedMillis;

void reedISR()
{
  if (millis()-lastReedMillis>=25)  // 25ms entspricht max. 40 Radumdrehungen pro Sekunde
  {
    reedCountSum++;                 // eine Radumdrehung zählen
    reedMillisSum+=millis()-lastReedMillis;   // Zeit addieren
    lastReedMillis=millis();       // Zeit merken
  }
}

unsigned long gesamtUmdrehungen;

void tachoAnzeige()
{
  byte umdrehungen;
  unsigned long zeit;
  float kph, kilometer;
  int kphRounded;
  char buffer[10];
  noInterrupts();            // Interrupts sperren
    umdrehungen=reedCountSum;// Zählvariable umkopieren
    reedCountSum=0;          // Zählvariable auf 0 zurücksetzen
    zeit=reedMillisSum;      // Zeitzähler umkopieren
    reedMillisSum=0;         // Zeitzähler auf 0 zurücksetzen
  interrupts();              // Interrupts wieder zulassen
  gesamtUmdrehungen+= umdrehungen; // Aufsummieren aller Radumdrehungen
  kilometer=(float)gesamtUmdrehungen*(float)RADUMFANG/1000000.0; // Fahrtkilometerzähler
  if (umdrehungen>0)
    kph=float(RADUMFANG)*(float)umdrehungen/(float)zeit*3.6;
  else
    kph=0.0;  
  
  lcd.setCursor(12, 0);
  dtostrf(kilometer,3, 1, buffer);
  lcd.print(buffer);
  /*  
  lcd.setCursor(0, 0);
  dtostrf(kilometer,9,3,buffer);
  lcd.print(buffer);
  lcd.print(" km");
  lcd.setCursor(0, 1);
  lcd.print("KM/H ");
  dtostrf(kph,5,1,buffer);
  */
  kphRounded=int(kph+0.5); // auf ganze kph gerundet
  // Ausgabe kph in grossen Ziffern
  kphRounded = kphRounded % 1000;       // drop any digits above 999
  printbigchar(kphRounded / 100,0);     // print the speed hundreds
  kphRounded = kphRounded % 100;        // drop any digits above 99
  printbigchar(kphRounded/10,1);        // print the speed tens
  kphRounded = kphRounded % 10;         // drop any digits above 9
  printbigchar(kphRounded,2);           // print the speed ones
  lcd.setCursor(12, 1);
  lcd.print("km/h");
}


unsigned long letzteSekunde=0;
void loop()
{
  unsigned long dieseSekunde=millis()/1000;
  // Tachoanzeige wird genau einmal pro Sekunde aktualisiert
  if (letzteSekunde != dieseSekunde)
  {
    tachoAnzeige();
    letzteSekunde=dieseSekunde;
  }
}

Micky

-Micky: Nur finde ich das man viel zu eckige Zahlen erhält. Man kann ja nur 8 Zeichen neu definieren.

Ja klar, irgendwo ist Schluss mit den Textdisplay-Tricksereien.

Anbei nochmal eine Version mit großen "abgerundeten" Ziffern.

//Anzahl Spalten des Display (16)
#define LCD_WIDTH 16

//Anzahl Zeilen des Display (2)
#define LCD_HEIGHT 2

// Pin für Reed-Kontakt, Digital-2 für Interrupt 0
#define REEDPIN 2

// Hardware-Interrupt für den Reed-Pin
#define REEDINTERRUPT 0

// Radumfang in mm
#define RADUMFANG 2260


#include 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


void loadchars() {                        // This subroutine programs the custom character data into the LCD
// the 8 arrays that form each segment of the custom numbers
byte LT[8] = 
{
  B00111,
  B01111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte UB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
byte RT[8] =
{
  B11100,
  B11110,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte LL[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111
};
byte LB[8] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};
byte LR[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100
};
byte MB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111
};
byte block[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
// assignes each segment a write number
  lcd.createChar(0,LT);
  lcd.createChar(1,UB);
  lcd.createChar(2,RT);
  lcd.createChar(3,LL);
  lcd.createChar(4,LB);
  lcd.createChar(5,LR);
  lcd.createChar(6,MB);
  lcd.createChar(7,block);
}

byte bignums[10][2][3] = {
// Define which characters to use for each number. 255 is a solid block; 254 is a space  
// The format is { {TopLeft, TopMiddle, TopRight}, {BottomLeft, BottomMiddle, BottomRight} }
 { {0, 1, 2},   {3, 4, 5} },        // data to display "0"
 { {1, 2, 254}, {4, 7, 4} },          // data to display "1"
 { {6, 6, 2},   {3, 4, 4} },            // data to display "2"
 { {6, 6, 2},   {4, 4, 5} },            // data to display "3"
 { {3, 4, 7},   {254, 254, 7} },      // data to display "4"
 { {3, 6, 6},   {4, 4, 5} },            // data to display "5"
 { {0, 6, 6},   {3, 4, 5} },          // data to display "6"
 { {1, 1, 2},   {254, 254, 7} },        // data to display "7"
 { {0, 6, 2},   {3, 4, 5} },        // data to display "8"
 { {0, 6, 2},   {254, 254, 7} }       // data to display "9"
};

void printbigchar(byte digit, byte col) { // This subroutine prints the big font characters on the LCD screen
 if (digit > 9) return;                   // reject anything above 9
 for (int i = 0; i < 2; i++) {            // count i from 0 to 1
   lcd.setCursor(col*4 , i);              // set LCD cursor at correct point
   for (int j = 0; j < 3; j++) {          // count j from 0 to 2
     lcd.write(bignums[digit][i][j]);     // write proper block to LCD from array
   }
   lcd.write(254);                        // write an empty space
 }
 lcd.setCursor(col + 4, 0);               // move the cursor to the top line, col + 4
}


void setup(){
  pinMode(REEDPIN, INPUT_PULLUP); // Reedkontakt direkt und ohne Widerstand angeschlossen  
  lcd.begin(LCD_WIDTH, LCD_HEIGHT);
  loadchars();
  attachInterrupt(REEDINTERRUPT, reedISR, FALLING);
}

volatile byte reedCountSum;
volatile long reedMillisSum;

unsigned long lastReedMillis;

void reedISR()
{
  if (millis()-lastReedMillis>=25)  // 25ms entspricht max. 40 Radumdrehungen pro Sekunde
  {
    reedCountSum++;                 // eine Radumdrehung zählen
    reedMillisSum+=millis()-lastReedMillis;   // Zeit addieren
    lastReedMillis=millis();       // Zeit merken
  }
}

unsigned long gesamtUmdrehungen;

void tachoAnzeige()
{
  byte umdrehungen;
  unsigned long zeit;
  float kph, kilometer;
  int kphRounded;
  char buffer[10];
  noInterrupts();            // Interrupts sperren
    umdrehungen=reedCountSum;// Zählvariable umkopieren
    reedCountSum=0;          // Zählvariable auf 0 zurücksetzen
    zeit=reedMillisSum;      // Zeitzähler umkopieren
    reedMillisSum=0;         // Zeitzähler auf 0 zurücksetzen
  interrupts();              // Interrupts wieder zulassen
  gesamtUmdrehungen+= umdrehungen; // Aufsummieren aller Radumdrehungen
  kilometer=(float)gesamtUmdrehungen*(float)RADUMFANG/1000000.0; // Fahrtkilometerzähler
  if (umdrehungen>0)
    kph=float(RADUMFANG)*(float)umdrehungen/(float)zeit*3.6;
  else
    kph=0.0;  
  
  lcd.setCursor(12, 0);
  dtostrf(kilometer,3, 1, buffer);
  lcd.print(buffer);
  /*  
  lcd.setCursor(0, 0);
  dtostrf(kilometer,9,3,buffer);
  lcd.print(buffer);
  lcd.print(" km");
  lcd.setCursor(0, 1);
  lcd.print("KM/H ");
  dtostrf(kph,5,1,buffer);
  */
  kphRounded=int(kph+0.5); // auf ganze kph gerundet
  // Ausgabe kph in grossen Ziffern
//  kphRounded=random(999);  // nur zum Testen
    
  kphRounded = kphRounded % 1000;       // drop any digits above 999
  printbigchar(kphRounded / 100,0);     // print the speed hundreds
  kphRounded = kphRounded % 100;        // drop any digits above 99
  printbigchar(kphRounded/10,1);        // print the speed tens
  kphRounded = kphRounded % 10;         // drop any digits above 9
  printbigchar(kphRounded,2);           // print the speed ones
  lcd.setCursor(12, 1);
  lcd.print("km/h");
}


unsigned long letzteSekunde=0;
void loop()
{
  unsigned long dieseSekunde=millis()/1000;
  // Tachoanzeige wird genau einmal pro Sekunde aktualisiert
  if (letzteSekunde != dieseSekunde)
  {
    tachoAnzeige();
    letzteSekunde=dieseSekunde;
  }
}

Sieht auch nicht schlecht aus, finde aber die Lesbarkeit nicht so gut.

Micky

Habe jetzt mal ein GLCD angeschlossen und den Code entsprechend umgestrickt. Sind die, im Gegensatz zu Textdisplays so langsam, das Reste von den vorherigen Zahlen stehen bleiben?

Mickxy

-Micky: Sind die, im Gegensatz zu Textdisplays so langsam, das Reste von den vorherigen Zahlen stehen bleiben?

Um beispielsweise 32*32 Pixel in 3 RGB Werten auszugeben sind natürlich sehr viel mehr Daten zu übertragen als wenn nur ein einziges Byte geändert werden muß.

Das hat aber nichts mit übrigbleibenden Resten der vorherigen Zahlen zu tun. Der Effekt hängt eher damit zusammen, dass Du möglicherweise erstmal den Bereich, auf dem ein neuer Text erscheinen soll, löschen bzw. mit der Hintergrundfarbe übermalen mußt, bevor Du neue Pixel darauf ausgeben kannst. Es kann auch sein, dass es für die Textausgabefunktion einen Parameter gibt oder eine Funktion mit etwas anderem Namen, die gleichzeitig mit der Textausgabe auch den Hintergrund neu ausmalt.

Die Library-Dokumentation oder der Quellcode sollte darüber Auskunft geben.

Danke für die Hinweise. GLCD.println(buffer); statt GLCD.print(buffer); funktioniert.

Micky

Das Display stellt schnelle Werte zu langsam da. Ist nicht dafür geeignet.

Micky

Wie kann man eigentlich die Anzeige der Kilometer so machen, das die Werte immer an der gleichen Stelle dargestellt werden?

Micky?

-Micky: Wie kann man eigentlich die Anzeige der Kilometer so machen, das die Werte immer an der gleichen Stelle dargestellt werden?

Im Normalfall macht man das, indem man auf eine feste Stellenzahl formatiert.

Beispiel: Der Kilometerzähler soll bis 99999 km auf ganze km ohne Nachkommastellen angezeigt werden, dann formatierst Du den Kilometerstand auf einen String mit 5 Zeichen Breite, keine Nachkommastellen, und wenn Du den String immer an derselben Position ausgibst, erscheinen die Einerstellen immer ganz rechts, die Zehnerstellen als zweite Stelle von rechts usw. und das ganz unabhängig davon, ob der Kilometerstand ein-, zwei-, drei-, vier-, oder fünfstellig ist.

Nun hab ich es auch verstanden. 12345,67 muß dann heißen: 8,2,buffer.

Oder 123,456: 7,3 buffer.

Die Zahl vor dem Komma dient als Platzhalter für zu erwartende Zahlen und die hinter dem Komma für die Nachkommastellen. In Nullstellung wird aber nur die Null vor dem Komma aber alle Nullen nach dem Komma angezeigt.

Ich hoffe das stimmt jetzt so.

Micky

-Micky: Nun hab ich es auch verstanden. 12345,67 muß dann heißen: 8,2,buffer.

Ja, das sind 8 Zeichen gesamt, 2 Stellen nach dem Dezimalpunkt.

-Micky: Oder 123,456: 7,3 buffer.

Ja, das sind 7 Zeichen gesamt, 3 Stellen nach dem Dezimalpunkt.

Übrigens: Das Array zur Aufnahme der Zeichen muss immer (Minimum!) um eins länger sein, also 9 bzw 8 für eine Formatierung auf 8 und 7 Stellen: C-Strings werden intern nämlich immer mit einem abschließenden Nullzeichen gespeichert. Wenn der Puffer aus Versehen zu klein ist und Du formatierst über das Pufferende hinaus, können im Programm sehr schwierig zu entdeckende Fehler in anderen Programmstellen auftreten.

Hier mal was zum aktuellen Stand. Ist aber noch nicht ganz fertig. Ein Bild zeigt die Steuereinheit und das andere das Display.

Micky

K800_SDC11264.JPG|800x600

K800_SDC11266.JPG|800x600

Wie bekomme ich die große Schrift auf einem 8x2 Display unter? Paßt natürlich so nicht. Und ich weiß nicht wo ich den Code so abändern kann das nur drei Zahlen dargestellt werden.

Micky

-Micky: Wie bekomme ich die große Schrift auf einem 8x2 Display unter? Paßt natürlich so nicht. Und ich weiß nicht wo ich den Code so abändern kann das nur drei Zahlen dargestellt werden.

Das ist jetzt aber die Wärme, oder?

Du brauchst nur die Display-Initialisierung auf das 8x2 Display anpassen und dann mußt Du eben die Ausgabe so kurz halten, dass nicht hinter das achte Zeichen geschrieben wird. Z.B. eine Anzeige nur mit dreistelliger Geschwindigkeit, ohne Nachkommastellen, linksbündig:

void tachoAnzeige()
{
  byte umdrehungen;
  unsigned long zeit;
  float kph, kilometer;
  int kphRounded;
  char buffer[10];
  noInterrupts();            // Interrupts sperren
    umdrehungen=reedCountSum;// Zählvariable umkopieren
    reedCountSum=0;          // Zählvariable auf 0 zurücksetzen
    zeit=reedMillisSum;      // Zeitzähler umkopieren
    reedMillisSum=0;         // Zeitzähler auf 0 zurücksetzen
  interrupts();              // Interrupts wieder zulassen
  if (umdrehungen>0)
    kph=float(RADUMFANG)*(float)umdrehungen/(float)zeit*3.6;
  else
    kph=0.0;  
  kphRounded=int(kph+0.5); // auf ganze kph gerundet
    
  kphRounded = kphRounded % 1000;       // drop any digits above 999
  printbigchar(kphRounded / 100,0);     // print the speed hundreds
  kphRounded = kphRounded % 100;        // drop any digits above 99
  printbigchar(kphRounded/10,1);        // print the speed tens
  kphRounded = kphRounded % 10;         // drop any digits above 9
  printbigchar(kphRounded,2);           // print the speed ones
}

Nee, daran liegt es nicht. Ich hab schon alles mögliche versucht. Ich kriege zwar eine zweistellige Anzeige hin, nur brauche ich aber eine dreistellige. Was geholfen hat ist statt long short zu nehmen.

Ich weiß nicht wo man die Nachkommastellen angibt. Bei diesem hier wäre das klar:

lcd.setCursor(0, 0);
  dtostrf(kilometer,9,3,buffer);
  lcd.print(buffer);
  lcd.print(" km");
  lcd.setCursor(0, 1);
  lcd.print("KM/H ");
  dtostrf(kph,5,1,buffer);

nicht aber bei dem von Dir genommenen Code. Hier ist der Code wie ich ihn eben nehme:

//Anzahl Spalten des Display (8)
//#define LCD_WIDTH 8

//Anzahl Zeilen des Display (2)
//#define LCD_HEIGHT 2

// Pin für Reed-Kontakt, Digital-2 für Interrupt 0
#define REEDPIN 2

// Hardware-Interrupt für den Reed-Pin
#define REEDINTERRUPT 0

// Radumfang in mm
#define RADUMFANG 1540


//#include 
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#include  // Für I2C LCD Display
#include 
LiquidCrystal_I2C lcd(0x27,8,2);  // I2C LCD Adresse auf 0x20 gesetzt, 16 Zeichen / 2 Zeilen LCD


// build 2-line digit font data array
// Digits are 3 characters wide.
byte bignums[10][2][3] = {
// Define which characters to use for each number. 255 is a solid block; 254 is a space  
// The format is { {TopLeft, TopMiddle, TopRight}, {BottomLeft, BottomMiddle, BottomRight} }
 { {255, 0, 255}, {255, 1, 255} },        // data to display "0"
 { {0, 255, 254}, {1, 255, 1} },          // data to display "1"
 { {2, 2, 255}, {255, 1, 1} },            // data to display "2"
 { {0, 2, 255}, {1, 1, 255} },            // data to display "3"
 { {255, 1, 255}, {254, 254, 255} },      // data to display "4"
 { {255, 2, 2}, {1, 1, 255} },            // data to display "5"
 { {255, 2, 2}, {255, 1, 255} },          // data to display "6"
 { {0, 0, 255}, {254, 255, 254} },        // data to display "7"
 { {255, 2, 255}, {255, 1, 255} },        // data to display "8"
 { {255, 2, 255}, {254, 254, 255} }       // data to display "9"
};

void loadchars() {                        // This subroutine programs the custom character data into the LCD
  lcd.command(64);
// Custom character 0
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  
// Custom character 1
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  
// Custom character 2
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  lcd.write(byte(B11111));
  
// Custom character 3
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B01110));
  lcd.write(byte(B01110));
  lcd.write(byte(B01110));
  
// Custom character 4
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B01110));
  lcd.write(byte(B01110));
  lcd.write(byte(B01110));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  
// Custom character 5
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  
// Custom character 6
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  
// Custom character 7
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));
  lcd.write(byte(B00000));

  lcd.home();
}

void printbigchar(byte digit, byte col) { // This subroutine prints the big font characters on the LCD screen
 if (digit > 9) return;                   // reject anything above 9
 for (int i = 0; i < 2; i++) {            // count i from 0 to 1
   lcd.setCursor(col*4 , i);              // set LCD cursor at correct point
   for (int j = 0; j < 3; j++) {          // count j from 0 to 2
     lcd.write(bignums[digit][i][j]);     // write proper block to LCD from array
   }
   lcd.write(254);                        // write an empty space
 }
 lcd.setCursor(col + 4, 0);               // move the cursor to the top line, col + 4
}


void setup(){
  
  // LCD I2C Initilaisieren und Hintergrundbeleuchtung aktivieren
   lcd.init();
   lcd.backlight();     
   
   lcd.init();                                        // LCD-Anzeige initialisieren
   lcd.clear();
  
  pinMode(REEDPIN, INPUT_PULLUP); // Reedkontakt direkt und ohne Widerstand angeschlossen  
  //lcd.begin(LCD_WIDTH, LCD_HEIGHT);
  loadchars();
  attachInterrupt(REEDINTERRUPT, reedISR, FALLING);
}

volatile byte reedCountSum;
volatile short reedMillisSum;

unsigned short lastReedMillis;

void reedISR()
{
  if (millis()-lastReedMillis>=25)  // 25ms entspricht max. 40 Radumdrehungen pro Sekunde
  {
    reedCountSum++;                 // eine Radumdrehung zählen
    reedMillisSum+=millis()-lastReedMillis;   // Zeit addieren
    lastReedMillis=millis();       // Zeit merken
  }
}

unsigned short gesamtUmdrehungen;

void tachoAnzeige()
{
  byte umdrehungen;
  unsigned short zeit;
  float kph, kilometer;
  int kphRounded;
  char buffer[10];
  noInterrupts();            // Interrupts sperren
    umdrehungen=reedCountSum;// Zählvariable umkopieren
    reedCountSum=0;          // Zählvariable auf 0 zurücksetzen
    zeit=reedMillisSum;      // Zeitzähler umkopieren
    reedMillisSum=0;         // Zeitzähler auf 0 zurücksetzen
  interrupts();              // Interrupts wieder zulassen
  gesamtUmdrehungen+= umdrehungen; // Aufsummieren aller Radumdrehungen
  kilometer=(float)gesamtUmdrehungen*(float)RADUMFANG/1000000.0; // Fahrtkilometerzähler
  if (umdrehungen>0)
    kph=float(RADUMFANG)*(float)umdrehungen/(float)zeit*3.6;
  else
    kph=0.0;  
  /*  
  lcd.setCursor(0, 0);
  dtostrf(kilometer,9,3,buffer);
  lcd.print(buffer);
  lcd.print(" km");
  lcd.setCursor(0, 1);
  lcd.print("KM/H ");
  dtostrf(kph,5,1,buffer);
  */
  kphRounded=int(kph+0.5); // auf ganze kph gerundet
  // Ausgabe kph in grossen Ziffern
  
  kphRounded = kphRounded % 1000;       // drop any digits above 999
  printbigchar(kphRounded / 100,0);     // print the speed hundreds
  kphRounded = kphRounded % 100;        // drop any digits above 99
  printbigchar(kphRounded/10,1);        // print the speed tens
  kphRounded = kphRounded % 10;         // drop any digits above 9
  printbigchar(kphRounded,2);           // print the speed ones
  //lcd.setCursor(12, 1);
  //lcd.print("km/h");
}


unsigned short letzteSekunde=0;
void loop()
{
  unsigned short dieseSekunde=millis()/1000;
  // Tachoanzeige wird genau einmal pro Sekunde aktualisiert
  if (letzteSekunde != dieseSekunde)
  {
    tachoAnzeige();
    letzteSekunde=dieseSekunde;
  }
}

Das entscheidene ist ja wohl der Teil den Du hier vorhin reingesetzt hast. Nur wo bitte muß ich da was ändern?

Hinzu kommt noch das die Anzeige nun viel zu träge reagiert.

Micky

-Micky: Nee, daran liegt es nicht. Ich hab schon alles mögliche versucht. Ich kriege zwar eine zweistellige Anzeige hin, nur brauche ich aber eine dreistellige.

Dann nimm wieder das 16x2 Display, ein 8x2 Display ist dafür zu klein!

Für eine Anzeige großer Ziffern mit "printbigchar" brauchst Du immer 3 Zeichen Breite, das macht bei dreistelliger Anzeige: printbigchar 3 Zeichen + 1 Zeichen Abstand + printbigchar 3 Zeichen + 1 Zeichen Abstand + printbigchar 3 Zeichen = 11 Zeichen insgesamt Da ist ein Display mit 8 Zeichen insgesamt zu wenig.

Selbst wenn Du sagst, Geschwindigkeiten unter 200 km/h reichen aus und Du würdest als 1 einen einfachen Strich von 1 Zeichen Breite nehmen, passt es immer noch nicht. Dann brauchst die dargestellte Ziffer "1" per printbigchar zwar 2 Zeichen weniger, macht also 9 statt 11 Zeichen insgesamt, aber 9 ist immer noch eins zuviel für ein Display mit 8 Zeichen in einer Zeile.

Dann liegt es doch nicht daran das ich es nicht hinbekomme. Das Display ist halt ein bißchen zu klein. Das macht aber nichts. Dann nehme ich halt die normale Schriftgröße.

Oder halt eine Vergrößerungsfolie darüber befestigen.

Micky