Scooter
Cascarrabias crónico
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:



Esquema:

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.
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:



Esquema:

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: