ebsigma
Posts: 79
Joined: Sat Aug 11, 2012 10:33 am

duda codigo phyton LCd 16x2

Tue Apr 05, 2016 9:52 am

:?: :?: pues el caso es que tengo conectada la pantalla esta barata de dos lineas, y tengo el siguiente codigo:

Code: Select all

#import
import RPi.GPIO as GPIO
import time
 
# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
 
# Define some device constants
LCD_WIDTH = 16    # Maximum characters per line
LCD_CHR = True
LCD_CMD = False
 
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
 
# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
 
def main():
  # Main program block
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
  GPIO.setup(LCD_E, GPIO.OUT)  # E
  GPIO.setup(LCD_RS, GPIO.OUT) # RS
  GPIO.setup(LCD_D4, GPIO.OUT) # DB4
  GPIO.setup(LCD_D5, GPIO.OUT) # DB5
  GPIO.setup(LCD_D6, GPIO.OUT) # DB6
  GPIO.setup(LCD_D7, GPIO.OUT) # DB7
 
  # Initialise display
  lcd_init()
 
  while True:
 
    # Send some test
    lcd_string("Rasbperry Pi",LCD_LINE_1)
    lcd_string("16x2 LCD Test",LCD_LINE_2)
 
    time.sleep(3) # 3 second delay
 
    # Send some text
    lcd_string("1234567890123456",LCD_LINE_1)
    lcd_string("abcdefghijklmnop",LCD_LINE_2)
 
    time.sleep(3) # 3 second delay
 
    # Send some text
    lcd_string("RaspberryPi-spy",LCD_LINE_1)
    lcd_string(".co.uk",LCD_LINE_2)
 
    time.sleep(3)
 
    # Send some text
    lcd_string("Follow me on",LCD_LINE_1)
    lcd_string("Twitter @RPiSpy",LCD_LINE_2)
 
    time.sleep(3)
 
def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)
 
def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = data
  # mode = True  for character
  #        False for command
 
  GPIO.output(LCD_RS, mode) # RS
 
  # High bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
  if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
  if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
  if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)
 
  # Toggle 'Enable' pin
  lcd_toggle_enable()
 
  # Low bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x01==0x01:
    GPIO.output(LCD_D4, True)
  if bits&0x02==0x02:
    GPIO.output(LCD_D5, True)
  if bits&0x04==0x04:
    GPIO.output(LCD_D6, True)
  if bits&0x08==0x08:
    GPIO.output(LCD_D7, True)
 
  # Toggle 'Enable' pin
  lcd_toggle_enable()
 
def lcd_toggle_enable():
  # Toggle enable
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  time.sleep(E_DELAY)
 
def lcd_string(message,line):
  # Send string to display
 
  message = message.ljust(LCD_WIDTH," ")
 
  lcd_byte(line, LCD_CMD)
 
  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)
 
if __name__ == '__main__':
 
  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)
    lcd_string("Goodbye!",LCD_LINE_1)
    GPIO.cleanup()
lo que quiero es lo siguiente:

1º- que cuando acaben el primer ciclo de texto (todo lo que dice de la web y tal) que no se vuelva a repetir y salga la pantalla vacia.
2º- que al darle a un boton (ya lo pondre por gpio) que salgan numeros al azar, en unas posiciones fijas de la pantalla para ello tengo que saber como colocar distinto texto en distintas posiciones.
3º- como hacer que si escribo una frase larga el texto se vaya desplazando para que se lea entero.

thz

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Tue Apr 05, 2016 10:28 am

Hola,

1. Busca cómo funciona un while en Python como lo tienes hace un bucle infinito. Para limpiar la pantalla puedes usar el código que limpia la pantalla en lcd_init

3. Si miras en los comentarios veras que hay una función para lo de scroll http://www.raspberrypi-spy.co.uk/2012/0 ... ng-python/

Saludos

ebsigma
Posts: 79
Joined: Sat Aug 11, 2012 10:33 am

Re: duda codigo phyton LCd 16x2

Tue Apr 05, 2016 12:34 pm

si pongo este codigo o algo similar, al acabar, me pone goodbye, se limpia la pantalla y se cierra el programa...

Code: Select all

#!/usr/bin/python

contador = 0
while (contador < 5):
   print 'El contador es :', contador
   contador = contador + 1
   if (contador > 3):
       break

print "Fin del programa"
quiero que al acabar el texto se quede en blanco y que al pulsar un pulsador escriba algo concreto en la pantalla y se quede hasta que pulse otra vez que aparezca otro texto (amos un random de numeros)


a las malas lo que puedo hacer es que salga un texto durante 0.01sec y que cuando pulse un boton aparezca otro, pero me sale error ya que lo que quiero es que escriba un numero aleatorio, alado otro... y no lo consigo tp (por lo menos hice que aparezca un texto cuando pulso un boton

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Wed Apr 06, 2016 10:14 am


ebsigma
Posts: 79
Joined: Sat Aug 11, 2012 10:33 am

Re: duda codigo phyton LCd 16x2

Wed Apr 06, 2016 10:47 am

lo tengo asi

Code: Select all

import random
#boton
GPIO.setmode(GPIO.BCM)
GPIO.setup(03,GPIO.IN, GPIO.PUD_UP)
.
.
.
cuatro=[1,2,3,4]
.
.
.
  while True:
    numero = random.choice(cuatro)
    if GPIO.input(03)==False:
     lcd_string("(numero)",LCD_LINE_1)
     lcd_string("xxx",LCD_LINE_2)
     time.sleep (2)

pero en la pantalla muestra (numero) en vez de un numero, si lo pongo sin comillas me salta error y sale

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Wed Apr 06, 2016 12:34 pm

Pon el error para que la gente tenga más info.

Yo creo que estás intentando pasar un entero donde va a una cadena.

No sé cómo se parsea en Python pero prueba esto

str(numero)

ebsigma
Posts: 79
Joined: Sat Aug 11, 2012 10:33 am

Re: duda codigo phyton LCd 16x2

Wed Apr 06, 2016 1:06 pm

Code: Select all

Traceback (most recent call last):
  File "roll.py", line 174, in <module>
    main()
  File "roll.py", line 52, in main
    lcd_string((numero),LCD_LINE_1)
  File "roll.py", line 164, in lcd_string
    message = message.ljust(LCD_WIDTH," ")
AttributeError: 'int' object has no attribute 'ljust'
lo tengo asi

Code: Select all

def main():
  # Main program block
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
  GPIO.setup(LCD_E, GPIO.OUT)  # E
  GPIO.setup(LCD_RS, GPIO.OUT) # RS
  GPIO.setup(LCD_D4, GPIO.OUT) # DB4
  GPIO.setup(LCD_D5, GPIO.OUT) # DB5
  GPIO.setup(LCD_D6, GPIO.OUT) # DB6
  GPIO.setup(LCD_D7, GPIO.OUT) # DB7

  # Initialise display

  lcd_init()
  #cont = 0
  #while (cont < 1):
  while True:
    lcd_string("1d4 d6 d8 d10",LCD_LINE_1)
    lcd_string("d12 d20 d100 +-",LCD_LINE_2)
    time.sleep(0.01)

    numero = random.choice(cuatro)
    if GPIO.input(03)==False:
     lcd_string((numero),LCD_LINE_1)
     lcd_string("xxx",LCD_LINE_2)
     time.sleep (2)

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Wed Apr 06, 2016 2:46 pm

Ljust() funciona con strings no con integers.


Donde tienes (número) cámbialo por str(numero) y cuenta.

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Wed Apr 06, 2016 3:23 pm

Te debe de funcionar a mí me funciona tanto en python2.7 como en python3

https://repl.it/CCoD/0

ebsigma
Posts: 79
Joined: Sat Aug 11, 2012 10:33 am

Re: duda codigo phyton LCd 16x2

Wed Apr 06, 2016 7:42 pm

nono, si eso si lo tengo bien, lo unico que en vez de
print(str(numero))
quiero poner
lcd_string((numero),LCD_LINE_1)
para que salga en la pantalla lcd el numero en cuestion


solucionado con vuestra ayuda tal como comentasteis:
lcd_string(str(numero),LCD_LINE_1)

otra dudilla mas, como puedo poner varios numeros uno al lado de otro separado con X espacios,
cuatro = [1,2,3,4]
seis = [1,2,3,4,5,6]
ocho = [1,2,3,4,5,6,7,8]
ten = [1,2,3,4,5,6,7,8,9,10]
numero4 = random.choice(cuatro)
numero6 = random.choice(seis)
numero8 = random.choice(ocho)
numero10 = random.choice(ten)
lcd_string(str(numero4)str(numero6)str(numero8)str(numero10),LCD_LINE_1) asi no me fufa

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Wed Apr 06, 2016 10:46 pm

Puse print porque no estoy usando el display, pero ya lo entendiste.

Lo de X es porque varía o como es eso?

Para concatenar cadenas de texto con un espacio puedes hacer algo así:


lcd_string(numero1+" "+numero2+" "+numero3,LCD_LINE1)

Prueba así:

numero4 = str(random.choice(cuatro)

ebsigma
Posts: 79
Joined: Sat Aug 11, 2012 10:33 am

Re: duda codigo phyton LCd 16x2

Thu Apr 07, 2016 9:53 am

vale ya lo tengo casi tó,
me falta que aparezca una serie de palabras aleatorias de una lista, lo tengo así

masmenos = ["cara","cruz"]
if GPIO.input(03)==False:

masomenos = str(random.choice(masmenos)
lcd_string(numero12+" "+numero20+" "+numero100+" "+masomenos,LCD_LINE_2)
pero me da error de sintaxis,

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Thu Apr 07, 2016 2:09 pm

Con lo de los números aleatorios tu intención es añadir tres números aleatorios de una lista? Porque te puede servir .sample(lista, 3) ¿ o tiene que ser de varias listas obligatoriamente?

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Thu Apr 07, 2016 4:22 pm

Por la traza del error porque no veo el error.

Debería funcionar, así sería para cuatro números y un texto al azar.

https://repl.it/CCoD/3

ebsigma
Posts: 79
Joined: Sat Aug 11, 2012 10:33 am

Re: duda codigo phyton LCd 16x2

Thu Apr 07, 2016 4:28 pm

ajam, es como dices, lo que pasaba (y mira que probe eso mismo tambien) es que cometeria algun error en parentesis o vete a saber :P

raspdroid
Posts: 1606
Joined: Thu Nov 06, 2014 9:15 am
Location: Gran Canaria :: España

Re: duda codigo phyton LCd 16x2

Thu Apr 07, 2016 4:50 pm

Suele pasar :)

Return to “Español”