ESP8266 nodeMCU - NOKIA LCD 5110 zeigt nichts an

Hallo,

ich habe an einem ESP8266 nodeMCU V3 Board ein Nokia 5110 angeschlossen und ein Testprogramm
geflasht. Das LCD zeigt aber rein gar nichts an.

Ich habe dann doppelt und dreifach die Verbindungsleitungen durchgepiepst. Das is IO.
Dann habe ich im Testcode den Kontrast auf 0, 20, 50, 80 , 100 gesetzt. nix.

Dann habe ich mein 2-Kanal Speicheroszi an die Clock-Leitung und die Data-In-Leitung gehängt
und mit Singleshot aufgenommen was sich da auf den Leitungen tut.
Ich bin kein SPI-Experte aber was ich da gesehen habe erscheint mir plausibel.
Clockleitung geht raufrunter, Data-In-Leitung geht auch rauf runter.

Datenleitung geht ca 0,5-Zeiteinheiten vor/nach Clockleitung auf HIGH bzw. LOW

Ich habe es mit einem Demo-Code probiert der die Hardware HSPI PINs benutzt.

Dann habe ich es mit einem Democode der eine Software-SPI benutzt probiert.
Clockfrequenz 1,11 Megahertz!! (900 Nano-Sekunden) Clock-High ca. 300 Nano-Sekunden.

Nix auf dem Display zu sehen.

Ist diese Clockfrequenz zu hoch, das der Displaycontroller nicht mitkommt?

Was würdet ihr jetzt als nächstes testen um herauszufinden woran es liegt?

viele Grüße

Stefan

Was würdet ihr jetzt als nächstes testen um herauszufinden woran es liegt?

Den Schaltplan posten, nicht irgendeinen im Netz sondern so wie du es angeschlossen hast
Ein Echtbild posten auf dem wir jede Verbindung eindeutig sehen
Den Sketch posten

Damit eventuelle Helfer sich das anschauen können. Eins kann ich dir sagen, ein NodeMcu kann mit dem Nokia Display prächtig umgehen!

Hier der Sketch

/**************************************************************************************
 
 
#include <SPI.h>               // include SPI library
#include <Adafruit_GFX.h>      // include adafruit graphics library
#include <Adafruit_PCD8544.h>  // include adafruit PCD8544 (Nokia 5110) library
 
//   Nokia 5110 LCD module connections       (CLK, DIN, D/C, CS, RST)
   Adafruit_PCD8544 display = Adafruit_PCD8544(2,   0,   4,    5, 16);
//Adafruit_PCD8544 display = Adafruit_PCD8544(D4,   D3,  D2, D1, D0);
 
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
 
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
 
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };
 
void setup()   {
  Serial.begin(115200);
 
  display.begin();
  // init done
 
  // you can change the contrast around to adapt the display
  // for the best viewing!
  display.setContrast(80);
 
  display.display(); // show splashscreen
  delay(2000);
  display.clearDisplay();   // clears the screen and buffer
 
  // draw a single pixel
  display.drawPixel(10, 10, BLACK);
  display.display();
  delay(2000);
  display.clearDisplay();
 
  // draw many lines
  testdrawline();
  display.display();
  delay(2000);
  display.clearDisplay();
 
  // draw rectangles
  testdrawrect();
  display.display();
  delay(2000);
  display.clearDisplay();
 
  // draw multiple rectangles
  testfillrect();
  display.display();
  delay(2000);
  display.clearDisplay();
 
  // draw mulitple circles
  testdrawcircle();
  display.display();
  delay(2000);
  display.clearDisplay();
 
  // draw a circle, 10 pixel radius
  display.fillCircle(display.width()/2, display.height()/2, 10, BLACK);
  display.display();
  delay(2000);
  display.clearDisplay();
 
  testdrawroundrect();
  delay(2000);
  display.clearDisplay();
 
  testfillroundrect();
  delay(2000);
  display.clearDisplay();
 
  testdrawtriangle();
  delay(2000);
  display.clearDisplay();
   
  testfilltriangle();
  delay(2000);
  display.clearDisplay();
 
  // draw the first ~12 characters in the font
  testdrawchar();
  display.display();
  delay(2000);
  display.clearDisplay();
 
  // text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.setCursor(0,0);
  display.println("Hello, world!");
  display.setTextColor(WHITE, BLACK); // 'inverted' text
  display.println(3.141592);
  display.setTextSize(2);
  display.setTextColor(BLACK);
  display.print("0x"); display.println(0xDEADBEEF, HEX);
  display.display();
  delay(2000);
 
  // rotation example
  display.clearDisplay();
  display.setRotation(1);  // rotate 90 degrees counter clockwise, can also use values of 2 and 3 to go further.
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.setCursor(0,0);
  display.println("Rotation");
  display.setTextSize(2);
  display.println("Example!");
  display.display();
  delay(2000);
 
  // revert back to no rotation
  display.setRotation(0);
 
  // miniature bitmap display
  display.clearDisplay();
  display.drawBitmap(30, 16,  logo16_glcd_bmp, 16, 16, 1);
  display.display();
 
  // invert the display
  display.invertDisplay(true);
  delay(1000); 
  display.invertDisplay(false);
  delay(1000); 
 
  // draw a bitmap icon and 'animate' movement
  testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_WIDTH, LOGO16_GLCD_HEIGHT);
}
 
 
void loop() {
  
}
 
void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  uint8_t icons[NUMFLAKES][3];
  randomSeed(666);     // whatever seed
 
  // initialize
  for (uint8_t f=0; f< NUMFLAKES; f++) {
    icons[f][XPOS] = random(display.width());
    icons[f][YPOS] = 0;
    icons[f][DELTAY] = random(5) + 1;
    
    Serial.print("x: ");
    Serial.print(icons[f][XPOS], DEC);
    Serial.print(" y: ");
    Serial.print(icons[f][YPOS], DEC);
    Serial.print(" dy: ");
    Serial.println(icons[f][DELTAY], DEC);
  }
 
  while (1) {
    // draw each icon
    for (uint8_t f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK);
    }
    display.display();
    delay(200);
    
    // then erase it + move it
    for (uint8_t f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS],  logo16_glcd_bmp, w, h, WHITE);
      // move it
      icons[f][YPOS] += icons[f][DELTAY];
      // if its gone, reinit
      if (icons[f][YPOS] > display.height()) {
  icons[f][XPOS] = random(display.width());
  icons[f][YPOS] = 0;
  icons[f][DELTAY] = random(5) + 1;
      }
    }
   }
}
 
 
void testdrawchar(void) {
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.setCursor(0,0);
 
  for (uint8_t i=0; i < 168; i++) {
    if (i == '\n') continue;
    display.write(i);
    //if ((i > 0) && (i % 14 == 0))
      //display.println();
  }    
  display.display();
}
 
void testdrawcircle(void) {
  for (int16_t i=0; i<display.height(); i+=2) {
    display.drawCircle(display.width()/2, display.height()/2, i, BLACK);
    display.display();
  }
}
 
void testfillrect(void) {
  uint8_t color = 1;
  for (int16_t i=0; i<display.height()/2; i+=3) {
    // alternate colors
    display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
    display.display();
    color++;
  }
}
 
void testdrawtriangle(void) {
  for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
    display.drawTriangle(display.width()/2, display.height()/2-i,
                     display.width()/2-i, display.height()/2+i,
                     display.width()/2+i, display.height()/2+i, BLACK);
    display.display();
  }
}
 
void testfilltriangle(void) {
  uint8_t color = BLACK;
  for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
    display.fillTriangle(display.width()/2, display.height()/2-i,
                     display.width()/2-i, display.height()/2+i,
                     display.width()/2+i, display.height()/2+i, color);
    if (color == WHITE) color = BLACK;
    else color = WHITE;
    display.display();
  }
}
 
void testdrawroundrect(void) {
  for (int16_t i=0; i<display.height()/2-2; i+=2) {
    display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, BLACK);
    display.display();
  }
}
 
void testfillroundrect(void) {
  uint8_t color = BLACK;
  for (int16_t i=0; i<display.height()/2-2; i+=2) {
    display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);
    if (color == WHITE) color = BLACK;
    else color = WHITE;
    display.display();
  }
}
   
void testdrawrect(void) {
  for (int16_t i=0; i<display.height()/2; i+=2) {
    display.drawRect(i, i, display.width()-2*i, display.height()-2*i, BLACK);
    display.display();
  }
}
 
void testdrawline() {  
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(0, 0, i, display.height()-1, BLACK);
    display.display();
  }
  for (int16_t i=0; i<display.height(); i+=4) {
    display.drawLine(0, 0, display.width()-1, i, BLACK);
    display.display();
  }
  delay(250);
  
  display.clearDisplay();
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(0, display.height()-1, i, 0, BLACK);
    display.display();
  }
  for (int8_t i=display.height()-1; i>=0; i-=4) {
    display.drawLine(0, display.height()-1, display.width()-1, i, BLACK);
    display.display();
  }
  delay(250);
  
  display.clearDisplay();
  for (int16_t i=display.width()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, i, 0, BLACK);
    display.display();
  }
  for (int16_t i=display.height()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, 0, i, BLACK);
    display.display();
  }
  delay(250);
 
  display.clearDisplay();
  for (int16_t i=0; i<display.height(); i+=4) {
    display.drawLine(display.width()-1, 0, 0, i, BLACK);
    display.display();
  }
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(display.width()-1, 0, i, display.height()-1, BLACK); 
    display.display();
  }
  delay(250);
}

StefanL38:
Hier der Sketch

/**************************************************************************************

...

Ähm ... Dass die Zeichenfolge

/*

den Anfang eines Kommentars kennzeichnet ist Dir bekannt ...?

Wenn ich Deinen Code per copy&paste in die IDE einfüge, wird der gesamte Sketch als Kommentar angezeigt. Das kann ja wohl kaum Deine Absicht sein.

Gruß

Gregor

Auf deinem Echtbild erkennt man kaum wo da welcher Pin hinführt.
Ich habe jetzt in meinen Sketches nachgesehen, in den meisten verwende ich die Standard-Belegung so wie von Adafruit vorgeschlagen:

// If using an ESP8266, use this option. Comment out the other options.
// ESP8266 Hardware SPI (faster, but must use certain hardware pins):
// pin 4 - LCD reset (RST)
// pin 5 - LCD chip select (CS) bzw. CE
// pin 12 - Data/Command select (D/C) on an Huzzah ESP8266
// MOSI is LCD DIN - this is pin 13 on an Huzzah ESP8266
// SCK is LCD serial clock (SCLK) - this is pin 14 on Huzzah ESP8266


Adafruit_PCD8544 display = Adafruit_PCD8544(12, 5, 4);

bzw. am NodeMCU so mit leicht adaptiertem Konstruktor:

// pin 4 - LCD reset (RST)                D2
// pin 5 - LCD chip select (CS) bzw. CE   D1
// pin 12 - Data/Command select (D/C)     D6
// pin 14 - Serial clock out (SCLK)       D5
// pin 13 - Serial data out (DIN)         D7
Adafruit_PCD8544 nokia(12, 5, 4);                          // neuer Aufruf
const int BACKLIGHT_PIN = D8;                              // Backlight of Nokia Display

Contrast habe ich je nach Spannungsversorgung und Farbe der LEDs zw. 48 und 55

noiasca:
Auf deinem Echtbild erkennt man kaum wo da welcher Pin hinführt.
Ich habe jetzt in meinen Sketches nachgesehen, in den meisten verwende ich die Standard-Belegung so wie von Adafruit vorgeschlagen:

// If using an ESP8266, use this option. Comment out the other options.

// ESP8266 Hardware SPI (faster, but must use certain hardware pins):
// pin 4 - LCD reset (RST)
// pin 5 - LCD chip select (CS) bzw. CE
// pin 12 - Data/Command select (D/C) on an Huzzah ESP8266
// MOSI is LCD DIN - this is pin 13 on an Huzzah ESP8266
// SCK is LCD serial clock (SCLK) - this is pin 14 on Huzzah ESP8266
Adafruit_PCD8544 display = Adafruit_PCD8544(12, 5, 4);



bzw. am NodeMCU so mit leicht adaptiertem Konstruktor:



// pin 4 - LCD reset (RST) D2
// pin 5 - LCD chip select (CS) bzw. CE D1
// pin 12 - Data/Command select (D/C) D6
// pin 14 - Serial clock out (SCLK) D5
// pin 13 - Serial data out (DIN) D7
Adafruit_PCD8544 nokia(12, 5, 4); // neuer Aufruf
const int BACKLIGHT_PIN = D8; // Backlight of Nokia Display



Contrast habe ich je nach Spannungsversorgung und Farbe der LEDs zw. 48 und 55

Also im Anhang ein Bild in dem eingezeichnet ist welche Leitung mit was verbunden ist.
Zum Überprüfen der Leitungen habe ich die Messspitzen von gelöteter PIN-Spitze des LCDs zu gelöteter PIN-Spitze am nodeMCU-Board gemessen. Dadurch sind wirklich alle Kontaktstellen erfasst. Ich habe das ganze dann auch noch mit einenm WeMos D1-Mini getestet. Gleiches Ergebnis. Es tut sich absolut nix auf dem LCD.
Gibt das LCD nach Reset oder nach Power-On irgendeine Signalfolge aus die ich mit dem Oszi messen / anzeigen lassen könnte?
viele Grüße
Stefan

Diese Forum-Software macht mich irre. Hatte erst mal Probleme das Bild mit anzuhängen.
Aus der Tatsache dass ich auf dem IO-Pin an dem clock ausgegegeben werden soll ein regelmäßiges Rechtecksignal duty 50/50 und aus dem IO-Pin aus dem Data ausgegeben werden soll ein plausibles Signal bekomme schlussfolgere ich, dass die SPI-Ausgabe funktioneirt.

Kann man an dem LCD mit dem Oszi irgendwie eine bestimmte Signalfolge beobachten bei Power-ON oder bei Reset?
viele Grüße
Stefan

vermute nein.
Warum nimmst nicht die Pins so wie von Adafruit vorgeschlagen und wo ich dir sagen kann: funktioniert!?

Das was du hast...
D0 ist beschaltet am NodeMCU mit einer LED und hat einige Besonderheiten
D3 hat Bedeutung beim Start high run/low flash
D4 wakeup high, und beschaltet mit der internen LED

Da häng' ich doch nichts ran, wenns nicht irgendwo explizit so steht!
Man kann sich das ganze schon auch selber schwierig machen und sich dann wundern, dass es nicht aufs erste mal klappt.

Im Anhang mein Hintergrund-Bild wenn ich mit dem NodeMCU arbeite. Keine Schönheit aber für mich hilfreich bei der Suche nach "welchen Pin nehm' ich nun..."

Hallo noiasca,
vielen Dank fürs Antworten.
Dann muss ich noch zwei Sachen ergänzen:
Ich habe auch einen anderen Sketch der die Hardware-SPI benutzt probiert.
Der gepostete Sketch stammt von simple-circuit und da habe ich angenommen, dass der Ersteller des Beitrags sein Ding in der Realität getestet hat. Ich werde es noch einmal mit der anderen PIN-Belegung probieren.
Ich habe inzwischen nachgelesen, dass SPI bis 4 MHz funkioniert.

Kannst du bitte einen Demo-Sketch posten der bei dir an einem NodeMCU oder WeMos D1-Mini funktioniert?
Es gibt da ja unterschiedliche Libs.
viele Grüße
Stefan

es ist die Adafruit Lib aus dem Lib-Manager und der einfache pcdtest. Wirklich nichts besonderes.

Zugriff auf meine Sketche hab ich erst wieder abends.

Hallo zusammen,

ich habe jetzt noch zwei Displays gekauft und geliefert bekommen. Es lag am Display. Das erste Display zeigt einfach nichts an. Wenn ich Display Nr. 2 anschließe funktioniert alles. Bei Display Nr. 3 auch.
Ich habe diese NOKIA 5110-Displays bei Christians-Shop gekauft.
https://www.christians-shop.de/Nokia-5110-84x48-LCD-ShieldModuleBlue-Backlight-fuer-Arduino
tja der Spruch stimmt mal wieder: Man bekommt was man bezahlt. schlappe 3,28 Euro mit 50% Ausschuss.
Ein Display will gar nicht, ein Display hat guten Kontrast der Kontrast lässt sich per Software aber nicht verändern und nur bei einem von drei Displays lässt sich der Kontrast einstellen.

viele Grüße

Stefan

Hi

Naja - da der Shop die Dinger wohl nicht selber in der Hinterhof-Garage presst - wäre eine Stellungnahme vom Shop sowohl für Ihn, wie auch für Dich, zielführender, als hier einen Shop wegen einem Billig-Display in den Dreck zu ziehen.

Das billig oft mehrfach gekauft wird, ändert nun auch nicht viel daran, daß es immer noch der Käufer in der Hand hat, wofür der Verkäufer das Geld bekommt - leider ist der Spruch 'Was nix kostet, ist auch nix' leider nicht zielführend - man kann auch Schrott für teuer Geld bekommen - Da ist aber der Anreiz höher, das in den Sand gesetzte Geld wieder zu bekommen, deutlich größer.

MfG

StefanL38:
ich habe jetzt noch zwei Displays gekauft ...

Weil der Verkäufer nicht umtauschen wollte?!

Wie wär's, sich wegen des fehlerhaften Teils an den Händler zu wenden? Hast Du etwa erneut beim selben Händler gekauft?

Gruß

Gregor

Hallo Postmaster,

das was ich geschrieben habe ist die Beschreibung der drei Displays die ich gekauft habe.
Tatsachen beschreiben zähle ich jetzt nicht zu "in den Dreck ziehen".
Aber ich will mich nicht darüber streiten. Also meinetwegen Schwamm drüber. Ich habe herausgefunden
die Adafruit-library und die 8g-dingsbums-library funktioniert mit meinem nodeMCU-board
und ich verstehe welche PINs man nehmen kann.

An dem Display das gar nicht will habe ich mal das Display von der Platine abgenommen
um mir die Verbindung zwischen Display und Platine anzuschauen. Am Display sind die Kontakte auf der Glasfläche
dann gibt es eine Art gummiartiges Verbindungsstück. Die eine Stirnseite drückt auf die Kontakte auf der Glasfläche die andere Strinseite auf die Kontakte auf der Platine.
Das ist so eine Verbindungstechnik die mir bei anderen LCD-Display in Taschenrechnern und ähnliches auch schon mal begegnet ist. Tja da muss man wohl auf Qualität achten damit das zuverlässig funktioniert.

Von mir aus kann man jetzt den Thread in nach hinten fallen lassen in dem man nicht mehr darauf antwortet.
viele Grüße Stefan