A tela do cliente apareceu. Tornou-se interessante tentar usá-lo como um painel de informações para exibir informações sobre o dia atual, horário até o final do dia / semana útil, informações sobre o tempo e taxas de câmbio.
Ao mesmo tempo, não queria usar aplicativos com muitos recursos e meu PC. Ele parou em um monte de mini-PC Raspberry + Linux + Customer Display.


Comentários obrigatórios
Não considero instalar e configurar o Linux OS em um dispositivo Raspberry neste artigo.
Para editar texto no Linux, usei os editores nano e mcedit.
Para acessar um mini-PC baseado no Linux a partir do Windows, ele usava clientes para acesso remoto via protocolo SSH - KiTTY / PuTTY.
Para transferir arquivos entre Windows e Linux, usei o WinSCP.
Bash - shell (concha).
Bash é uma abreviação de "Bourne-Again Shell" (shell "revivido"). Palavras-chave, sintaxe e outros recursos básicos da linguagem foram emprestados de outro sh shell (abreviação de shell).
O Bash também é uma poderosa linguagem de programação.
Estou envolvido na manutenção de produtos de software baseados em 1C e, para mim, foi uma oportunidade de me familiarizar com a programação no ambiente Linux.
Na melhor das hipóteses, explicarei os comandos que estão sendo executados. O objetivo é atingir um grande público.
O que você usou?
- Computador de placa única Raspberry Pi 2 Modelo B v1.1 com Raspbian GNU / Linux 9.4 (estiramento) instalado.
- Exibição do cliente POSUA LPOS-VFD USB.
- O shell bash
1ª etapa. Conectar e configurar a exibição do cliente
Depois de conectar a tela do cliente (DP) à porta USB, descobriremos os parâmetros do dispositivo conectado. No terminal, execute o comando:
usb-devices
Obtenha uma lista de dispositivos USB conectados ao Raspberry:
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev
A partir das informações recebidas pelo comando, encontramos a linha Product = POSua LPOS-II-VFD USB CDC . Esta é a exibição do nosso cliente. Nesta seção, precisamos da linha Fornecedor = 0000 ProdID = 0131 Rev = 01.00. Ou seja, fornecedor = 0000 prodID = 0131 . Então o dispositivo se identifica.
Para a operação correta com o DP, é necessário carregar o módulo de operação USB no núcleo do sistema. Execute o comando com privilégios elevados:
sudo modprobe usbserial vendor=0x0000 product=0x0131
modprobe é um programa para adicionar módulos ao kernel do Linux. usbserial é um módulo do kernel que emula uma porta COM em dispositivos USB. 0x - significa formato hexadecimal.
Como tenho um dispositivo USB conectado, em um sistema Linux, ele recebe automaticamente o arquivo ttyUSB0 . Esse é um recurso importante para interagir com dispositivos no Linux - trabalhar com o dispositivo como um arquivo. Os arquivos do dispositivo são armazenados no /dev .
Para funcionar corretamente com o DP, defina a taxa de transferência de dados:
stty -F /dev/ttyUSB0 9600
stty - o comando define os parâmetros de entrada / saída do terminal para o dispositivo. -F é o dispositivo. No nosso caso, a exibição do comprador é /dev/ttyUSB0 . E para este dispositivo, é definida uma velocidade de 9600 bauds.
Agora você pode tentar exibir uma mensagem de boas-vindas (em inglês até o momento):
echo "Hello!" > /dev/ttyUSB0
Se tudo foi feito corretamente, nossa mensagem aparecerá na tela. Mais detalhes sobre a equipe abaixo.
2 etapa. Programação
No estágio anterior, exibimos uma mensagem em inglês na parte superior da tela inicial do dispositivo. E não é muito bonito.
Para limpar a tela de exibição, execute o comando:
echo -e -n "\x0c\x0b" > /dev/ttyUSB0
comando de saída echo - terminal. A opção -e - habilita o suporte para a saída de seqüências de escape, -n - indica que não é necessário gerar feeds de linha. A entrada -en é permitida.
Combinações de caracteres que consistem em uma barra invertida \ seguida por uma letra ou um conjunto de números são chamadas seqüências de escape.
0 - limpa a tela do visor e cancela o modo de linha, 0b - move o cursor para a posição superior esquerda. Símbolo > - controle de fluxo (redireciona a saída). Nesse caso, o arquivo / dev / ttyUSB0 do nosso dispositivo. Se você acabou de executar o echo "Hello!" , o texto indicado entre aspas será exibido na janela do terminal.
A propósito, o comando que altera a velocidade de transmissão de dados para o dispositivo pode ser escrito da seguinte maneira:
stty 9600 < /dev/ttyUSB0
Bem, para exibir mensagens em russo, faça:
echo -n "!" | iconv -f UTF-8 -t CP866 > /dev/ttyUSB0
| - Redireciona a saída de um comando para a entrada de outro (pipeline). No nosso caso, a sequência de caracteres "Olá!" não é enviado imediatamente para o arquivo do dispositivo, mas transferido para o utilitário de "conversão" iconv. iconv - converte de uma codificação para outra.
O shell bash permite que você não apenas execute comandos diretamente no terminal, mas também grave arquivos de script.
Um script é um arquivo de texto sem formatação com uma sequência de comandos executados.
Para que o bash entenda que é isso, no início do arquivo é #! / Bin / bash . E para executar o script diretamente, você precisa executar o comando:
sudo chmod u+x namefile.sh
Onde namefile.sh é o arquivo de script. A extensão sh - significa que é um arquivo de script bash. chmod é um programa para alterar os direitos de acesso a arquivos e diretórios. u+x - define o direito de executar o arquivo para o usuário atual.
Vamos resolver o problema com dois scripts. O primeiro script é o principal ( dispos.sh ). Ele exibe todas as informações necessárias na tela do comprador. O segundo auxiliar ( parse.sh ) recebe dados climáticos, serviços de cotação de moeda e grava dados em arquivos intermediários. Arquivos de dados intermediários são usados no primeiro script.
Para que os scripts possam ser executados, você deve executar os seguintes comandos:
sudo chmod +x dispos.sh sudo chmod +x parse.sh
Observe que apenas +x . Esta é uma versão abreviada de u+x .
Os scripts precisam ser executados em intervalos regulares. Para fazer isso, use o planejador crontab padrão. Para editar, use o comando:
crontab -e
Adicione duas linhas ao planejador:
*/20 * * * * /home/pi/parse.sh */1 * * * * /home/pi/dispos.sh
O script parse.sh é executado a cada 20 minutos e o script dispos.sh a cada minuto.
Antes da exibição inicial do cliente na exibição, você deve primeiro executar o script parse.sh, que receberá os principais dados meteorológicos e de moeda.
./parse.sh
A seguir, darei os scripts completos com pequenos comentários.
Descrição dos arquivos de script
Arquivo Dispos.sh
Comentários
Para exibir a data atual, use o comando date . Exemplo
echo `date "+%d.%m.%Y %H:%M"`
Após a execução, obtemos a data do formulário: 20/05/2019 12:11.
Para calcular o tempo até o final do dia, usamos a variável adicional TIME_OF_WORKDAY e configuramos o valor TIME_OF_WORKDAY="18:00:00" . Bem, então calculamos as horas e minutos até o final do dia útil:
HOURS=$(( ( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) / 3600 )) MINUTES=$(( (( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) - $HOURS * 3600) / 60 ))
O símbolo $ indica que é uma variável.
O símbolo # é um comentário.
date +%s - obtém a data e a hora atuais em segundos.
date +%s --date=$TIME_OF_WORKDAY - obtenha o tempo em segundos até TIME_OF_WORKDAY ("18:00:00") .
Cálculo do tempo até o final da semana de trabalho:
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 ))
Onde DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"` é o tempo em segundos do tempo atual até sexta-feira 17:00:00.
Parte do script é implementada usando funções. Por exemplo
disp_clear() é o nome da função. Em {} , comandos executáveis são indicados.
A variável DEV_DISPLAY é "global" e é definida no início do script e, portanto, DEV_DISPLAY="/dev/ttyUSB0" .
Lendo dados de um arquivo, por exemplo, uma linha específica (1):
LINE1=$(sed -n '1{p;q}' /tmp/weather.txt)
sed é um editor de texto que executa operações de edição de informações em um fluxo ou arquivo de entrada padrão. A -n exibe a linha selecionada no momento. '1{p;q}' - imprime 1 linha e sai sem ler o restante ( p -print, q -output).
Outra opção para ler de um arquivo (linha por linha):
while read line do BTC=${line:0:13} done </tmp/bitcoin.txt
E, portanto, DISPLAY_LINE1=${LINE1:0:14} da linha LINE1 extraímos uma subcadeia de 14 caracteres de comprimento, começando em 0.
Os caracteres são substituídos pela combinação // , por exemplo, DOLLAR//–/- . O símbolo "-" é substituído por um "-".
Arquivo parse.sh
Comentários
O comando wget permite baixar arquivos, páginas etc. da rede. A opção -q - exibe um mínimo de informações, -O - salva no arquivo especificado.
As linhas abaixo gravam no arquivo:
echo "${WEATHER1}" > /tmp/weather.txt echo ${WEATHER2%.*} >> /tmp/weather.txt
Além disso, se o redirecionamento do fluxo de saída para o arquivo > , o conteúdo do arquivo será sobrescrito e use >> anexa dados ao arquivo.
Um exemplo de uso de um parâmetro em uma função:
conv 6
Diretamente em função:
CURRENCY=$(sed -n '1!G;h;$p' /tmp/ex.xml | sed -n "${1}{p;q}")
Onde {1} é o parâmetro. O número 6 é passado.
Preste atenção à função de substituição de substring complicada, por exemplo:
LINEBTC//[^.^0-9]/
Somente o "." e todos os números são de 0 a 9.
Posfácio
No bash, quase todos os recursos das linguagens de programação "comuns" estão disponíveis. E algumas equipes, em comparação com os análogos em 1C, surpreendem com seu laconicismo e funcionalidade.
No momento, a exibição do cliente como um quadro de avisos está funcionando de forma estável há mais de seis meses.
Lista de recursos
- Página de exibição do comprador LPOS-VFD
- Programar símbolos de moeda para exibição do cliente
- Noções básicas do BASH (parte 1)
- Noções básicas do BASH (parte 2)
- Como usar o PuTTY
- Editor de texto nano Linux para iniciantes
- Manual para usuários do WinSCP