Exibimos uma moldura digital na Internet

imagem
Provavelmente muitos, olhando para a moldura digital, pensaram se é possível exibir suas próprias informações que variam ao longo do tempo? Como sou o proprietário da moldura há vários anos, essa idéia me ocorreu - a moldura seria perfeita para exibir previsões do tempo e informações da “casa inteligente”. Sobre como implementar essa funcionalidade, sem interferir no design do quadro - leia abaixo do gato.

Métodos de implementação


A maneira mais fácil de controlar a imagem exibida na moldura digital é simplesmente alternar as imagens pré-preparadas armazenadas em sua memória da maneira correta. Aqui está um exemplo de implementação desse método. Obviamente, esse método não é muito flexível - você pode exibir um único número de variável e o processo de alteração desse número será bastante lento.

Assim, desde que seja impossível desmontar o quadro, resta apenas usar suas interfaces de memória externa - SPI (para trabalhar com cartão SD) e USB. Basta criar um dispositivo que simule uma unidade externa, conectá-la ao quadro - e ele próprio solicitará imagens desse dispositivo. Usar um microcontrolador para emular um cartão SD é bastante difícil, e é difícil repetir o fator de forma do próprio cartão. Pode-se usar um cartão SD WiFi pronto, mas todos os cartões que eu conheço eram muito caros (> US $ 40, o que é quase o custo do próprio quadro).
Usar o USB para resolver esse problema é mais adequado - não é um problema encontrar um microcontrolador produtivo com suporte a USB; a conexão ao quadro é realizada por um conector padrão. Além disso, já havia uma publicação sobre Habrédedicado a emular uma unidade USB usando o microcontrolador stm32. Os comentários neste artigo discutiram a possibilidade de transferir dados alterados dinamicamente por esse método. Devido ao armazenamento em cache dos dados do sistema operacional durante a leitura de um arquivo, não faz sentido alterar o conteúdo dos arquivos emulados - o SO simplesmente não os solicita, pois não poderá descobrir o que foram alterados. No entanto, as molduras não armazenam arquivos em cache (eles simplesmente não têm a quantidade certa de RAM)! Você pode verificar isso conectando qualquer unidade flash USB à moldura fotográfica, com um LED piscando ao ler arquivos - ele piscará constantemente ao ler arquivos. Portanto, eu decidi usar esse método específico.

Parte do software


Eu já tinha a placa de depuração STM32F4DISCOVERY, então decidi verificar a operação da biblioteca emfat proposta no artigo acima. Não houve problemas com o Windows 7, mas o porta-retratos não pôde detectar os arquivos no disco "virtual". Como se viu depois, o tablet Android também não detectou a unidade. Outro computador Ubuntu detectou um dispositivo USB, mas não conseguiu montar a unidade.
Eu tive que enfrentar o problema mais profundamente. Como se viu, apesar do Windows ter detectado a unidade e poder ler os arquivos, o TestDisk não conseguiu determinar o sistema de arquivos:
imagem
Gradualmente, estudando os resultados dos dados brutos fornecidos pelo TestDisk, além de investigar o código-fonte desse programa, percebi que um dos critérios pelos quais o TestDisk determina o sistema de arquivos usado é o tamanho do disco. Emfat, o tamanho do disco emulado depende da quantidade de dados nele. Portanto, se houver um ou vários arquivos pequenos no disco, o tamanho do disco não excederá 16 MB. Ao mesmo tempo, o FAT32 impõe restrições ao tamanho mínimo do volume - pelo menos 65527 clusters. Considerando que em “emfat” um cluster ocupa 4096 bytes, para a conformidade com o FAT32, o tamanho do disco deve ser 65527 * 4096 ~ 268Mb. Na realidade, isso não ocorre, o que causa erros na determinação do tipo de sistema de arquivos. Uma tentativa de aumentar a capacidade do disco aumentando o volume do arquivo emulado para 400 MB não funcionou - talvez algo mais não se ajustasse lá.Então, decidi refazer “emfat” para emular o sistema de arquivos FAT16.
Por fim, isso foi bem-sucedido e a unidade começou a ser detectada corretamente por todos os dispositivos:
imagem
vale a pena notar que o FAT16 também possui uma limitação no tamanho do disco - pelo menos 4087 clusters, ou seja, 16 MB neste caso. Para atender a essa condição, é necessário criar um arquivo virtual de 20 MB no emfat.

A verificação da moldura foi boa - a moldura exibiu com sucesso a imagem de teste armazenada na memória Flash do controlador. O próximo passo é exibir imagens personalizadas. A maneira mais fácil de emular arquivos BMP é que eles têm uma estrutura bastante simples; a imagem pode ser de 256 cores, ou seja, há um byte por pixel. Mas somente nesse caso, você precisa de 480 KB de RAM para armazenar uma imagem de tamanho 800 * 600. O microcontrolador não possui essa capacidade de memória, o que significa que resta apenas uma opção - formar a imagem em tempo real. O princípio de operação é o seguinte - no caso em que o dispositivo host solicita dados de um arquivo da unidade, o emfat chama a função de retorno de chamada correspondente a esse arquivo. O número do setor no qual os dados são solicitados e o ponteiro pelo qual esses dados devem ser gravados são transferidos para essa função. Conhecendo o número do setor,você pode determinar qual parte da imagem é solicitada e formar.
Durante os experimentos, um fato desagradável foi descoberto - o Windows pode solicitar dados de setores fora de ordem. Por que isso é feito não está claro, mas isso complica a formação da imagem em tempo real, pois é necessário apenas calcular o número do setor - que parte dos dados está sendo solicitada no momento. Outro problema é que as linhas nos arquivos BMP vão de baixo para cima, o que complica ainda mais o cálculo da posição.
Para exibir o texto, usei a biblioteca mcufont . É conveniente, pois permite o uso de fontes compactadas, o que reduz significativamente o uso de memória Flash. Desde que eu usei fontes grandes o suficiente, esse recurso é bastante importante.
Essa biblioteca grava diretamente a imagem gerada na memória; portanto, para que a biblioteca funcione, é necessário alocar uma matriz separada na RAM.
Também implementei a renderização de imagens da memória do controlador. Todas as imagens, como texto, são exibidas em preto e branco, devido às quais informações sobre 8 pixels podem ser armazenadas em um byte da imagem. Para converter imagens comuns em uma visualização adequada para conexão com um projeto, foi utilizado o programa LCD Assistant .

Como resultado, uma imagem do seguinte formulário é formada na unidade USB conectada:
Título

Depois que o programa foi testado no STM32F4DISCOVERY, criei o próprio dispositivo, que é um microcontrolador com um módulo WiFi conectado a ele no ESP8266. Dos adequados, eu tinha apenas o controlador STM32F107RCT7.
O circuito do dispositivo resultante acabou sendo bastante simples: mas devido às restrições no tamanho da placa - 17x36mm (eu planejava instalá-lo no gabinete acabado) e ao tamanho grande do controlador, a placa de circuito impresso não era a mais fácil de fabricar - frente e verso, com peças montadas nos dois lados. Nesse caso, algumas linhas de energia tiveram que ser feitas com um fio. Vista da placa resultante (durante a depuração com o módulo ESP-01):




Com os tamanhos de placa indicados, o módulo WiFi ESP-03 foi o mais adequado. É assim que a placa resultante se parece com o módulo já instalado: E do lado do controlador: Durante os experimentos, verificou-se que a sensibilidade da antena de cerâmica claramente não era suficiente - o módulo dificilmente conectado ao roteador. Após conectar um pedaço de fio de 31 mm ao pino WIFI_ANT, a sensibilidade melhorou acentuadamente e tornou-se semelhante à sensibilidade do ESP-01. O local em que a moldura fotográfica está instalada permanentemente fica a poucos metros do roteador e a antena nativa do módulo também funciona normalmente, portanto, não há antena adicional na foto.





Como o ESP8266 estava bastante quente durante uma operação constante, decidi ativá-lo apenas durante solicitações de informações. O gerenciamento de energia pode ser feito usando a saída do módulo CH_PD. Definir este pino como 0 faz com que o ESP8266 entre no modo de baixa energia.
Para tornar mais conveniente testar a operação do ESP8266, escrevi um firmware separado para o microcontrolador que implementa a ponte USB-UART. É através dele que o módulo é configurado para funcionar com o roteador, para que, depois de ligado, o ESP8266 se conecte automaticamente a ele.

O princípio de operação do dispositivo resultante é bastante simples - a cada 10 minutos, o controlador tenta solicitar dados do servidor e, se for bem-sucedido, atualiza os dados climáticos. Os dados sobre a temperatura atual e a previsão para 3 dias de antecedência são obtidos no site openweathermap.org, informações sobre a temperatura fora e dentro da varanda são obtidas no servidor majordomo. Ao mesmo tempo, a moldura solicita uma imagem a cada 6 segundos, enquanto exibe as informações atuais. Como os dois processos podem ocorrer simultaneamente, o DMA é usado para receber dados do ESP8266.

Como resultado, a seguinte imagem é exibida na moldura: Código-fonte do projeto: github.com/iliasam/USB_Photoframe



Source: https://habr.com/ru/post/pt384177/


All Articles