[gelöst] 3 x ST7920 an einem Arduino - Darstellungsprobleme

Hi Experten !

Für eine Temp. Messung bilde ich mir als Anzeige 3 St. ST7920 (128x64) Displays ein. Große weit ablesbare Ziffern ist der Wunsch.
So weit ist alles ok und klappt mit einer Einschränkung.

Sobald ich an irgend einem der Displays eine Zeile/Pixel über 55 (also relativ weit unten) anspreche
werden auf den anderen Displays diese ebenfalls angezeigt - quasi gespiegelt ohne dass ich das will.

Bleibe ich bis 55 klappt alles wunderbar.
Uno oder Mega ist kein Unterschied (beim Mega wird dann mit DHT22 langsam der Speicher knapp)
Auch mit der U82g lib - also der aktuellen klappt es nicht.
An den Fonts liegt es auch nicht

Plan B:
Display nur bis Zeile 55 nutzen (dort wollte ich min und max Werte anzeigen)

Plan C:
Jedes Display bekommt seinen eigenen Nano und ein übergeordneter Uno sammelt die Messwerte ein und steuert die Hintergrundbeleuchtung der Displays

Plan D:
andere lib die aber SW SPI kann - noch keine gefunden

Mich wundert nur dass bis Zeile 55 alles passt und ab Zeile 56-63 Mist dargestellt wird.
Hat da vielleicht noch wer eine Idee ?

#include <Arduino.h>  
#include "U8glib.h"
U8GLIB_ST7920_128X64_1X disp1(6, 5, 4, U8G_PIN_NONE);      // Display Beet West 6=E, 5=R/W, 4=RS
U8GLIB_ST7920_128X64_1X disp2(9, 8, 7, U8G_PIN_NONE);      // Display Stiege 9=E, 8=R/W, 7=RS
U8GLIB_ST7920_128X64_1X disp3(12, 11, 10, U8G_PIN_NONE);	 // Display Beet Ost 12=E, 11=R/W, 10=RS

void setup(void) {
} // * * * * * Ende setup

void loop(void) {
  disp1.firstPage();
  do {
    draw();
  } while ( disp1.nextPage() );

  disp2.firstPage();
  do {
    draw();
  } while ( disp2.nextPage() );

  disp3.firstPage();
  do {
    draw();
  } while ( disp3.nextPage() );
} // *** Ende Loop ***

void draw(void) {
  // disp1 = Anzeige rechts
  disp1.setFont(u8g_font_helvR08);      //Beschriftung
  disp1.drawStr( 40, 42, "Beet West");  //Beschriftung
  disp1.drawFrame(20, 32, 86, 12);      //Beschriftung
  disp1.drawStr(77, 55, "max");         //Beschriftung
  disp1.drawStr(3, 55, "min");          //Beschriftung
  // disp2 = Anzeige mitte
  disp2.setFont(u8g_font_helvR08);
  disp2.drawStr(50, 42, "Stiege");
  disp2.drawFrame(20, 32, 86, 12);
  disp2.drawStr(77, 55, "max");
  disp2.drawStr(3, 55, "min");
  // disp3 = Anzeige links
  disp3.setFont(u8g_font_helvR08);
  disp3.drawStr(40, 42, "Beet Ost");
  disp3.drawFrame(20, 32, 86, 12);
  disp3.drawStr(77, 55, "max");
  disp3.drawStr(3, 55, "min");
} // *** Ende draw ***

LG
Viktor

Hallo Viktor

Könntest Du es mal mit der U8g2 probieren?
Ausserdem wäre es hilfreich den Rest des Codes zu kennen.
Auch wichtig: Du brauchst drei "picture loops", da sich die u8g und u8g2 den Speicher für das display teilen.

Grüße,
Oliver

Danke Oliver !

Genau das war es - drei x Picture Loop.

#include <Arduino.h>
#include "U8glib.h"
U8GLIB_ST7920_128X64_1X disp1(6, 5, 4, U8G_PIN_NONE);      // Display Beet West 6=E, 5=R/W, 4=RS
U8GLIB_ST7920_128X64_1X disp2(9, 8, 7, U8G_PIN_NONE);      // Display Stiege 9=E, 8=R/W, 7=RS
U8GLIB_ST7920_128X64_1X disp3(12, 11, 10, U8G_PIN_NONE);	 // Display Beet Ost 12=E, 11=R/W, 10=RS

void setup(void) {
} // * * * * * Ende setup

void loop(void) {
  disp1.firstPage();
  do {
    draw1();
  } while ( disp1.nextPage() );
  disp2.firstPage();
  do {
    draw2();
  } while ( disp2.nextPage() );
  disp3.firstPage();
  do {
    draw3();
  } while ( disp3.nextPage() );
} // *** Ende Loop ***

void draw1(void) {
  // disp1 = Anzeige rechts
  disp1.setFont(u8g_font_helvR08);      //Beschriftung
  disp1.drawStr( 40, 10, "Beet West");  //Beschriftung
  disp1.drawFrame(0, 0, 128, 12);      //Beschriftung
  disp1.drawStr(77, 64, "Danke");         //Beschriftung
  disp1.drawStr(3, 64, "Beste.");          //Beschriftung
}// *** Ende draw1 ***

void draw2(void) {
  // disp2 = Anzeige mitte
  disp2.setFont(u8g_font_helvR08);
  disp2.drawStr(50, 10, "Stiege");
  disp2.drawFrame(0, 0, 128, 12);
  disp2.drawStr(77, 64, "der");
  disp2.drawStr(3, 64, "ist");
}
void draw3(void) {
  // disp3 = Anzeige links
  disp3.setFont(u8g_font_helvR08);
  disp3.drawStr(40, 10, "Beet Ost");
  disp3.drawFrame(0, 0, 128, 12);
  disp3.drawStr(77, 64, "Kraus");
  disp3.drawStr(3, 64, "Oliver");
} // *** Ende draw3 ***

Dass ich einen prinzipiellen Fehler im Aufbau habe ist mir gar nicht klar gewesen. Solange ich nicht über die Zeile 55 gekommen bin hat ja alles geklappt.

Mit der U8g2 kämpfe ich noch. Das liegt aber nicht an der Lib sondern am Display. Eines der 3 flimmert und der Fehler wandert mit - eindeutig ein Displayfehler.

Schlampig wie ich bin sind das 3 Displays garantiert von drei verschiedenen Herstellern und unterschiedlich alt. Gut - ich erwarte bei den Stückpreisen nichts. Steckbrettaufbau tut das übrige dazu.

Danke für den Tipp.

LG
Viktor


Also Das muß man doch zeigen :wink:

Schön, daß Das klappt!

MfG

Sehr gut!

Eventuell könnetest Du noch GPIOs einsparen: Nur die E Leitung müsste unterschiedlich sein.

Und ja, das ST7920 ist recht kritisch. U8g2 ist vielleicht vom Timing doch zu knapp Aber auch der Aufbau ist beim ST7920 kritisch.

Oliver

Hallo Oliver !

4 Pins erfolgreich eingespart.
Danke für den Tipp.

LG
Viktor