Pages: 1 [2] 3   Go Down
Author Topic: Ersatz Fahrrad Computer durch Uno  (Read 5071 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gut, habe die Gesamt Kilometeranzeige wieder sichtbar gemacht.

Code:
lcd.setCursor(12, 0);
  dtostrf(kilometer,3, 1, buffer);
  lcd.print(buffer);

Stimmt das so mit den 3,1,?


Micky
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 138
Posts: 2891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
lcd.setCursor(12, 0);
  dtostrf(kilometer,3, 1, buffer);
  lcd.print(buffer);

Stimmt das so mit den 3,1,?

3 ist dann die von Dir gewählte Mindestbreite beim Formatieren, das würde nur für einstellige Kilometerzahlen mit einer Nachkommastelle reichen. Wenn die Zahlen größer werden, formatiert dtostrf automatisch längere Strings, Du mußt nur dafür sorgen, dass "buffer" dann auch breit genug ist.

Beim Kilometerzähler kannst Du es so machen, weil der Kilometerzähler nur vorwärts zählt und die Stellenanzahl daher nur zunehmen kann.

Aber bei der Geschwindigkeitsanzeige müßtest Du auf die tatsächliche maximale Breite formatieren, sonst gibt es beim langsamer werden merkwürdige Effekte.

Beispiel:
Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{
  lcd.begin(16,2);
}

void loop()
{
  char buffer[10];
  for (int i=80;i<120;i=i+3)
  {
    float kph=i/10.0;
    dtostrf(kph,3, 1, buffer);
    lcd.setCursor(0,0);
    lcd.print(buffer);
    delay(500);
  }
  for (int i=120;i>80;i=i-3)
  {
    float kph=i/10.0;
    dtostrf(kph,3, 1, buffer);
    lcd.setCursor(0,0);
    lcd.print(buffer);
    delay(500);
  }
}
Der Code zählt immer von 8.0 km/h bis 12.0 km/h hoch und wieder runter.

Beim Runterzählen wird beim Unterschreiten von 10.0 nur noch 3 Stellen breit formatiert, die letzte Stelle bleibt stehen und plötzlich werden zwei Nachkommastellen auf dem Display angezeigt, die letzte Stelle ist "eingefroren" (auf dem Wert, der zuletzt angezeigt wurde als die Anzeige eine Stelle länger war).

Wenn die Stellenzahl immer gleich bleiben und an gleicher Stelle auf einem Display erscheinen soll, müßtest Du immer auf gleiche Stellenzahl formatieren. D.h. zum Beispiel für eine maximal dreistellige Geschwindigkeit, Punkt und eine Nachkommastelle: 5 Stellen.
dtostrf(kph,5, 1, buffer);
Dann kannst Du hohe und niedrige Geschwindigkeiten auf dem Display an gleicher Stelle ausgeben und die Darstellung ist immer korrekt.

Wenn Du auf verschiedene Länge formatierst, müßtest Du stattdessen die tatsächliche Länge prüfen und ggf. übriggebliebene Zeichen auf dem Display gesondert löschen, z.B. durch Überschreiben mit Leerzeichen.

Zum Programmieren kannst Du übrigens nicht nur die auf der Arduino-Webseite beschriebenen Befehle benutzen, sondern die gesamte AVR-libc Library mit allen Funktionen. Die Referenz der Library findest Du hier:
http://www.nongnu.org/avr-libc/user-manual/modules.html

Mit Kurzbeschreibung der Funktion dtostrf unter: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42

Die Beschreibungen der Funktion sind in dieser Referenz immer sehr kurz gehalten, aber da es sich weitgehend um Standardfunktionen handelt, kannst Du Dir zu fast jeder Funktion andere Stellen im Internet ergoogeln, wo es ausführlichere Beschreibungen und Beispiele gibt.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann muß das mit der Buffer Breite normalerweise stimmen, sonst spinnt die Sache.

Wie geht denn das mit den großen Zahlen? Ich wollte da gerne was ändern, nur weiß ich nicht so recht wie. Wieso sind einige Custom Charactere leer? Ich kann lediglich an den waagerechten Zahlen Elementen was ändern. Bei den senkrechten nicht.


Micky
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 138
Posts: 2891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann muß das mit der Buffer Breite normalerweise stimmen, sonst spinnt die Sache.

Ja, wenn sich die Stellenzahl ändern kann und ein Wert immer an gleicher Stelle ausgegeben werden soll, dann muß die Formatierung auf eine bestimmte Stellenzahl stimmen.

Gleitkommazahlen müssen unter Arduino einzeln mit "dtostrf" formatiert werden, wenn eine bestimmte Gesamtbreite gefordert ist.
Andere Werte (int, long, C-Strings etc.) lassen sich auch mit "sprintf" oder "snprintf" formatieren.

Wie geht denn das mit den großen Zahlen? Ich wollte da gerne was ändern, nur weiß ich nicht so recht wie. Wieso sind einige Custom Charactere leer? Ich kann lediglich an den waagerechten Zahlen Elementen was ändern. Bei den senkrechten nicht.

???
Leer sind die Custom Characters, die gar nicht verwendet werden.

Schau Dir mal die Definition der Big-Digits an:
Code:
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"
};

Es gibt 8 benutzerdefinierbare Zeichen, diese haben die Codes "0" bis "7" in der Zeichentabelle.
Im diesem Fall werden aber überhaupt in der bignums-Definition nur die benutzerdefinierbaren Zeichen "0", "1" und "2" in der Definition der grossen Zeichen verwendet. Der Rest wird aus den in der "normalen" Zeichentabelle bereits vorhandenen Zeichen mit den Codes 254 und 255 zusammengebastelt.

Wenn Du Deine Big-Digits aus anderen Mustern zusammensetzen möchtest, dann mußt Du
a) die Custom Characters entsprechend definieren
b) das "bignums" Array so umschreiben, dass die entsprechenden Zeichen an der gewünschten Stelle verwendet werden

Wenn Du beispielsweise irgendwo anstelle eines "254" oder eines "255" Zeichens ein anderes, selbstdefiniertes Zeichen haben möchtest, dann machst Du das selbstdefinierte Zeichen dort, wo jetzt ein nicht verwendetes Zeichen mit lauter Nullen drin steht, sagen wir mal "Custom character 5". Und wo dieses Zeichen verwendet werden soll, trägst Du im bignums-Array die 5 ein.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 138
Posts: 2891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier die geänderte Version:

Code:
//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.h>
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
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 138
Posts: 2891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
//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.h>
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;
  }
}
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Micky
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 138
Posts: 2891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: June 28, 2013, 04:06:03 pm by jurs » Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Micky
« Last Edit: June 28, 2013, 04:55:38 pm by -Micky » Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Micky
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 161
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Micky?
Logged

Pages: 1 [2] 3   Go Up
Jump to: