LCD 16×2 para utilização no raspberry

Fala galera.

Hoje vou demonstrar como utilizar o LCD de 16 linhas por 2 colunas, vendidos por padrão em lojas como o filipeflop, labdegaragem e etc.
Esse que estarei testando especificamente comprei em um KIT do laboratório de garagem, que alias é um kit que eu super reocomendo.

O LCD em questão é o que está abaixo.

DSC_0171

A placa é composta por 16 pinos e cada um representa algo. Compilei uma imagem retirada do google que nos mostrará exatamente como deve ser feita a ligação na placa com as explicações (em ingles , porém simples) e ao lado a minha placa como foi conectadad na protoboard

snapshot4 DSC_0170

Aconselho vocês a iniciarem do 16 pra trás, até o 1. Fazendo isso nas 2 primeiras pinagens ele já irá acender!
Lembre-se de colocar o resistor como mostra abaixo OU no negativo como fazemos sempre.
Utilizaremos a mesma pinagem contada como se fosse o nosso raspberry PI normal contando os numeros no Pi Pin

Raspberry-Pi-GPIO-Layout-Revision-2

 

Modifiquei bastante o script padrão de LCD que pode ser achado na internet para se transformar em uma CLASSE para ser utilizada mais facilmente por nós:

#!/usr/bin/python

import RPi.GPIO as GPIO
import time
class raspibrLCD: 
  def __init__(self):
    # Define GPIO to LCD mapping
    self.LCD_RS = 7
    self.LCD_E  = 8
    self.LCD_D4 = 25
    self.LCD_D5 = 24
    self.LCD_D6 = 23
    self.LCD_D7 = 18
     
    # Define some device constants
    self.LCD_WIDTH = 16    # Maximum characters per line
    self.LCD_CHR = True
    self.LCD_CMD = False
     
    self.LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
    self.LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
     
    # Timing constants
    self.E_PULSE = 0.00005
    self.E_DELAY = 0.00005

    GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
    GPIO.setwarnings(False)
    GPIO.cleanup();
    GPIO.setup(self.LCD_E, GPIO.OUT)  # E
    GPIO.setup(self.LCD_RS, GPIO.OUT) # RS
    GPIO.setup(self.LCD_D4, GPIO.OUT) # DB4
    GPIO.setup(self.LCD_D5, GPIO.OUT) # DB5
    GPIO.setup(self.LCD_D6, GPIO.OUT) # DB6
    GPIO.setup(self.LCD_D7, GPIO.OUT) # DB7
   
  def inicializar(self):
    # Initialise display
    self.lcd_byte(0x33,self.LCD_CMD)
    self.lcd_byte(0x32,self.LCD_CMD)
    self.lcd_byte(0x28,self.LCD_CMD)
    self.lcd_byte(0x0C,self.LCD_CMD)
    self.lcd_byte(0x06,self.LCD_CMD)
    self.lcd_byte(0x01,self.LCD_CMD) 
  
  def irLinha(self,linha):
    if(linha == 1):
      LCD_LINE = 0x80 # LCD RAM address for the 1st line
      self.lcd_byte(LCD_LINE,False);
    else:		
      LCD_LINE = 0xC0 # LCD RAM address for the 2nd line
      self.lcd_byte(LCD_LINE,False);
       
  def escrever(self,message,line=1):
    # Send string to display
    self.irLinha(line);
    message = message.ljust(self.LCD_WIDTH," ") 
   
    for i in range(self.LCD_WIDTH):
      self.lcd_byte(ord(message[i]),self.LCD_CHR)
   
  def lcd_byte(self,bits, mode):
    # Send byte to data pins
    # bits = data
    # mode = True  for character
    #        False for command
   
    GPIO.output(self.LCD_RS, mode) # RS
   
    # High bits
    GPIO.output(self.LCD_D4, False)
    GPIO.output(self.LCD_D5, False)
    GPIO.output(self.LCD_D6, False)
    GPIO.output(self.LCD_D7, False)
    if bits&0x10==0x10:
      GPIO.output(self.LCD_D4, True)
    if bits&0x20==0x20:
      GPIO.output(self.LCD_D5, True)
    if bits&0x40==0x40:
      GPIO.output(self.LCD_D6, True)
    if bits&0x80==0x80:
      GPIO.output(self.LCD_D7, True)
   
    # Toggle 'Enable' pin
    time.sleep(self.E_DELAY)
    GPIO.output(self.LCD_E, True)
    time.sleep(self.E_PULSE)
    GPIO.output(self.LCD_E, False)
    time.sleep(self.E_DELAY)     
   
    # Low bits
    GPIO.output(self.LCD_D4, False)
    GPIO.output(self.LCD_D5, False)
    GPIO.output(self.LCD_D6, False)
    GPIO.output(self.LCD_D7, False)
    if bits&0x01==0x01:
      GPIO.output(self.LCD_D4, True)
    if bits&0x02==0x02:
      GPIO.output(self.LCD_D5, True)
    if bits&0x04==0x04:
      GPIO.output(self.LCD_D6, True)
    if bits&0x08==0x08:
      GPIO.output(self.LCD_D7, True)
   
    # Toggle 'Enable' pin
    time.sleep(self.E_DELAY)
    GPIO.output(self.LCD_E, True)
    time.sleep(self.E_PULSE)
    GPIO.output(self.LCD_E, False)
    time.sleep(self.E_DELAY)

Aqui podemos ver que existem 2 métodos  bases importantes

  1. incializar
  2. escrever

A inicializar iremos limpar tudo de lixo ou escrito no LCD para ficar pronto para ser preenchido

A escrever contém 2 parâmetros, onde o primeiro é o texto em questão de ate 16 letras e o segundo que mostra em qual linha quer q seja escrita a palavra. ou seja, ao importar a classe e instanciar,  você inicializa a classe e ja pode escrever diretamente nas 2 linhas, como no script abaixo:

#!/usr/bin/python
import os
import time
os.chdir('/opt/LCD');
from lcd import raspibrLCD;
raspi = raspibrLCD();
raspi.inicializar();
raspi.escrever('Raspibr.com.br',1);
time.sleep(2);
raspi.irLinha(2);
raspi.escrever('Ajudem',2);
time.sleep(2);
raspi.escrever('Comentem',2);
time.sleep(2);
raspi.escrever('Obrigado!!!!',2);
time.sleep(2);
raspi.inicializar();

Aqui, estamos importando a nossa classe para o nossa aplicação de teste com o from  …… import

após isso, iremos instanciar o objeto e utilizar o inicializar e o escrever de acordo com o que necessitará. Lembre-se que se utilizar a escrita na linha 1 apagar  todo seu conteúdo  assim como se for escrever na linha 2.

O comando ficará assim no seu LCD:

Espero que tenham gostado e até a próxima!