La pantalla del cliente ha aparecido. Se volvió interesante tratar de usarlo como un tablero de información para mostrar información sobre el día actual, el tiempo hasta el final del día / semana laboral, información meteorológica y tipos de cambio.
Al mismo tiempo, no quería usar aplicaciones de uso intensivo de recursos y mi PC. Se detuvo en un montón de mini-PC Raspberry + Linux + Customer Display.


Comentarios requeridos
No considero instalar y configurar el sistema operativo Linux en un dispositivo Raspberry en este artículo.
Para editar texto en Linux, utilicé los editores nano y mcedit.
Para acceder a una mini PC basada en Linux desde Windows, utilizó clientes para acceso remoto a través del protocolo SSH: KiTTY / PuTTY.
Para transferir archivos entre Windows y Linux, utilicé WinSCP.
Bash - concha (concha).
Bash es una abreviatura de "Bourne-Again Shell" (shell "revivido"). Las palabras clave, la sintaxis y otras características básicas del lenguaje se tomaron prestadas de otro sh shell (abreviatura de shell).
Bash también es un poderoso lenguaje de programación.
Me dedico al mantenimiento de productos de software basados en 1C y para mí fue una oportunidad para familiarizarme con la programación en el entorno Linux.
A mi entender, explicaré los comandos que se están ejecutando. Esto se hace con el objetivo de llegar a una gran audiencia.
Que usaste
- Computadora de placa única Raspberry Pi 2 Modelo B v1.1 con Raspbian GNU / Linux 9.4 (stretch) instalado.
- Pantalla del cliente POSUA LPOS-VFD USB.
- El bash shell
1ra etapa. Conectar y configurar la pantalla del cliente
Después de conectar la pantalla del cliente (DP) al puerto USB, descubriremos los parámetros del dispositivo conectado. En la terminal, ejecute el comando:
usb-devices
Obtenga una lista de dispositivos USB conectados a Raspberry:
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev
De la información recibida por el comando encontramos la línea Producto = POSua LPOS-II-VFD USB CDC . Esta es nuestra exhibición del cliente. En esta sección, necesitamos la línea Proveedor = 0000 ProdID = 0131 Rev = 01.00. A saber, proveedor = 0000 prodID = 0131 . Entonces el dispositivo se identifica a sí mismo.
Para la operación correcta con el DP, es necesario cargar el módulo de operación USB en el núcleo del sistema. Ejecute el comando con privilegios elevados:
sudo modprobe usbserial vendor=0x0000 product=0x0131
modprobe
es un programa para agregar módulos al kernel de Linux. usbserial
es un módulo de kernel que emula un puerto COM en dispositivos USB. 0x: significa formato hexadecimal.
Como tengo un dispositivo USB conectado, en un sistema Linux, recibe automáticamente el archivo ttyUSB0 . Esta es una característica importante de interactuar con dispositivos en Linux: trabajar con el dispositivo como un archivo. Los archivos del dispositivo se almacenan en el /dev
.
Para trabajar correctamente con DP, configure la velocidad de transferencia de datos:
stty -F /dev/ttyUSB0 9600
stty
: el comando establece los parámetros de entrada / salida del terminal para el dispositivo. -F
es el dispositivo. En nuestro caso, la pantalla del comprador es /dev/ttyUSB0
. Y para este dispositivo, se establece una velocidad de 9600 baudios.
Ahora puede intentar mostrar un mensaje de bienvenida (hasta ahora en inglés):
echo "Hello!" > /dev/ttyUSB0
Si todo se hizo correctamente, nuestro mensaje aparecerá en la pantalla. Más detalles sobre el equipo a continuación.
2 etapas. Programacion
En la etapa anterior, mostramos un mensaje en inglés en la parte superior de la pantalla de inicio del dispositivo. Y no es muy bonito.
Para borrar la pantalla, ejecute el comando:
echo -e -n "\x0c\x0b" > /dev/ttyUSB0
echo
- comando de salida del terminal. La opción -e
- habilita el soporte para la salida de secuencias de escape, -n
- indica que no es necesario generar saltos de línea. La entrada -en
está permitida.
Las combinaciones de caracteres que consisten en una barra invertida \
seguida de una letra o un conjunto de números se denominan secuencias de escape.
0
: borra la pantalla y cancela el modo de línea; 0b
: mueve el cursor a la posición superior izquierda. Símbolo >
- control de flujo (redirige la salida). En este caso, el archivo / dev / ttyUSB0 de nuestro dispositivo. Si solo ejecuta el echo "Hello!"
, el texto indicado entre comillas aparecerá en la ventana del terminal.
Por cierto, el comando que cambia la velocidad para transmitir datos al dispositivo podría escribirse de la siguiente manera:
stty 9600 < /dev/ttyUSB0
Bueno, para mostrar mensajes en ruso, haga lo siguiente:
echo -n "!" | iconv -f UTF-8 -t CP866 > /dev/ttyUSB0
|
- Redirige la salida de un comando a la entrada de otro (canalización). En nuestro caso, la secuencia de caracteres "¡Hola!" no se envía al archivo del dispositivo inmediatamente, sino que se transfiere al ícono de la utilidad de "conversión" v. iconv
: convierte de una codificación a otra.
El shell bash le permite no solo ejecutar comandos directamente en el terminal, sino también escribir archivos de script.
Un script es un archivo de texto sin formato con una secuencia de comandos ejecutados.
Para que bash entienda que es "suyo", el #! / Bin / bash se indica al comienzo del archivo. Y para ejecutar el script directamente, debe ejecutar el comando:
sudo chmod u+x namefile.sh
Donde namefile.sh es el archivo de script. La extensión sh significa que es un archivo de script bash. chmod
es un programa para cambiar los derechos de acceso a archivos y directorios. u+x
: establece el derecho a ejecutar el archivo para el usuario actual.
Resolveremos el problema con dos scripts. El primer script es el principal ( dispos.sh ). Muestra toda la información necesaria en la pantalla del comprador. El segundo - auxiliar ( parse.sh ) recibe datos meteorológicos, servicios de cotización de divisas y escribe datos en archivos intermedios. Los archivos de datos intermedios se utilizan en el primer script.
Para que los scripts puedan ejecutarse, debe ejecutar los siguientes comandos:
sudo chmod +x dispos.sh sudo chmod +x parse.sh
Tenga en cuenta que solo +x
. Esta es una versión abreviada de u+x
.
Las secuencias de comandos deben ejecutarse a intervalos regulares. Para hacer esto, use el programador crontab estándar. Para editar, use el comando:
crontab -e
Agregue dos líneas al planificador:
*/20 * * * * /home/pi/parse.sh */1 * * * * /home/pi/dispos.sh
El script parse.sh se ejecuta cada 20 minutos y el script dispos.sh cada minuto.
Antes de la visualización inicial del cliente en la pantalla, primero debe ejecutar el script parse.sh, que recibirá los datos primarios de clima y moneda.
./parse.sh
A continuación, daré los guiones completos con breves comentarios.
Descripción de los archivos de script
Archivo Dispos.sh
Comentarios
Para mostrar la fecha actual, use el comando de date
. Ejemplo
echo `date "+%d.%m.%Y %H:%M"`
Después de la ejecución, obtenemos la fecha del formulario: 20/05/2019 12:11.
Para calcular el tiempo hasta el final del día, utilizamos la variable adicional TIME_OF_WORKDAY
y establecemos el valor TIME_OF_WORKDAY="18:00:00"
. Bueno, entonces calculamos las horas y minutos hasta el final de la jornada laboral:
HOURS=$(( ( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) / 3600 )) MINUTES=$(( (( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) - $HOURS * 3600) / 60 ))
El símbolo $
indica que es una variable.
El símbolo #
es un comentario.
date +%s
: obtenga la fecha y hora actuales en segundos.
date +%s --date=$TIME_OF_WORKDAY
- obtenga el tiempo en segundos hasta TIME_OF_WORKDAY ("18:00:00")
.
Cálculo del tiempo hasta el final de la semana laboral:
DAYS=$(( ($DAY_OF_WEEKEND-$(date +%s)) / (24*3600) )) HOURS=$(( (($DAY_OF_WEEKEND-$(date +%s)) - ($DAYS*24*3600)) / 3600 )) MINUTES=$(( (($DAY_OF_WEEKEND-$(date +%s)) - ($DAYS*24*3600) - ($HOURS*60*60)) / 60 ))
Donde DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"`
es el tiempo en segundos desde la hora actual hasta el viernes 17:00:00.
Parte del script se implementa utilizando funciones. Por ejemplo
disp_clear()
es el nombre de la función. En {}
, se indican los comandos ejecutables.
La variable DEV_DISPLAY
es "global" y se establece al comienzo del script y, en consecuencia, DEV_DISPLAY="/dev/ttyUSB0"
.
Lectura de datos de un archivo, por ejemplo, una línea específica (1):
LINE1=$(sed -n '1{p;q}' /tmp/weather.txt)
sed
es un editor de texto que realiza operaciones de edición de información en una secuencia o archivo de entrada estándar. La -n
muestra la línea seleccionada actualmente. '1{p;q}'
: imprime 1 línea y sale sin leer el resto ( p
- imprimir, q
- salida).
Otra opción para leer desde un archivo (línea por línea):
while read line do BTC=${line:0:13} done </tmp/bitcoin.txt
Y así DISPLAY_LINE1=${LINE1:0:14}
de la línea LINE1
extraemos una subcadena de 14 caracteres de longitud a partir de 0.
Los caracteres se reemplazan por la combinación //
, por ejemplo, DOLLAR//–/-
. El símbolo "-" se reemplaza por un "-".
Archivo parse.sh
Comentarios
El comando wget
permite descargar archivos, páginas, etc. de la red. La opción -q
- muestra un mínimo de información, -O
- guarda en el archivo especificado.
Las siguientes líneas escriben en el archivo:
echo "${WEATHER1}" > /tmp/weather.txt echo ${WEATHER2%.*} >> /tmp/weather.txt
Además, si >
redirección de la secuencia de salida al archivo >
, el contenido del archivo se sobrescribe y el uso >>
agrega datos al archivo.
Un ejemplo de uso de un parámetro en una función:
conv 6
Directamente en función:
CURRENCY=$(sed -n '1!G;h;$p' /tmp/ex.xml | sed -n "${1}{p;q}")
Donde {1}
es el parámetro. Se pasa el número 6.
Preste atención a la complicada función de reemplazo de subcadenas, por ejemplo:
LINEBTC//[^.^0-9]/
Solo el "." y todos los números son del 0 al 9.
Epílogo
En bash, casi todas las características de los lenguajes de programación "ordinarios" están disponibles. Y algunos equipos, en comparación con los análogos en 1C, sorprenden con su laconicismo y funcionalidad.
Por el momento, la pantalla del cliente como un tablón de anuncios ha estado funcionando de manera constante durante más de seis meses.
Listado de recursos
- Página de visualización del comprador LPOS-VFD
- Programar símbolos de moneda para la visualización del cliente
- BASH Basics (Parte 1)
- BASH Basics (Parte 2)
- Cómo usar PuTTY
- Editor de nano texto de Linux para principiantes
- Manual para usuarios de WinSCP