ESP8266 und Nokia 5110 LCD Tutorial





Troubleshooting

Ich hatte oft Probleme mit dem Nokia Display wenn die Speisung des ESP8266 über einen USB Port des Laptop erfolgte. Dann wurde oft gar nichts angezeigt auf dem Display. 
Dies konnte aber leicht behoben werden, indem ich den ESP8266 über den USB Port einer USB Power Bank mit Strom versorgte. Dann war die Anzeige immer stabil.

Arduino Beispielcode Nokia 5110 LCD mit NodeMCU


 /*  
  Scrolling text example code  
  Modified from: http://www.arduino.cc/playground/Code/PCD8544  
  Arduvario test BMP180  
 */  
 // Your sketch must #include this library, and the Wire library.  
 // (Wire is a standard library included with Arduino.):  
 #include <SFE_BMP180.h>  
 #include <Wire.h>  
 String temp;  
 // You will need to create an SFE_BMP180 object, here called "pressure":  
 SFE_BMP180 pressure;  
 #define ALTITUDE 440.0 // Altitude of SparkFun's HQ in Boulder, CO. in meters  
 // The pins to use on the arduino  
 #define PIN_SCE D8  
 #define PIN_RESET D1  
 #define PIN_DC D2  
 #define PIN_SDIN D7  
 #define PIN_SCLK D5  
 // COnfiguration for the LCD  
 #define LCD_C LOW  
 #define LCD_D HIGH  
 #define LCD_CMD 0  
 // Size of the LCD  
 #define LCD_X 84  
 #define LCD_Y 48  
 int scrollPosition = -10;  
 static const byte ASCII[][5] =  
 {  
  {0x00, 0x00, 0x00, 0x00, 0x00} // 20  
  , {0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !  
  , {0x00, 0x07, 0x00, 0x07, 0x00} // 22 "  
  , {0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #  
  , {0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $  
  , {0x23, 0x13, 0x08, 0x64, 0x62} // 25 %  
  , {0x36, 0x49, 0x55, 0x22, 0x50} // 26 &  
  , {0x00, 0x05, 0x03, 0x00, 0x00} // 27 ‘  
  , {0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (  
  , {0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )  
  , {0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *  
  , {0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +  
  , {0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,  
  , {0x08, 0x08, 0x08, 0x08, 0x08} // 2d –  
  , {0x00, 0x60, 0x60, 0x00, 0x00} // 2e .  
  , {0x20, 0x10, 0x08, 0x04, 0x02} // 2f /  
  , {0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0  
  , {0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1  
  , {0x42, 0x61, 0x51, 0x49, 0x46} // 32 2  
  , {0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3  
  , {0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4  
  , {0x27, 0x45, 0x45, 0x45, 0x39} // 35 5  
  , {0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6  
  , {0x01, 0x71, 0x09, 0x05, 0x03} // 37 7  
  , {0x36, 0x49, 0x49, 0x49, 0x36} // 38 8  
  , {0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9  
  , {0x00, 0x36, 0x36, 0x00, 0x00} // 3a :  
  , {0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;  
  , {0x08, 0x14, 0x22, 0x41, 0x00} // 3c <  
  , {0x14, 0x14, 0x14, 0x14, 0x14} // 3d =  
  , {0x00, 0x41, 0x22, 0x14, 0x08} // 3e >  
  , {0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?  
  , {0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @  
  , {0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A  
  , {0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B  
  , {0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C  
  , {0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D  
  , {0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E  
  , {0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F  
  , {0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G  
  , {0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H  
  , {0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I  
  , {0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J  
  , {0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K  
  , {0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L  
  , {0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M  
  , {0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N  
  , {0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O  
  , {0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P  
  , {0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q  
  , {0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R  
  , {0x46, 0x49, 0x49, 0x49, 0x31} // 53 S  
  , {0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T  
  , {0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U  
  , {0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V  
  , {0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W  
  , {0x63, 0x14, 0x08, 0x14, 0x63} // 58 X  
  , {0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y  
  , {0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z  
  , {0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [  
  , {0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥  
  , {0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]  
  , {0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^  
  , {0x40, 0x40, 0x40, 0x40, 0x40} // 5f _  
  , {0x00, 0x01, 0x02, 0x04, 0x00} // 60 `  
  , {0x20, 0x54, 0x54, 0x54, 0x78} // 61 a  
  , {0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b  
  , {0x38, 0x44, 0x44, 0x44, 0x20} // 63 c  
  , {0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d  
  , {0x38, 0x54, 0x54, 0x54, 0x18} // 65 e  
  , {0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f  
  , {0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g  
  , {0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h  
  , {0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i  
  , {0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j  
  , {0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k  
  , {0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l  
  , {0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m  
  , {0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n  
  , {0x38, 0x44, 0x44, 0x44, 0x38} // 6f o  
  , {0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p  
  , {0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q  
  , {0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r  
  , {0x48, 0x54, 0x54, 0x54, 0x20} // 73 s  
  , {0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t  
  , {0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u  
  , {0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v  
  , {0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w  
  , {0x44, 0x28, 0x10, 0x28, 0x44} // 78 x  
  , {0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y  
  , {0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z  
  , {0x00, 0x08, 0x36, 0x41, 0x00} // 7b {  
  , {0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |  
  , {0x00, 0x41, 0x36, 0x08, 0x00} // 7d }  
  , {0x10, 0x08, 0x08, 0x10, 0x08} // 7e ←  
  , {0x00, 0x06, 0x09, 0x09, 0x06} // 7f →  
 };  
 void LcdCharacter(char character)  
 {  
  LcdWrite(LCD_D, 0x00);  
  for (int index = 0; index < 5; index++)  
  {  
   LcdWrite(LCD_D, ASCII[character - 0x20][index]);  
  }  
  LcdWrite(LCD_D, 0x00);  
 }  
 void LcdClear(void)  
 {  
  for (int index = 0; index < LCD_X * LCD_Y / 8; index++)  
  {  
   LcdWrite(LCD_D, 0x00);  
  }  
 }  
 void LcdInitialise(void)  
 {  
  pinMode(PIN_SCE, OUTPUT);  
  pinMode(PIN_RESET, OUTPUT);  
  pinMode(PIN_DC, OUTPUT);  
  pinMode(PIN_SDIN, OUTPUT);  
  pinMode(PIN_SCLK, OUTPUT);  
  digitalWrite(PIN_RESET, LOW);  
  digitalWrite(PIN_RESET, HIGH);  
  LcdWrite(LCD_CMD, 0x21); // LCD Extended Commands.  
  LcdWrite(LCD_CMD, 0xBf); // Set LCD Vop (Contrast). //B1  
  LcdWrite(LCD_CMD, 0x04); // Set Temp coefficent. //0x04  
  LcdWrite(LCD_CMD, 0x14); // LCD bias mode 1:48. //0x13  
  LcdWrite(LCD_CMD, 0x0C); // LCD in normal mode. 0x0d for inverse  
  LcdWrite(LCD_C, 0x20);  
  LcdWrite(LCD_C, 0x0C);  
 }  
 void LcdString(char *characters)  
 {  
  while (*characters)  
  {  
   LcdCharacter(*characters++);  
  }  
 }  
 void LcdWrite(byte dc, byte data)  
 {  
  digitalWrite(PIN_DC, dc);  
  digitalWrite(PIN_SCE, LOW);  
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);  
  digitalWrite(PIN_SCE, HIGH);  
 }  
 /**  
  gotoXY routine to position cursor  
  x – range: 0 to 84  
  y – range: 0 to 5  
 */  
 void gotoXY(int x, int y)  
 {  
  LcdWrite( 0, 0x80 | x); // Column.  
  LcdWrite( 0, 0x40 | y); // Row.  
 }  
 void drawBox(void)  
 {  
  int j;  
  for (j = 0; j < 84; j++) // top  
  {  
   gotoXY(j, 0);  
   LcdWrite(1, 0x01);  
  }  
  for (j = 0; j < 84; j++) //Bottom  
  {  
   gotoXY(j, 5);  
   LcdWrite(1, 0x80);  
  }  
  for (j = 0; j < 6; j++) // Right  
  {  
   gotoXY(83, j);  
   LcdWrite(1, 0xff);  
  }  
  for (j = 0; j < 6; j++) // Left  
  {  
   gotoXY(0, j);  
   LcdWrite(1, 0xff);  
  }  
 }  
 void Scroll(String message)  
 {  
  for (int i = scrollPosition; i < scrollPosition + 11; i++)  
  {  
   if ((i >= message.length()) || (i < 0))  
   {  
    LcdCharacter(' ');  
   }  
   else  
   {  
    LcdCharacter(message.charAt(i));  
   }  
  }  
  scrollPosition++;  
  if ((scrollPosition >= message.length()) && (scrollPosition > 0))  
  {  
   scrollPosition = -10;  
  }  
 }  
 void setup(void)  
 {  
  Serial.begin(9600);  
  delay(100);  
  Serial.println("\n\r");  
  Serial.println("REBOOT");  
  Wire.begin(12, 2); //initializes the gpio for bmp180  
  LcdInitialise();  
  LcdClear();  
  drawBox();  
  gotoXY(4, 1);  
  LcdString("Varduino");  
  gotoXY(4, 2);  
  LcdString("Init...");  
  if (pressure.begin())  
   Serial.println("BMP180 init success");  
  else  
  {  
   // Oops, something went wrong, this is usually a connection problem,  
   // see the comments at the top of this sketch for the proper connections.  
   Serial.println("BMP180 init fail\n\n");  
   while (1); // Pause forever.  
  }  
 delay(2000);  
  LcdClear();  
  drawBox();  
  gotoXY(4, 1);  
  LcdString("Varduino");  
 }  
 void loop(void)  
 {  
  char status;  
  double T, P, p0, a;  
  Serial.println();  
  Serial.print("provided altitude: ");  
  Serial.print(ALTITUDE, 0);  
  Serial.print(" meters, ");  
  // Start a temperature measurement:  
  // If request is successful, the number of ms to wait is returned.  
  // If request is unsuccessful, 0 is returned.  
  status = pressure.startTemperature();  
  if (status != 0)  
  {  
   // Wait for the measurement to complete:  
   delay(status);  
   // Retrieve the completed temperature measurement:  
   // Note that the measurement is stored in the variable T.  
   // Function returns 1 if successful, 0 if failure.  
   status = pressure.getTemperature(T);  
   if (status != 0)  
   {  
    // Print out the measurement:  
    Serial.print("temperature: ");  
    Serial.print(T, 2);  
    Serial.print(" deg C, ");  
    // Serial.print((9.0/5.0)*T+32.0,2);  
    // Serial.println(" deg F");  
    status = pressure.startPressure(3);  
    if (status != 0)  
    {  
     // Wait for the measurement to complete:  
     delay(status);  
     // Retrieve the completed pressure measurement:  
     // Note that the measurement is stored in the variable P.  
     // Note also that the function requires the previous temperature measurement (T).  
     // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)  
     // Function returns 1 if successful, 0 if failure.  
     status = pressure.getPressure(P, T);  
     if (status != 0)  
     {  
      // Print out the measurement:  
      Serial.print("absolute pressure: ");  
      Serial.print(P, 2);  
      Serial.print(" mb, ");  
      // Serial.print(P*0.0295333727,2);  
      // Serial.println(" inHg");  
      // The pressure sensor returns abolute pressure, which varies with altitude.  
      // To remove the effects of altitude, use the sealevel function and your current altitude.  
      // This number is commonly used in weather reports.  
      // Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.  
      // Result: p0 = sea-level compensated pressure in mb  
 p0 = 1012;  
 /*  
      p0 = pressure.sealevel(P, ALTITUDE); // we're at 1655 meters (Boulder, CO)  
      Serial.print("relative (sea-level) pressure: ");  
      Serial.print(p0, 2);  
      Serial.print(" mb, ");  
      // Serial.print(p0*0.0295333727,2);  
      // Serial.println(" inHg");  
 */  
      // On the other hand, if you want to determine your altitude from the pressure reading,  
      // use the altitude function along with a baseline pressure (sea-level or other).  
      // Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.  
      // Result: a = altitude in m.  
      a = pressure.altitude(P, p0);  
      Serial.print("computed altitude: ");  
      Serial.print(a, 3);  
      Serial.print(" meters, ");  
      // Serial.print(a*3.28084,0);  
      // Serial.println(" feet");  
      gotoXY(1, 2);  
      LcdString("T:");  
      gotoXY(8, 2);  
      temp = String(T, 4);  
      char tempBuf[5];  
      temp.toCharArray(tempBuf, 5);  
      LcdString(tempBuf);  
      gotoXY(1, 3);  
      LcdString("P:");  
      gotoXY(8, 3);  
      char pressBuf[7];  
      temp = String(P, 2);  
      temp.toCharArray(pressBuf, 6);  
      LcdString(pressBuf);  
      gotoXY(1, 4);  
      LcdString("H:");  
      gotoXY(8, 4);  
      char heightBuf[7];  
      temp = String(a, 1);  
      temp.toCharArray(heightBuf, 6);  
      LcdString(heightBuf);  
     }  
     else Serial.println("error retrieving pressure measurement\n");  
    }  
    else Serial.println("error starting pressure measurement\n");  
   }  
   else Serial.println("error retrieving temperature measurement\n");  
  }  
  else Serial.println("error starting temperature measurement\n");  
  delay(500);  
 }  

Kommentare