Bargraph als "Dot" ?

Huhu, ich schon wieder.

An einem Analogeingang wird eine Spannung ausgewertet.
Am angeschlossenen Display soll nun der Wert als Balkenanzeige angezeigt werden.
Allerdings nicht als Balken der sich von links beginnend aufbaut.
Sondern lediglich ein "|" oder als 5x8 pixel lcd Block der je nach Wert wandert.

Kann mir da jemand einen Denkansatz liefern?

Danke schonmal

Hi

Generiere Dir eigene Zeichen oder setze die paar Pixel 'von Hand'.

MfG

Wenn Du ein paar Hinweise geben könntest, um was für ein Displaytyp es sich handelt, wäre es einfacher, Lösungsansätze zu finden.

Gruß Tommy

Gern. Es ist ein 4x20 Zeichen LC-Display mit HD44780 Controller.

Ich habe mal ein Bild angehängt damit es verständlicher ist.

Hi

Schau Dir Mal das Projekt an, ist ein Thread hier aus dem Forum (LCD-Menü):
http://forum.arduino.cc/index.php?topic=73816.1400
Dort werden auch Zeichen für einen Scroll-Balken im LCD generiert.

MfG

Hallo,
oder schau vielleicht auch mal hier nach, dort gibt es sogar Zeichengeneratoren
Gruß, Rudi

Ja okay, wie ich den Cursor kreiere ist klar. Aber gibt es eine Möglichkeit das nur dieser zu sehen ist?

RaffaySH:
Ja okay, wie ich den Cursor kreiere ist klar. Aber gibt es eine Möglichkeit das nur dieser zu sehen ist?

Dazu brauchst Du doch nur den Cursor positionieren (lcd.setCursor) und das Cursor-Symbol schreiben (lcd.write).

Mir drängt sich die Vermutung auf, dass der TO sich mit seiner Frage sehr unglücklich (unverständlich) ausgedrückt hat - und dadurch keine Antwort auf seine Frage in greifbarer Nähe ist. Vielleicht sollte er etwas näher beschreiben, was er denn "genau" erreichen will. Vielleicht durch eine Zeichnung oder ähnliches untermalen?! Ein Bild sagt in der Regel mehr aus als tausend Worte...

Ich habe jetzt hier nur ein 4x20 LCD mit I2C-Backpack zum testen.
Du musst also ggf. die Ansteuerung für das LCD ändern, aber ansonsten sollte das so gehen:

#include <LiquidCrystal_I2C.h>              // von https://github.com/marcoschwartz/LiquidCrystal_I2C

LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C-Adresse, Spalten, Zeilen

uint8_t bar[][8] = {
  {B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000},
  {B01000, B01000, B01000, B01000, B01000, B01000, B01000, B01000},
  {B00100, B00100, B00100, B00100, B00100, B00100, B00100, B00100},
  {B00010, B00010, B00010, B00010, B00010, B00010, B00010, B00010},
  {B00001, B00001, B00001, B00001, B00001, B00001, B00001, B00001}
};
uint8_t ae[8] = {B01010, B00000, B01110, B00001, B01111, B10001, B01111, B00000};
uint8_t volume = 34; // Wert von 0...99

void setVolume(uint8_t vol, uint8_t row) {
  if (vol > 99) return;
  lcd.setCursor(vol / 5, row);
  lcd.write(vol % 5);
}

void setup() {
  Serial.begin(115200);
  lcd.init();
  lcd.backlight();
  for (byte i = 0; i < 5; i++) {
    lcd.createChar(i, bar[i]);
  }
  lcd.createChar(5, ae);
  lcd.setCursor(0, 0);
  lcd.print(F("Lautst"));
  lcd.write(5);
  lcd.print(F("rke"));
  setVolume(volume, 1);
}

void loop() {
  // put your main code here, to run repeated
}

Hallo,

mir ist noch nicht klar welchen grafischen Effekt der TO wirklich haben möchte.
Dünner senkrechter "Balken" könnte durchaus gemeint sein.

Die feinere Balkenabstufung wurde schon gezeigt. Unabhängig vom Effekt muss nur noch die Intelligenz rein das je nach Cursorposition und Analogwert der richtige Pattern ausgewählt wird. Zudem müssen alle Zellen davor komplett gefüllt werden und rückwärts die letzte Zelle wieder gelöscht. Mehr Zauber ist das nicht. :wink:

Doc_Arduino:
mir ist noch nicht klar welchen grafischen Effekt der TO wirklich haben möchte.
Dünner senkrechter "Balken" könnte durchaus gemeint sein.

Im ersten Post schreibt er doch:

RaffaySH:
Allerdings nicht als Balken der sich von links beginnend aufbaut.
Sondern lediglich ein "|" oder als 5x8 pixel lcd Block der je nach Wert wandert.

und in Post#3 hat er einen Link zu einem Bild gepostet, bei dem ich das so verstehe, dass er das untere Bild meint.
Mein Sketch unterteilt den 5x8 Block nun noch in einzelne Balken, sodass man auf einem 20-Spalten-LCD eine Auflösung von 100 Balken bekommt.

Hallo,

ist schon okay, "Dot" & "Balken" kann man durchaus groooßzügig auslegen ... :grin:

slartibartfast:
Dazu brauchst Du doch nur den Cursor positionieren (lcd.setCursor) und das Cursor-Symbol schreiben (lcd.write).

... und vorher die alte Position löschen. Das hast Du in #9 leider vergessen, läßt sich aber leicht ergänzen:

void setVolume(uint8_t vol, uint8_t row) {
  static uint8_t alt = 100;
  if (vol != alt) {
    lcd.setCursor(alt / 5, row);
    lcd.print(' ');
    if (vol > 99) return;
    lcd.setCursor(vol / 5, row);
    lcd.write(vol % 5);
    alt = vol;
  }
}

Dein Programm kommt in meine Sammlung nützlicher Dinge, die man mal gebrauchen könnte :slight_smile:

Der TO hätte sich ja auch mal melden können :sob: :smiling_imp:

EDIT: Abfrage auf Änderung eingefügt.

Hallo,

so einfach ist das nun auch nicht. :wink: Denn es hat einen häßlichen optischen Fehler.
Schau dir das einmal an wenn das Zeichen auf der Stelle tritt.
Erst bei Änderung der Cursorposition sollten Aktionen starten.

Aber, ich verstehe jetzt was der TO mit "DOT" im Zusammenhang mit Balken meint. Ein einzelner Balken soll alleine wandern. :slight_smile:

Doc_Arduino:
Denn es hat einen häßlichen optischen Fehler.

Sorry, ich sehe es nicht :o

Doc_Arduino:
Erst bei Änderung der Cursorposition sollten Aktionen starten.

Das habe ich in #13 eingebaut, sollte man so machen.

Hallo,

der Effekt war vorher das die Zeichendarstellung "flimmerte". Weil ständig die aktuelle Zelle gelöscht und wieder beschrieben wurde. Dadurch hatte die Darstellung nicht den vollen Kontrast. Auch wenn sie stand. Jetzt ist der Effekt weg wenn sich der Eingangswert nicht ändert.

Wenn er sich ändert, ist der Effekt praktisch wieder vorhanden. Denn die Eingangswerte können sich zwar ändern, aber die Zellenposition kann bis zu 5x gleich bleiben. Der "schwache Kontrast" Effekt ist nun Geschwindigkeitsabhängig.

Und ich verrate noch das nächste Problem. Was passiert wenn die Werte vom A/D Sprünge machen?

(Text nochmals korrigiert)

Ich komme mir etwas vor wie bei "Ich sehe was, was Du nicht siehst!".

Doc_Arduino:
der Effekt war vorher das die Zeichendarstellung "flimmerte".

War mir nicht aufgefallen.

Doc_Arduino:
Wenn er sich ändert, ist der Effekt praktisch wieder vorhanden.

Ich denke, das ist halt so. Zumindest fällt mir kein Gegenmittel ein.

Doc_Arduino:
Und ich verrate noch das nächste Problem. Was passiert wenn die Werte vom A/D Sprünge machen?

Der alte Balken wird gelöscht, der neue geschrieben.

Eine kleine Optimierung habe ich noch, wenn der Balken innerhalb des Zeichens bleibt:

void setVolume(uint8_t vol, uint8_t row) {
  static uint8_t alt = 100;
  if (vol != alt) {
    if (vol / 5 != alt / 5) {
      lcd.setCursor(alt / 5, row);
      lcd.print(' ');
    }
    if (vol > 99) return;
    lcd.setCursor(vol / 5, row);
    lcd.write(vol % 5);
    alt = vol;
  }
}

Hallo,

genau, Zellenposition vergleichen. Perfekt. Spart auch Zeit für Cursor setzen und Zeichen schreiben.

Wegen dem angesprochenen nächsten Problem. Ja da war ich gestern wohl schon zu müde. Ich habe das bei mir anders aufgebaut, dadurch habe ich es hier übersehen :confused: , weil der Ablauf anders ist. Alles gelöst, alles passt. :slight_smile: Ich hoffe der TO weiß das zu schätzen.

Doc_Arduino:
Alles gelöst, alles passt. :slight_smile:

:slight_smile:

Doc_Arduino:
Ich hoffe der TO weiß das zu schätzen.

Warten wir mal ab, aber ich mache das aus Respekt vor slartibartfast und weil es mir Spaß macht.

Möglicherweise gibt es ja auch anonyme Mitleser, die sich freuen. Am Anfang habe ich ganz viel von Kanadiern und Neuseeländern gelernt, ohne daß ich mich bedanken konnte.