自从1897年首次发现阴极射线管以来,屏幕显示技术已经发展了多年,我们已经从等离子发展到LCD,随后是LED、OLED和最近的电子纸墨水屏,这就是我们今天要研究的内容。
电子纸显示屏(Electronic Paper)是一种创建用来模仿普通纸上墨水外观的显示设备。与其他类型的发光显示屏不同,电子纸显示器像普通纸一样反射光。这使电子纸显示器具有更宽的视角,确保它们消耗的功率更少,并且使它们看起来更容易,因为它具有与普通纸相同的感觉,而不会因看屏幕而产生眩光。该显示屏最酷的功能是即使未接通电源也能显示最后上传的文本或图形。这有助于节省大量电量,并且是部署了电子纸显示屏的大多数应用程序的关键功能。
由于上述独特功能,电子纸显示器的流行度正在上升(用于Amazon Kindle阅读器)。在本篇文章中,我们将研究如何在Arduino项目中使用电子纸墨水屏,以使项目具有更多的复杂性和观赏性。
电子纸显示屏的尺寸与其他类型的显示屏不同,在本文中,我们将使用微雪电子的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。根据您自己的显示屏的设置,您可能会需要使用面包板。
代码 和原理图一样,该项目的代码也同样容易。对于本文,我们将使用微雪电子提供的电子纸显示屏库。为了演示电子纸显示器的功能,我们将使用随库一起提供的演示代码。演示代码提供了在电子纸显示屏上显示图像和文本所需的命令。由于这种特殊的电子纸显示器的刷新率较低,因此无法用于显示动画,但是对于其他具有较高刷新率的电子纸显示屏来说,这可能是可行的。 首先包括将在代码中使用的库(在本例中为epd.h库),以实现与电子纸显示屏的轻松通信。 接下来是base_draw函数,该函数包含用于绘制从直线到矩形的不同形状的函数。 - void base_draw(void)
- {
- int i, j;
- /*
- draw pixel
- */
- epd_clear();
- for (j = 0; j < 600; j += 50)
- {
- for (i = 0; i < 800; i += 50)
- {
- epd_draw_pixel(i, j);
- epd_draw_pixel(i, j + 1);
- epd_draw_pixel(i + 1, j);
- epd_draw_pixel(i + 1, j + 1);
- }
- }
- epd_udpate();
- delay(3000);
- /*
- draw line
- */
- epd_clear();
- for (i = 0; i < 800; i += 100)
- {
- epd_draw_line(0, 0, i, 599);
- epd_draw_line(799, 0, i, 599);
- }
- epd_udpate();
- delay(3000);
- /*
- fill rect
- */
- epd_clear();
- epd_set_color(BLACK, WHITE);
- epd_fill_rect(10, 10, 100, 100);
- epd_set_color(DARK_GRAY, WHITE);
- epd_fill_rect(110, 10, 200, 100);
- epd_set_color(GRAY, WHITE);
- epd_fill_rect(210, 10, 300, 100);
- epd_udpate();
- delay(3000);
- /*
- draw circle
- */
- epd_set_color(BLACK, WHITE);
- epd_clear();
- for (i = 0; i < 300; i += 40)
- {
- epd_draw_circle(399, 299, i);
- }
- epd_udpate();
- delay(3000);
- /*
- fill circle
- */
- epd_clear();
- for (j = 0; j < 6; j++)
- {
- for (i = 0; i < 8; i++)
- {
- epd_fill_circle(50 + i * 100, 50 + j * 100, 50);
- }
- }
- epd_udpate();
- delay(3000);
- /*
- draw triangle
- */
- epd_clear();
- for (i = 1; i < 5; i++)
- {
- epd_draw_triangle(399, 249 - i * 50, 349 - i * 50, 349 + i * 50, 449 + i * 50, 349 + i * 50);
- }
- epd_udpate();
- delay(3000);
- }
复制代码下一个函数是draw text函数。 和base_draw()函数一样,此函数具有显示不同文本格式所需的全部内容。 - void draw_text_demo(void)
- {
- char buff[] = {'G', 'B', 'K', '3', '2', ':', ' ', 0xc4, 0xe3, 0xba, 0xc3, 0xca, 0xc0, 0xbd, 0xe7, 0};
- epd_set_color(BLACK, WHITE);
- epd_clear();
- epd_set_ch_font(GBK32);
- epd_set_en_font(ASCII32);
- epd_disp_string(buff, 0, 50);
- epd_disp_string("ASCII32: Hello, World!", 0, 300);
- epd_set_ch_font(GBK48);
- epd_set_en_font(ASCII48);
- buff[3] = '4';
- buff[4] = '8';
- epd_disp_string(buff, 0, 100);
- epd_disp_string("ASCII48: Hello, World!", 0, 350);
- epd_set_ch_font(GBK64);
- epd_set_en_font(ASCII64);
- buff[3] = '6';
- buff[4] = '4';
- epd_disp_string(buff, 0, 160);
- epd_disp_string("ASCII64: Hello, World!", 0, 450);
- epd_udpate();
- delay(3000);
- }
复制代码下一个函数是draw_bitmap函数。就像我们在该网站上使用的其他大多数显示屏一样,要在电子纸显示屏上显示图像,该图像必须为位图格式。 draw_bitmap函数包含用于在电子纸显示屏上显示图像的命令。 - void draw_bitmap_demo(void)
- {
- epd_clear();
- epd_disp_bitmap("PIC4.BMP", 0, 0);
- epd_udpate();
- delay(5000);
- epd_clear();
- epd_disp_bitmap("PIC2.BMP", 0, 100);
- epd_disp_bitmap("PIC3.BMP", 400, 100);
- epd_udpate();
- delay(5000);
- epd_clear();
- epd_disp_bitmap("PIC7.BMP", 0, 0);
- epd_udpate();
- }
复制代码
接下来是setup()函数。首先我们设置连接到Arduino引脚13的LED。该LED用作用户初始化LED,以确认Arduino与显示屏之间的通信。完成此操作后,我们将初始化显示屏,激活唤醒…,并设置我们希望显示屏使用的内存。显示屏可以使用板载NAND存储器或SD卡。 - void setup(void)
- {
- /*
- user led init
- */
- pinMode(led, OUTPUT);
- digitalWrite(led, LOW);
-
- epd_init();
- epd_wakeup();
- epd_set_memory(MEM_NAND);
- }
复制代码
void loop()函数执行的任务很简单。它所做的就是依次调用在上面创建的函数。 - void loop(void)
- {
- char flag = 0;
-
- base_draw();
- /*
- Draw text demo
- */
- draw_text_demo();
- /*
- Draw bitmap
- */
- draw_bitmap_demo();
- epd_enter_stopmode();
- while (1)
- {
- if(flag)
- {
- flag = 0;
- digitalWrite(led, LOW);
- }
- else
- {
- flag = 1;
- digitalWrite(led, HIGH);
- }
- delay(500);
- }
- }
复制代码
效果演示 在上载此项目的代码之前,请从Arduino的D0和D1引脚断开显示屏的Din和Dout引脚。 这是为了代码的顺利上传,因为那些特定的引脚也将由Arduino用于与计算机通信。 将代码上传到Arduino之后,将引脚重新连接回去,然后等待几秒钟。 您应该看到显示带有不同的图像和文本。
以上就是本篇文章的全部内容,您将用此显示屏制作什么很棒的东西呢,请随时在下面的回复部分中分享想法。 |