Frage an die Experten unter euch es geht um bytes

für ein Projekt habe ich ein paar bytes gemacht, um eine grahische Darstellung auf einem LCD Display zu machen.

das sieht so aus bisher und funktioniert auch.

// make some custom characters for the graphic display
byte eight[8] = {
  0b01110,
  0b11111,
  0b01110,
  0b11111,
  0b01110,
  0b11111,
  0b01110,
  0b11111
};

byte seven[8] = {
  0b00000,
  0b11111,
  0b01110,
  0b11111,
  0b01110,
  0b11111,
  0b01110,
  0b11111
};

byte six[8] = {
  0b00000,
  0b00000,
  0b01110,
  0b11111,
  0b01110,
  0b11111,
  0b01110,
  0b11111
};

byte five[8] = {
  0b00000,
  0b00000,
  0b00000,
  0b11111,
  0b01110,
  0b11111,
  0b01110,
  0b11111
};

byte four[8] = {
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b01110,
  0b11111,
  0b01110,
  0b11111
};

byte three[8] = {
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b11111,
  0b01110,
  0b11111
};

byte two[8] = {
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b01110,
  0b11111
};

byte one[8] = {
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b11111
};
void setup() 
{
 
  pinMode (Ledpin, OUTPUT);
  pinMode (A1, INPUT);
  analogWrite (brightnessPWM,100); // brightness at startup
 
  lcd.begin(20, 4);
  Serial.begin(9600);             //necessary only for debug
  dht.begin();
  bmp.begin();
  for (int i=0;i<=22;){messwert[i]=0;i++;} // Fill the array with zeros
  
  
  lcd.createChar(0, one);      // create a new character    
 
  lcd.createChar(1, two);      // create a new character
 
  lcd.createChar(2, three);    // create a new character
  
  lcd.createChar(3, four);     // create a new character    
  
  lcd.createChar(4, five);     // create a new character   
   
  lcd.createChar(5, six);      // create a new character 

  lcd.createChar(6, seven);    // create a new character

  lcd.createChar(7, eight);    // create a new character

Jetzt habe ich 8 characters, soweit so gut.
Ich hätte gern ein paar mehr, aber das gibt der Speicher des Diplays nicht her.

Wenn man sich das anschaut, dann sind die characters sich ja sehr ähnlich, Balken steigen einfach von unten nach oben. Es ist fachlich falsch, aber ich nenne hier mal die 5 Zeichen einer zeile nibbel.

Jetzt kam mir folgende Idee:

Gibt es eine Möglichkeit, nur den character 8, also alles voller Balken( nibbel), zu kreiren, und danach dem Arduino zu sagen, das er von diesem character jetzt nur den untersten nibbel, und die zwei untersten, oder drei oder oder oder an “diese” Stelle darstellen soll?

Kann man den character zum Zwecke der Anzeige in Teile zerlegen?

Der Sinn soll sein, mir Platz für ein paar weitere benötigte characters zu geben.

Hi

Die Zeichen werden IM DISPLAY definiert - für den LCD-Kontroller sind Das 'ganz normale Zeichen' - nur ist der Punkte-Mix nicht im ROM, sondern im RAM angesiedelt.

Man könnte versuchen, die Zeichen 'on the fly' zu erstellen - wenn Du mit 8 eigenen zeichen pro Darstellung auskommst, sollte Das gehen.
Denke nämlich, daß beim Verändern eines bereits definierten Zeichen das schon Gedruckte Sich ebenfalls ändert (der LCD-Kontroller refresh't die Anzeige ja laufend, denke, den Pixel-Mix liest Der ebenfalls jedes Mal aus dem RAM/ROM, also denke nicht, daß die eigentliche Anzeige als eigene Pixel-Information vorliegt - sollte sich in den Tiefen des HD44780 wohl finden lassen, ein Try&Error sollte hier aber schneller gehen.

MfG

PS: Das 'D' in LCD heißt bereits Display, somit ist ein LCD Display ein 'Liquid Cristal Display Display'
Anders bei dem LED-Display, Da steht das D für Diode.

Du hast folgendes Problem:

Wenn du beispielsweise dein specialCharacter 0 änderst weil du statt zwei Pixelreihen nun drei Pixelreihen darstellen willst, dann hat das eine Auswirkung auf alle schon dargestellten specialCharacter 0.

D.h. du kannst nicht so einfach eins von deinen 8 special Characters öfters belegen. Es hat Auswirkung auf die bereits dargestellten.

Das habe ich befürchtet.

Mir fehlen zwei Speicherplätze, ein Pfeil senkrecht nach oben zeigend und einer senkrecht nach unten zeigend.
Hm, schade, habe jetzt einfach dafür auf die Zeichen < und > zurückgegriffen. Die Pfeile würden mir besser gefallen, aber die geben die LC-Displays nicht her.

Jetzt habe ich 8 characters

Diese freien 8 Zeichen sind eher für Spezial-Sonderzeichen gedacht. Normale ASCII - Zeichen (wie deine one … eight) und manchmal sogar deutsche Umlaute haben die LCDs schon fest einprogrammiert (Umlaute nur oft an “falschen” Plätzen)

Schau dir lieber die bereits definierten Zeichen an, ob die nicht brauchbar sind. Bei 5x7 kann man nicht zu wählerisch sein. Einen Unterschied zwischen β und ß (“esszett”= deutsches scharfes s und kleines griechisches beta) erkenne ich noch nicht mal beim Tippen auf dem Laptop.

habe jetzt einfach dafür auf die Zeichen < und > zurückgegriffen.

Pfeil links / rechts gibts in der Regel, zumindest im verlinkten Zeichensatz.

Normale ASCII - Zeichen (wie deine one .. eight)

nicht ganz. Sein "One" ist in der untersten Linie. Der Underscore ist eins drüber. Habs grad neben mir ausprobiert.

P.S.: wenn du auf die Sonderzeichen einfach zugreifen willst und du ein I2C LCD verwendest, wäre vieleicht meine gepachte Library eine Alternative: Arduino: Deutsche Umlaute äöü am LCD (Liquid Crystal I2C)

nicht ganz

Ok, richtig. Aber das fällt unter mein "nicht so zimperlich bei 5x7".
Bzw. soll wohl nur ein theoretisches Beispiel sein für den Bedarf an mehr freien Sonderzeichen.
Bei einem Display mit insgesamt z.B. 162 = 32 Zeichen aus 1216+8 = 200 verschiedenen auswählen zu können, sollte eigentlich reichen. Für höhere Ansprüche gibt es andere Displays.

Danke euch für die Hinweise.

Das Diplay mit I2C anzusprechen habe ich noch nicht probiert.
Ich weiß nicht, wie man es da anspricht. Also wie bekomme ich den Cursr an die richte Stelle und wie schreibe ich dort ein Zeichen. Oder ein Wort oder Wert.

Das was ich darüber bisher lesen konnte, hat mich mehr verwirrt, denn es mir geholfen hat.
also habe ich alle Platinen so gestrickt, das ich die oberen 4 Bit anspreche und das paralele ansteuern nutze.
Da ist das Beschreiben so schön einfach. Alles fein in Klartext.

Außerdem habe ich schon 2 Module auf dem I2C ( BMP180 und RTC3132 ), nicht das es da nachher zur Überlast kommt.

Dafür ist es mir endlich heute gelungen für das RTC-Modul eine Routine so zu verändern, das das Modul nunmehr selbstständig zum jeweils passenden Zeitpunkt auf Sommer, bzw Winterzeit umstellt.
So eine eigentlich simple Sache bringt mich momentan noch an meine programmiertechnischen Grenzen. Da muss ich mein ach so schönes Display jetzt nicht noch mit I2C -Experimenten wieder dunkel machen.

Die Wetterstation kann nun schon recht viel für meine Verhältnisse.

auf 20x4 gibt es dort:

  1. Zeile Datum, Uhrzeit ( Sommer Winter automatisch )
  2. Zeile Temperatur und Wochentag
  3. Zeile Luftdruck Trend der letzten 3 Std. in Form von <, > oder =, sowie die Rel. Luftfeuchte
  4. Zeile die Characters, alle 6 Stunden einer, also 4 am Tag, da sehe ich den Druckverlauf der letzen 5 Tage

Und die Helligkeit per LDR über PWM gesteuert, mit Untergrenze, amit es nachts nicht ganz dunkel wird.

Erster Kontakt mit Arduinos ist 2 Monate her, und ja, ich hab dabei auch kräftig abgeschrieben und Libraries verwendet, die das Leben einfacher machen.

Bin also froh, dass die ganze Mimik überhaupt läuft.

also das sind jetzt zwei verschiedene Baustelllen

skyfox60:
Ich weiß nicht, wie man es da anspricht. Also wie bekomme ich den Cursr an die richte Stelle und wie schreibe ich dort ein Zeichen. Oder ein Wort oder Wert.

Das hängst an den LCD Libraries wie es unterstützt wird.
Manchmal geht das mit lcd.setCursor(zeichen, zeile)
Schau dir dazu die mitgelieferten Beispiele an.

Wegen I2C, nö "einfach auf I2C anschließen" ist natürlich nicht. Da braucht es schon ein entsprechendes Backpack dazu.

LCD 2004 + Separaten I2C "Adapter"

Aber so wie ich die Situation nun einschätze, mach dir nicht zu viele gleichzeitigen Baustellen auf.