Aporte. Pantallita para Raspberry PI

Estoy haciendo un curso de IoT y se usa la Raspberry normalmente "headless" para controlarla por VNC o por SSH.
Es cierto que se puede poner con IP fija pero es mas sencillo dejarla con DHCP y entonces cada día aparece en un sitio, total que se me ha ocurrido ponerle una pantallita buscando en el cajón de la mugre de los arduinos.
He aquí el resultado:
1614468115161.png
1614468126474.png
1614468142485.png
Esquema:


Captura de pantalla -2021-02-28 00-05-53.png
Para que se ejecute cada minuto hay que añadir a crontab:
* * * * * python3 /home/pi/LCD-IP.py

El back light no se lo he conectado, es el pin netLabel7. No sé que hacer con él, si buscar un PWM o si dejarlo fijo.

El programa.
Es muy largo pero porque tiene dos fuentes de caracteres; una proporcional y otra monospaced. Usad la que queráis y borrad la otra.
No se pueden quitar los delays, si se apura a 0 ya no funciona confiablemente. He apurado todo lo que he podido y después he subido un poquito para tener margen.

Python:
#Conexión del display de los teléfonos nokia a los pines
#Imports
import RPi.GPIO as GPIO
import time
import socket
import subprocess
from datetime import datetime

ASCII = [
   [ 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 ?
   ,[ 0x20, 0x54, 0x56, 0x55, 0x78 ] # 80 á
   ,[ 0x38, 0x54, 0x56, 0x55, 0x18 ] # 81 é
   ,[ 0x00, 0x44, 0x7e, 0x41, 0x00 ] # 82 i
   ,[ 0x38, 0x44, 0x46, 0x45, 0x38 ] # 83 ó
   ,[ 0x3c, 0x40, 0x42, 0x21, 0x7c ] # 84 ú
]
propASCII = [
   [ 0x00, 0x00, 0x00 ] # 20
   ,[ 0x00, 0x5f, 0x00 ] # 21 !
   ,[ 0x00, 0x07, 0x00, 0x07 ] # 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 ] # 27 '
   ,[ 0x00, 0x1c, 0x22, 0x41 ] # 28 (
   ,[ 0x00, 0x41, 0x22, 0x1c ] # 29 )
   ,[ 0x14, 0x08, 0x3e, 0x08, 0x14 ] # 2a *
   ,[ 0x08, 0x08, 0x3e, 0x08, 0x08 ] # 2b +
   ,[ 0x50, 0x30, ] # 2c ,
   ,[ 0x08, 0x08, 0x08, 0x08, 0x08 ] # 2d -
   ,[ 0x60, 0x60 ] # 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 ] # 3a :
   ,[ 0x00, 0x56, 0x36, 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
   ,[ 0x41, 0x7f, 0x41 ] # 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
   ,[ 0x7f, 0x41, 0x41 ] # 5b [
   ,[ 0x02, 0x04, 0x08, 0x10, 0x20 ] # 5c ¥
   ,[ 0x41, 0x41, 0x7f ] # 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
   ,[ 0x44, 0x7d, 0x40 ] # 69 i
   ,[ 0x20, 0x40, 0x44, 0x3d ] # 6a j
   ,[ 0x7f, 0x10, 0x28, 0x44, 0x00 ] # 6b k
   ,[ 0x41, 0x7f, 0x40 ] # 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
   ,[ 0x08, 0x36, 0x41 ] # 7b [
   ,[ 0x00, 0x7f, 0x00 ] # 7c |
   ,[ 0x41, 0x36, 0x08 ] # 7d ]
   ,[ 0x10, 0x08, 0x08, 0x10, 0x08 ] # 7e ?
   ,[ 0x06, 0x09, 0x09, 0x06 ] # 7f ?
   ,[ 0x20, 0x54, 0x56, 0x55, 0x78 ] # 80 á
   ,[ 0x38, 0x54, 0x56, 0x55, 0x18 ] # 81 é
   ,[ 0x00, 0x44, 0x7e, 0x41, 0x00 ] # 82 i
   ,[ 0x38, 0x44, 0x46, 0x45, 0x38 ] # 83 ó
   ,[ 0x3c, 0x40, 0x42, 0x21, 0x7c ] # 84 ú
]

#Definición de pines
clk= 24      #Activa por flanco de subida
din= 23      #Dato serie
dc= 22       #Data con 1 Command con 0 es D/C
ce= 27       #Es negada, activa con 0
rst= 17      #Es negada, activa con o

#Definición de funciones
def lcd_print(cadena):
    largo = len (cadena)
    bucle = 0
    while bucle < largo:
        lcd_char(cadena[bucle])
        bucle +=1

def gotoXY(x,y):
    send_byte(0, 0x80 | x )
    send_byte(0, 0x40 | y )

def send_byte (dece,byte):
    GPIO.output(dc,dece)
    GPIO.output(ce,0)
    cuenta = 7
    while cuenta > -1:
        bit = 0
        if byte & 2**cuenta >0:
            bit = 1
        GPIO.output(din,bit)
        pulso()
        #print(cuenta, bit, 2**cuenta)
        cuenta -= 1
    GPIO.output(ce,1)
    #time.sleep(0.000002)
    return

def lcd_char(caracter):   #Cambiar ASCII para fuente mono espacio y propASCII para fuente proporcional
    car = ord(caracter)
    if car == 225:
        car = 0x80
    if car == 233:
        car = 0x81
    if car == 237:
        car = 0x82
    if car == 243:
        car = 0x83
    if car == 250:
        car = 0x84
    cuenta = 0
    largo = len (propASCII[car-0x20])
    while (cuenta < largo):
        send_byte(1,propASCII[car-0x20][cuenta])
        cuenta +=1
    send_byte(1,0) #Añade un pixel de espacio al final de cada caracter

def pulso():
    time.sleep(0.000000001)
    GPIO.output(clk,1)
    time.sleep(0.000000002)
    GPIO.output(clk,0)
    time.sleep(0.000000001)
    return

def cls_lcd():
    cuenta = 0
    while cuenta < 504:
        send_byte(1,0)
        cuenta+=1
    
def lineaH():
    bucle = 0
    while bucle < 84:
        send_byte(1,0x4)
        bucle +=1

def get_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        # doesn't even have to be reachable
        s.connect(('10.255.255.255', 1))
        IP = s.getsockname()[0]
    except Exception:
        IP = '127.0.0.1'
    finally:
        s.close()
    return IP

#Configuración de pines
#Todos como salida

#print (get_ip())
#print(ASCII[2][2])

GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setup(clk,GPIO.OUT)
GPIO.setup(din,GPIO.OUT)
GPIO.setup(dc,GPIO.OUT)
GPIO.setup(ce,GPIO.OUT)
GPIO.setup(rst,GPIO.OUT)


#El progrma en si
# Lo primero de todo es poner a 0 el reloj
GPIO.output(clk,0)
GPIO.output(ce,0)
GPIO.output(dc,0)
time.sleep(0.00010)
#resetear
GPIO.output(rst,0)
time.sleep(0.0001)
GPIO.output(rst,1)
time.sleep(0.0001)

#Dar un pulso de reset
#GPIO.output(ce,0)
send_byte(0,0x21)
send_byte(0,0xb4)   #Contraste b 1nnn nnnn
send_byte(0,0x04)
send_byte(0,0x14)
send_byte(0,0x0c)
#Empieza el caracter
send_byte(0,0x20)
send_byte(0,0x0c)

time.sleep(0.0005)

#cls_lcd()  #Limpiar pantalla

gotoXY(0,0)
now = datetime.now()
lcd_print("Hora>>   ")
lcd_print(now.strftime("%H:%M"))

gotoXY(0,1)
lineaH()
gotoXY(0,2)
lcd_print("Raspberry PI")

gotoXY(0,3)
lineaH()
gotoXY(0,4)
lcd_print("Dirección IP")
gotoXY(0,5)
lcd_print(get_ip())
 
Última edición:
Arriba