风筝
发表于: 2020-10-20 22:33:16 | 显示全部楼层

自从1897年首次发现阴极射线管以来,屏幕显示技术已经发展了多年,我们已经从等离子发展到LCD,随后是LED、OLED和最近的电子纸墨水屏,这就是我们今天要研究的内容。


电子纸显示屏(Electronic Paper)是一种创建用来模仿普通纸上墨水外观的显示设备。与其他类型的发光显示屏不同,电子纸显示器像普通纸一样反射光。这使电子纸显示器具有更宽的视角,确保它们消耗的功率更少,并且使它们看起来更容易,因为它具有与普通纸相同的感觉,而不会因看屏幕而产生眩光。该显示屏最酷的功能是即使未接通电源也能显示最后上传的文本或图形。这有助于节省大量电量,并且是部署了电子纸显示屏的大多数应用程序的关键功能。


由于上述独特功能,电子纸显示器的流行度正在上升(用于Amazon Kindle阅读器)。在本篇文章中,我们将研究如何在Arduino项目中使用电子纸墨水屏,以使项目具有更多的复杂性和观赏性。

e-paper-display.jpg

电子纸显示屏的尺寸与其他类型的显示屏不同,在本文中,我们将使用微雪电子的4.3寸电子纸墨水屏。下面列出了此显示屏的一些规格参数。

√    易于使用,可通过一个串行接口显示任何内容,包括几何图形、文本和图像

√    嵌入式字体库,支持32、48和64点阵GBK中文字体和英文字体

√    内置128MB NandFlash,允许将字体/图像数据存储在外部TF卡或内部NandFlash中

√    4级灰度显示,分辨率800×600

√    可调串行接口波特率,上电时默认为115200

√    从3.3V到5V供电,与3.3v / 5v逻辑电平兼容。

√    超低功耗,休眠电流低于5mA


我们此项目的主要目标是在电子纸显示屏上显示基本文本和图形,这样就能够满足您自己使用电子纸显示屏所需的功能。


所需的组件

●     Arduino Uno开发板

●     电子纸显示屏

●     跳线

●     面包板


原理图

电子纸显示屏通常使用UART协议与微控制器进行通信。显示屏有五个引脚,包括:VCC、GND、Din、DO和WAKE UP。

如下图所示,将显示屏连接到Arduino。根据您自己的显示屏的设置,您可能会需要使用面包板。

avs-device-type-info.png


代码

和原理图一样,该项目的代码也同样容易。对于本文,我们将使用微雪电子提供的电子纸显示屏库。为了演示电子纸显示器的功能,我们将使用随库一起提供的演示代码。演示代码提供了在电子纸显示屏上显示图像和文本所需的命令。由于这种特殊的电子纸显示器的刷新率较低,因此无法用于显示动画,但是对于其他具有较高刷新率的电子纸显示屏来说,这可能是可行的。

首先包括将在代码中使用的库(在本例中为epd.h库),以实现与电子纸显示屏的轻松通信。

  1. #include <epd.h>
复制代码

接下来是base_draw函数,该函数包含用于绘制从直线到矩形的不同形状的函数。

  1. void base_draw(void)
  2. {
  3.   int i, j;

  4.   /*
  5.   draw pixel
  6.   */
  7.   epd_clear();
  8.   for (j = 0; j < 600; j += 50)
  9.   {
  10.     for (i = 0; i < 800; i += 50)
  11.     {
  12.       epd_draw_pixel(i, j);
  13.       epd_draw_pixel(i, j + 1);
  14.       epd_draw_pixel(i + 1, j);
  15.       epd_draw_pixel(i + 1, j + 1);
  16.     }
  17.   }
  18.   epd_udpate();
  19.   delay(3000);

  20.   /*
  21.   draw line
  22.   */
  23.   epd_clear();
  24.   for (i = 0; i < 800; i += 100)
  25.   {
  26.     epd_draw_line(0, 0, i, 599);
  27.     epd_draw_line(799, 0, i, 599);
  28.   }
  29.   epd_udpate();
  30.   delay(3000);

  31.   /*
  32.   fill rect
  33.   */
  34.   epd_clear();
  35.   epd_set_color(BLACK, WHITE);
  36.   epd_fill_rect(10, 10, 100, 100);

  37.   epd_set_color(DARK_GRAY, WHITE);
  38.   epd_fill_rect(110, 10, 200, 100);

  39.   epd_set_color(GRAY, WHITE);
  40.   epd_fill_rect(210, 10, 300, 100);

  41.   epd_udpate();
  42.   delay(3000);

  43.   /*
  44.   draw circle
  45.   */
  46.   epd_set_color(BLACK, WHITE);
  47.   epd_clear();
  48.   for (i = 0; i < 300; i += 40)
  49.   {
  50.     epd_draw_circle(399, 299, i);
  51.   }
  52.   epd_udpate();
  53.   delay(3000);

  54.   /*
  55.   fill circle
  56.   */
  57.   epd_clear();
  58.   for (j = 0; j < 6; j++)
  59.   {
  60.     for (i = 0; i < 8; i++)
  61.     {
  62.       epd_fill_circle(50 + i * 100, 50 + j * 100, 50);
  63.     }
  64.   }
  65.   epd_udpate();
  66.   delay(3000);

  67.   /*
  68.   draw triangle
  69.   */
  70.   epd_clear();
  71.   for (i = 1; i < 5; i++)
  72.   {
  73.     epd_draw_triangle(399, 249 - i * 50, 349 - i * 50, 349 + i * 50, 449 + i * 50, 349 + i * 50);
  74.   }
  75.   epd_udpate();
  76.   delay(3000);
  77. }
复制代码

下一个函数是draw text函数。 和base_draw()函数一样,此函数具有显示不同文本格式所需的全部内容。

  1. void draw_text_demo(void)
  2. {
  3.   char buff[] = {'G', 'B', 'K', '3', '2', ':', ' ', 0xc4, 0xe3, 0xba, 0xc3, 0xca, 0xc0, 0xbd, 0xe7, 0};
  4.   epd_set_color(BLACK, WHITE);
  5.   epd_clear();
  6.   epd_set_ch_font(GBK32);
  7.   epd_set_en_font(ASCII32);
  8.   epd_disp_string(buff, 0, 50);
  9.   epd_disp_string("ASCII32: Hello, World!", 0, 300);

  10.   epd_set_ch_font(GBK48);
  11.   epd_set_en_font(ASCII48);
  12.   buff[3] = '4';
  13.   buff[4] = '8';
  14.   epd_disp_string(buff, 0, 100);
  15.   epd_disp_string("ASCII48: Hello, World!", 0, 350);

  16.   epd_set_ch_font(GBK64);
  17.   epd_set_en_font(ASCII64);
  18.   buff[3] = '6';
  19.   buff[4] = '4';
  20.   epd_disp_string(buff, 0, 160);
  21.   epd_disp_string("ASCII64: Hello, World!", 0, 450);


  22.   epd_udpate();
  23.   delay(3000);
  24. }
复制代码

下一个函数是draw_bitmap函数。就像我们在该网站上使用的其他大多数显示屏一样,​​要在电子纸显示屏上显示图像,该图像必须为位图格式。 draw_bitmap函数包含用于在电子纸显示屏上显示图像的命令。

  1. void draw_bitmap_demo(void)
  2. {
  3.   epd_clear();
  4.   epd_disp_bitmap("PIC4.BMP", 0, 0);
  5.   epd_udpate();
  6.   delay(5000);

  7.   epd_clear();
  8.   epd_disp_bitmap("PIC2.BMP", 0, 100);
  9.   epd_disp_bitmap("PIC3.BMP", 400, 100);
  10.   epd_udpate();
  11.   delay(5000);

  12.   epd_clear();
  13.   epd_disp_bitmap("PIC7.BMP", 0, 0);
  14.   epd_udpate();
  15. }
复制代码

接下来是setup()函数。首先我们设置连接到Arduino引脚13的LED。该LED用作用户初始化LED,以确认Arduino与显示屏之间的通信。完成此操作后,我们将初始化显示屏,激活唤醒…,并设置我们希望显示屏使用的内存。显示屏可以使用板载NAND存储器或SD卡。

  1. void setup(void)
  2. {
  3.   /*
  4.   user led init
  5.   */
  6.   pinMode(led, OUTPUT);
  7.   digitalWrite(led, LOW);
  8.   
  9.   epd_init();
  10.   epd_wakeup();
  11.   epd_set_memory(MEM_NAND);
  12. }
复制代码

void loop()函数执行的任务很简单。它所做的就是依次调用在上面创建的函数。

  1. void loop(void)
  2. {
  3.   char flag = 0;
  4.   
  5.   base_draw();

  6.   /*
  7.   Draw text demo
  8.   */
  9.   draw_text_demo();

  10.   /*
  11.   Draw bitmap
  12.   */
  13.   draw_bitmap_demo();

  14.   epd_enter_stopmode();
  15.   while (1)
  16.   {
  17.     if(flag)
  18.     {
  19.       flag = 0;
  20.       digitalWrite(led, LOW);
  21.     }
  22.     else
  23.     {
  24.       flag = 1;
  25.       digitalWrite(led, HIGH);
  26.     }
  27.     delay(500);
  28.   }
  29. }
复制代码

效果演示

在上载此项目的代码之前,请从Arduino的D0和D1引脚断开显示屏的Din和Dout引脚。 这是为了代码的顺利上传,因为那些特定的引脚也将由Arduino用于与计算机通信。 将代码上传到Arduino之后,将引脚重新连接回去,然后等待几秒钟。 您应该看到显示带有不同的图像和文本。

shirt-display.jpg


以上就是本篇文章的全部内容,您将用此显示屏制作什么很棒的东西呢,请随时在下面的回复部分中分享想法。

跳转到指定楼层
yefan
发表于: 2023-4-14 15:34:08 | 显示全部楼层

这有什么用呢,能显示存储卡中的文本或者说电子书吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 01:06 , Processed in 0.082991 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表