使用SPI Flash显示存储器存储图形资源或显示家庭气象站

本文旨在讨论根据项目需要使用板载闪存显示器的可能性。
对于谁来说,它是相关的或只是有趣的-欢迎在猫的下面。
整整一年,我在架子上放置了一个7英寸的显示屏,等待我的时间。为什么这么长时间?
是的,因为使用了3.2英寸的显示屏,通常效果很好。
但是,同时显示的信息量为3.2“根本不适合我。气象站的服务器部分从Internet接收到一周的天气预报,但是无法与传感器读数同时显示(预报)。因此,我为购买更大的屏幕感到困惑。最初,我看5英寸,但是参加了几次拍卖后,最终我以5英寸的价格买了7英寸,这让我非常高兴。购买的显示器配备了SSD1963控制器和64MB闪存。
当新的显示器仍在架子上积聚灰尘时,我提请注意图书馆互联网上存在的文档,这些文档允许使用内置的闪存满足我的需要。到目前为止,我想出了存储显示那里当前天气的图标的方法。在具有3.2英寸显示屏的先前版本中,图标存储在显示模块读卡器中插入的SD卡中。
我想马上指出,将资源文件加载到显示内存中的过程并不简单方便,因此我决定写一篇简短的说明文章。因此,让我们开始吧:
开始摆档这些链接:SpiFlash的产品UTFT_SPIflash和库目录扩展文件。
载荷包括几个步骤:
1.预先准备我们要在您的项目中使用的一组图标或其他图形资源。
2.在SPIflash \ tools \ FlashUploader文件夹中,是FlashUploader工具和良好的文档。从理论上讲,此工具旨在将资源加载到Flash显示器中,但实际上,由于与控制器之间的软件通信问题,无法做到这一点,因此此过程有所延长。
使用FlashUploader,我们准备一个SFD文件,其中包含一组准备好的图像或其他资源。
要准备和保存资源文件,不需要连接FlashUploader和显示器,但是,如果仍然要这样做,则需要在SPIflash \ examples \ Arduino(AVR)\ SPIflash_FlashUploader文件夹中的与显示器相连的Arduino中加载一个特殊的草图。 。添加完所有图标并保存sfd文件后,请不要忘记使用“生成目录”按钮创建带有附加内容描述的文件。将来,我们将使用带有说明的文件作为参考来搜索所需图标的编号。
FlashUploader屏幕截图

3.将生成的SFD文件写入SD卡,然后将其插入到显示卡读取器中。
4.将显示器连接到Arduino,并从文件夹SPIflash \ examples \ Arduino(AVR)加载草图SPIflash_Restore。
5.我们开始将SD内容恢复到显示器的闪存的过程。
成功上传后的串行监视器屏幕截图

这样就完成了启动过程。
在项目中,您需要通过SFD文件中的ID访问所需的资源(图片)。
一个小的测试草图,用于在显示屏上显示所有图标(本例中为44个)
#include <SPI.h>
#include <UTFT.h>
#include <SPIflash.h>
#include <UTFT_SPIflash.h>
//////      ////////
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
///////////////////////////////////
//  
UTFT myGLCD (CTE70, 38, 39, 40, 41);
// myFlash(<SS>); (if using the hardware SPI pins. See the manual for other configurations.)
SPIflash      myFlash(45);
UTFT_SPIflash myFiles(&myGLCD, &myFlash);
//////////////////////////////////////////////////
void setup() {
  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.setBright(7);
  myGLCD.setFont(BigFont);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.clrScr();
  myFlash.begin();
  if (myFlash.ID_device == 0)
  {
    myGLCD.print(F("Unknown flash device!"), 10, 10);
    while (true) {};
  }
  TestIcon2Display(10, 10);
}

void TestIcon2Display(int x, int y)
{
  for (int i = 0; i < 44; i++)
  {
      Serial.println(i);
    myFiles.loadBitmap(i, x, y);
    x = x + 150;
    if (x > 800 - 150)
    {
      x = 10;
      y = y + 110;
    }
    if (y > 480 - 110) y = 10;
    delay(700);
  }
}

void loop() {
}

好了,最后
气象站显示处于工作状态

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


All Articles