Tutorial & Sample Project Module LCD Nokia 5110 / 3310 for Arduino JILID 1

Author : Ila MulyandiNo comments

Informasi Umum
Module LCD Nokia 5110 adalah salah satu jenis LCD yang bisa kita gunakan sebagai media display data output oleh Arduino.Kelebihan LCD jenis ini adalah Harga yang murah dan penggunaan PIN yang lumayan sedikit (Serial SPI).


Secara resmi module ini di produksi oleh produsen Adafruit dan Sparkfun Electronics
Berikut adalah Spesifikasi dari Module ini :

•Single chip LCD controller/driver
•48 row, 84 column outputs
•Display data RAM 48×84 bits
•On-chip:
– Generation of LCD supply voltage (external supplyalso possible)
– Generation of intermediate LCD bias voltages
– Oscillator requires no external components (externalclock also possible).
•ExternalRES (reset) input pin
•Serial interface maximum 4.0 Mbits/s
•CMOS compatible inputs
•Mux rate: 48
•Logic supply voltage range VDDto VSS: 2.7 to 3.3 V
•Display supply voltage range VLCDto VSS
– 6.0 to 8.5 V with LCD voltage internally generated(voltage generator enabled)
– 6.0 to 9.0 V with LCD voltage externally supplied(voltage generator switched-off).
•Low power consumption, suitable for battery operatedsystems
•Temperature compensation of VLCD
•Temperature range:−25 to +70°C.


Adafruit datasheets download disini.

Sparkfun datasheets download disini.


Dari data diatas kita dapat melihat bahwa LCD ini adalah jenis monochrom dengan jumlah pixel 84x48 dot dengan area writeable pixel 30x20mm.

LCD ini menggunakan VCC 2.7 sampai 3.3V untuk controllernya (saya sarankan menggunakan pin 3.3V untuk penggunaan dengan Arduino) dan untuk lampu backlightnya (BL) saya sarankan menggunakan VCC 5V (pin 5V) pada Arduino


Pin Interface
Secara umum baik yang produksi Adafruit (board biru) maupun punya Sparkfun (board merah) module ini mempunyai 8pin interface dengan urutan sebagai berikut :

-RST --> Reset
-CE / CS --> Chip Select
-DC --> Data / Command Select
-Din --> Data in
-Clk / Sck --> Clock
-Vcc --> + Power Supply 2.7-3.3V
-BL --> + Lampu Backlight 3.3-5V
-Gnd --> Common 0V untuk Controller dan Backlight

Urutan pin bisa saja berbeda pada breakoutboard module anda.


Library and Wiring to Arduino
Ada beberapa library yang bisa kita gunakan untuk control LCD ini dengan Arduino seperti Library Uglib namun kita akan menggunakan Standar Adafruit library untuk LCD ini,silahkan download librarynya pada link dibawah :

library LCD 5110 Adafruit download disini atau http://adafru.it/d7j

library pendukung Adafruit_GFX download disini atau http://adafru.it/cBB

Masukan kedua library diatas ke dalam folder libraries pada folder installer Arduino IDE di drive C.


standar wiring module lcd 5110 dengan Arduino (uno)
-RST --> D3
-CE / CS --> D4
-DC --> D5
-Din --> D6
-Clk / Sck --> D7
-Vcc --> pin 3.3V Arduino
-BL --> pin 5V Arduino
-Gnd --> pin GND Arduino

pada standar wiring diatas kita menggunakan pin D3,D4,D5,D6 dan D7 sebagai data interfacenya,namun apabila penggunaan tersebut tidak memungkinkan dalam sistem kita (pin tersebut dipakai oleh module lain) maka kita dapat memindahkanya ke pin lain (bahkan pin Analog in pun bisa kita gunakan) dan jangan lupa mengganti declare pin library pada
sketch codingnya.


contoh standar wiring :

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
//-----------------------------------------------------------------------
// Wiring lcd5110 dengan Arduino
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
//------------------------------------------------------------------------
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);


contoh penggantian wiring :

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
//-----------------------------------------------------------------------
// Wiring lcd5110 dengan Arduino
// pin 13 - Serial clock out (SCLK)
// pin 12 - Serial data out (DIN)
// pin 11 - Data/Command select (D/C)
// pin 10 - LCD chip select (CS)
// pin 9 - LCD reset (RST)
//------------------------------------------------------------------------
Adafruit_PCD8544 display = Adafruit_PCD8544(13, 12, 11, 10, 9);

contoh penggantian wiring dengan Analog Pin :

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
//-----------------------------------------------------------------------
// Wiring lcd5110 dengan Arduino
// pin A5 - Serial clock out (SCLK)
// pin A4 - Serial data out (DIN)
// pin A3 - Data/Command select (D/C)
// pin A2 - LCD chip select (CS)
// pin A1 - LCD reset (RST)
//------------------------------------------------------------------------
Adafruit_PCD8544 display = Adafruit_PCD8544(A5, A4, A3, A2, A1);


Example Library test

Lakukan wiring Arduino dengan LCD 5110 module dengan standar wiring :
standar wiring module lcd 5110 dengan Arduino (uno)

-RST --> D3
-CE / CS --> D4
-DC --> D5
-Din --> D6
-Clk / Sck --> D7
-Vcc --> pin 3.3V Arduino
-BL --> pin 5V Arduino
-Gnd --> pin GND Arduino

Setelah memasukan library yang dibutuhkan Silahkan buka File Example melalui Arduino IDE

klik File --> Example --> PCD8544 Nokia LCD Library --> pcdtest

atau copy paste text dibawah ini kedalam Arduino IDE New File dan upload ke Arduino Board Anda :




#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

// Hardware SPI (faster, but must use certain hardware pins):
// SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
// MOSI is LCD DIN - this is pin 11 on an Arduino Uno
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
// Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);
// Note with hardware SPI MISO and SS pins aren't used but will still be read
// and written to during SPI transfer.  Be careful sharing these pins!

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16

const byte belajarduino[] PROGMEM = {
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x1,0xC0,0x0,0x70,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0xC0,0x0,0x30,0x0,0xC0,0x0,0x0,0x0,0x0,
0x0,0x0,0xC0,0x0,0x30,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0xFE,0x1E,0x31,0xF1,0xC7,0xCF,0xE0,0x0,0x0,
0x0,0x0,0xF6,0x33,0x31,0x18,0xC4,0xC7,0x60,0x0,0x0,
0x0,0x0,0xE3,0x63,0x30,0x18,0xC0,0x66,0x0,0x0,0x0,
0x0,0x0,0xC3,0x7F,0x31,0xF8,0xC7,0xE6,0x0,0x0,0x0,
0x0,0x0,0xC3,0x60,0x33,0x98,0xCE,0x66,0x0,0x0,0x0,
0x0,0x0,0xE3,0x70,0x33,0x18,0xCC,0x66,0x0,0x0,0x0,
0x0,0x0,0xF6,0x31,0x33,0xB8,0xCC,0xE6,0x0,0x0,0x0,
0x0,0x0,0xFC,0x1F,0x79,0xEC,0xC7,0xFF,0x80,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0xC0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x2,0xC0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x3,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x1,0x80,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x1,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x1F,0x9C,0xE7,0x3F,0x87,0xC0,0x1F,0x1F,0x1F,0xDE,0x0,
0x33,0x8C,0x63,0x1C,0xCE,0x60,0x39,0x19,0x8E,0x73,0x0,
0x31,0x8C,0x63,0x18,0xCC,0x70,0x31,0x30,0xCC,0x63,0x0,
0x71,0x8C,0x63,0x18,0xCC,0x30,0x30,0x30,0xCC,0x63,0x0,
0x71,0x8C,0x63,0x18,0xCC,0x30,0x30,0x30,0xCC,0x63,0x0,
0x31,0x8C,0xE3,0x18,0xCC,0x70,0x30,0x30,0xCC,0x63,0x0,
0x33,0x8D,0xE3,0x18,0xCE,0x60,0x39,0x19,0x8C,0x63,0x0,
0x1F,0xCF,0xF7,0xBD,0xE7,0xC3,0x1F,0x1F,0x1E,0xF7,0x80,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
};
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(9600);

  display.begin();
  // init done

  // you can change the contrast around to adapt the display
  // for the best viewing!
  display.setContrast(50);

  display.display(); // show splashscreen
  delay(2000);
  display.clearDisplay();   // clears the screen and buffer

  display.drawBitmap(0,0, belajarduino, 88, 44, 1);
  display.display();
  delay (3000);
  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);
}

Posted On : Sunday, February 5, 2017Time : 3:15 PM
SHARE TO :
| | Template Created By : Rajendroid | CopyRigt By : ARDUINO | |