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