我们在互联网上显示数码相框

图片
大概有很多人看着数码相框,想着是否有可能显示自己的随时间变化的信息?由于我已经是相框的拥有者多年了,所以我想到了这样的想法-相框非常适合显示“智能家居”中的天气预报和信息。关于如何实现这种功能而又不干扰框架的设计-请仔细阅读。

实施方法


控制数码相框上显示的图像的最简单方法就是简单地以正确的方式切换存储在其内存中的预先准备的图像。这是此方法的示例实现。显然,此方法不是很灵活-您可以显示单个变量号,并且更改此数字的过程将非常缓慢。

因此,如果无法拆卸框架,则只能使用其外部存储器接口-SPI(用于SD卡)和USB。只需制造一个模拟外部驱动器的设备,然后将其连接到机架上,它本身就会从该设备请求图像。使用微控制器模拟SD卡非常困难,并且卡本身的形状因数很难重复。一个人可以使用现成的WiFi SD卡,但我所知道的所有此类卡都太昂贵了(> 40美元,接近框架本身的成本)。
使用USB解决此问题更合适-找到具有USB支持的高效微控制器不是问题。通过标准连接器与框架进行连接。而且,已经有关于哈布雷的出版物专门用于使用stm32微控制器模拟USB驱动器。对本文的评论讨论了通过这种方法传输动态变化的数据的可能性。由于操作系统在读取文件时会缓存数据,因此更改模拟文件的内容没有任何意义-操作系统将不会直接请求它们,因为它将无法发现它们已更改。但是,相框不缓存文件(它们根本没有适当数量的RAM)!您可以通过将任何USB闪存驱动器连接到相框来进行检查,读取文件时LED闪烁-读取文件时LED持续闪烁。因此,我决定使用此特定方法。

软件部分


我已经有了STM32F4DISCOVERY调试板,因此我决定检查上述文章中建议的emfat库的运行。 Windows 7没有问题,但是相框无法检测“虚拟”磁盘上的文件。后来发现,Android平板电脑也未检测到驱动器。另一台Ubuntu计算机检测到USB设备,但无法安装驱动器。
我不得不更深入地解决这个问题。事实证明,尽管Windows检测到该驱动器并可以从中读取文件,但TestDisk无法确定其上的文件系统:
图片
逐步研究了TestDisk提供的原始数据的结果,并深入研究了该程序的源代码,我意识到,TestDisk确定使用的文件系统的标准之一是磁盘大小。在emfat中,仿真磁盘的大小取决于其上的数据量。因此,如果磁盘上有一个或几个小文件,则磁盘大小将不会超过16 MB。同时,FAT32对最小卷大小(至少65527个群集)施加了限制。考虑到在“ emfat”中一个群集占用4096个字节,则为了符合FAT32,磁盘大小应为65527 * 4096〜268Mb。实际上,事实并非如此,这会导致确定文件系统类型时出错。通过将模拟文件的容量增加到400 MB来增加磁盘容量的尝试不起作用-也许其他方法不适合此处。因此,我决定重做“ emfat”以模拟FAT16文件系统。
最终,这成功了,并且所有设备开始正确地检测到该驱动器:
图片
值得注意的是FAT16也对磁盘大小有限制-至少4087个群集,在这种情况下为16 MB。要满足此条件,有必要在emfat中创建一个20 MB的虚拟文件。

带有相框的检查效果很好-相框成功显示了存储在控制器闪存中的测试图像。下一步是显示自定义图像。模拟BMP文件最简单的方法是它们具有相当简单的结构,图像可以是256色,即每个像素有一个字节。但是只有在这种情况下,您才需要480 KB的RAM来存储大小为800 * 600的图片。微控制器没有这样的存储容量,这意味着只剩下一个选择-动态地形成图像。操作原理如下-在主机设备从驱动器向文件请求数据的情况下,emfat调用与此文件相对应的回调函数。向其请求数据的扇区号和应写入该数据的指针。知道扇区号您可以确定请求图像的哪一部分并将其形成。
在实验过程中,发现了一个令人不愉快的事实-Windows可能会无序地请求扇区中的数据。执行此操作的原因尚不清楚,但这会使动态图像的生成变得复杂,因为有必要但要计算扇区号-当前正在请求哪个数据。另一个问题是BMP文件中的行是从下往上排列的,这进一步增加了位置计算的难度。
为了显示文本,我使用了mcufont。它的方便之处在于它允许您使用压缩字体,从而大大减少了闪存的使用。由于我使用了足够大的字体,因此此功能非常重要。
该库直接将生成的图像写入内存,因此要使该库正常工作,您必须在RAM中分配一个单独的数组。
我还实现了从控制器内存中渲染图像。所有图像(如文本)均以黑白显示,因此可以将大约8个像素的信息存储在图像的一个字节中。为了将普通图像转换为适合连接到项目的视图,使用了LCD Assistant程序

结果,在连接的USB驱动器上形成以下形式的图像:
标题

在STM32F4DISCOVERY上对该程序进行测试后,我制作了设备本身,这是一个在ESP8266上连接了WiFi模块的微控制器。在合适的控制器中,我只有STM32F107RCT7控制器。
最终设备的电路非常简单: 但是由于电路板尺寸的限制-17x36mm(我计划将其安装在成品盒中)和控制器的大尺寸,因此印制电路板并非最容易制造-双面且零件都安装在两侧。同时,某些电源线必须用电线制成。 最终电路板的视图(在使用ESP-01模块进行调试期间):




根据指示的电路板尺寸,WiFi模块ESP-03是最合适的。这就是已经安装了模块的最终电路板的样子: 并且从控制器来看: 在实验期间,事实证明陶瓷天线的灵敏度显然不够,该模块几乎没有连接到路由器。将一根31毫米的电线连接到WIFI_ANT引脚后,灵敏度显着提高,并变得与ESP-01相似。永久安装相框的位置距离路由器几米,并且模块的本机天线也可以正常工作,因此照片中没有其他天线。





由于ESP8266在持续运行期间非常热,因此我决定仅在信息请求期间将其打开。可以使用CH_PD模块的输出来完成电源管理。将此引脚设置为0会使ESP8266进入低功耗模式。
为了更方便地测试ESP8266的运行,我为实现USB-UART桥的微控制器编写了单独的固件。通过它,该模块可以配置为与路由器配合使用,以便在开启后,ESP8266会自动与其连接。

最终设备的操作原理非常简单-控制器每10分钟尝试从服务器请求数据,如果成功,它将更新天气数据。有关当前温度的数据和提前3天的天气预报,请从openweathermap.org网站获取,有关阳台外部和内部的温度信息则从majordomo服务器获取。同时,相框每6秒请求一次图像,同时显示当前信息。由于两个过程可以同时发生,因此使用DMA来从ESP8266接收数据。

结果,在相框上显示了以下图像: 项目的源代码:github.com/iliasam/USB_Photoframe



Source: https://habr.com/ru/post/zh-CN384177/


All Articles