Arduino框架下ESP32/ESP8266+合宙1.54“ 电子墨水屏(e-paper)驱动显示示例

Arduino框架下ESP32/ESP8266+合宙1.54" 电子墨水屏(e-paper)驱动显示示例


  • 🌼显示效果展示;
    在这里插入图片描述
    在这里插入图片描述

📓合宙1.54" 电子墨水屏

  • 有关合宙1.54"电子墨水屏的介绍资料:https://wiki.luatos.com/peripherals/eink_1.54/hardware.html
合宙给出的驱动示例有2个,不过都是基于Lua语言的示例程序代码,对于Arduino框架下的驱动显示只能另外找资料,目前有关电子墨水屏资料可以找到的只有两个地点:
  • GooDisplay https://www.good-display.cn/product/92/
  • waveshare(微雪) https://www.waveshare.net/wiki/1.54inch_e-Paper_Module
    在官方所提供的资料当中并未看到我想要的esp32的驱动示例代码,本以为修改一下引脚定义即可现实驱动。实际上是不行的,编译这一关都过不了。只能另辟蹊径了。

在GitHub上找到一个贡献者提供了一个有关waveshare1.54"给ESP32esp8266显示的项目。

  • GitHub:https://github.com/Bodmer,项目仓库位置:https://github.com/Bodmer/EPD_Libraries

  • 驱动demo位置:
    在这里插入图片描述

直接编译还不行,会报找不到头文件,需要将epdlin54目录下方的文件拷贝到项目文件夹下面:
在这里插入图片描述
在这里插入图片描述

🔨修改引脚定义

  • 🔧epdif.h文件内找到有关引脚定义的地方,ESP32如下修改:
//      Display       GPIO   ESP32 pin
#define BUSY_PIN        25 // D1
#define RST_PIN         26 // D2
#define DC_PIN          27 // D3
#define CS_PIN         15 // D4
  • 🌿ESP82666默认无需修改:
// Pin definition for ESP8266 (e.g. NodeMCU)
// Connect display CLK signal to GPIO 14 (Node MCU pin D5)
// Connect display DIN signal to GPIO 13 (Node MCU pin D7)
// Connect display 3.3V to NodeMCU 3V3
// Connect display GND to NodeMCU GND
#define BUSY_PIN        5 // D1
#define RST_PIN         4 // D2
#define DC_PIN          0 // D3
#define CS_PIN          2 // D4

📗接线说明

  • 🌿针对ESP32接线说明:
 ESP32引脚定义:
BUSY -> 25 || RES -> 26 || DC -> 27 || CS -> 15 || SCL -> 18 || SDA -> 23 ||
epd1in54 demo
SCL_PIN--18   
MOSI(SDA)_PIN--23
CS_PIN--15
RST(RES)_PIN-- 26
DC_PIN--27
BUSY_PIN--25
  • 🌿针对ESP8266接线说明,参考上面的宏定义内容接线即可。

⛳注意事项

  • 📢(补充说明)屏幕内容刷新时,如果全刷转局刷,或局刷转全刷前,需要调用SPI.endTransaction();断开当前的SPI通讯一下,否则会再下一个初始化过程中进入无尽的等待中。

📝主程序代码

/**
 *  @filename   :   epd1in54-demo.ino
 *  @brief      :   1.54inch e-paper display demo
 *  @author     :   Yehui from Waveshare
 *
 *  Copyright (C) Waveshare     September 5 2017
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documnetation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to  whom the Software is
 * furished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * ESP32引脚定义:
 * BUSY -> 25 || RES -> 26 || DC -> 27 || CS -> 15 || SCL -> 18 || SDA -> 23 ||
 *
 */

#include <SPI.h>
#include "epd1in54.h"
#include "epdpaint.h"
#include "imagedata.h"

#define COLORED     0
#define UNCOLORED   1

/**
  * Due to RAM not enough in Arduino UNO, a frame buffer is not allowed.
  * In this case, a smaller image buffer is allocated and you have to 
  * update a partial display several times.
  * 1 byte = 8 pixels, therefore you have to set 8*N pixels at a time.
  */
unsigned char image[1024];
Paint paint(image, 0, 0);    // width should be the multiple of 8 
Epd epd;
unsigned long time_start_ms;
unsigned long time_now_s;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  if (epd.Init(lut_full_update) != 0) {
      Serial.print("e-Paper init failed");
      return;
  }

  /** 
   *  there are 2 memory areas embedded in the e-paper display
   *  and once the display is refreshed, the memory area will be auto-toggled,
   *  i.e. the next action of SetFrameMemory will set the other memory area
   *  therefore you have to clear the frame memory twice.
   */
  epd.ClearFrameMemory(0xFF);   // bit set = white, bit reset = black
  epd.DisplayFrame();
  epd.ClearFrameMemory(0xff);   // bit set = white, bit reset = black
  epd.DisplayFrame();

  paint.SetRotate(ROTATE_0);//指定显示区域
  paint.SetWidth(200);
  paint.SetHeight(28);

  /* For simplicity, the arguments are explicit numerical coordinates */
  paint.Clear(COLORED);
  paint.DrawStringAt(30, 2, "Perseverance", &Font16, UNCOLORED);//位置,内容
  epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight());
  
  paint.Clear(UNCOLORED);//白色区域内容显示
  paint.DrawStringAt(30, 2, "e-Paper Demo", &Font16, COLORED);
  epd.SetFrameMemory(paint.GetImage(), 0, 16, paint.GetWidth(), paint.GetHeight());

    paint.Clear(COLORED);
  paint.DrawStringAt(20, 2, "Hello world!", &Font16, UNCOLORED);//位置,内容
  epd.SetFrameMemory(paint.GetImage(), 0, 32, paint.GetWidth(), paint.GetHeight());

  paint.SetWidth(64);//指定显示区域
  paint.SetHeight(64);
  
  paint.Clear(UNCOLORED);
  paint.DrawRectangle(0, 0, 40, 50, COLORED);//绘制矩形
  paint.DrawLine(0, 0, 40, 50, COLORED);//绘制线条
  paint.DrawLine(40, 0, 0, 50, COLORED);
  epd.SetFrameMemory(paint.GetImage(), 16, 60, paint.GetWidth(), paint.GetHeight());//显示位置

  paint.Clear(UNCOLORED);
  paint.DrawCircle(32, 32, 30, COLORED);//绘制圆
  epd.SetFrameMemory(paint.GetImage(), 120, 60, paint.GetWidth(), paint.GetHeight());//显示位置

  paint.Clear(UNCOLORED);
  paint.DrawFilledRectangle(0, 0, 40, 50, COLORED);//填充矩形
  epd.SetFrameMemory(paint.GetImage(), 16, 130, paint.GetWidth(), paint.GetHeight());//显示位置

  paint.Clear(UNCOLORED);
  paint.DrawFilledCircle(32, 32, 30, COLORED);//填充圆
  epd.SetFrameMemory(paint.GetImage(), 120, 130, paint.GetWidth(), paint.GetHeight());//显示位置
  epd.DisplayFrame();//显示内容
  epd.Sleep();
SPI.endTransaction();
  delay(6000);

  if (epd.Init(lut_partial_update) != 0) {
      Serial.print("e-Paper init failed");
      return;
  }

  /** 
   *  there are 2 memory areas embedded in the e-paper display
   *  and once the display is refreshed, the memory area will be auto-toggled,
   *  i.e. the next action of SetFrameMemory will set the other memory area
   *  therefore you have to set the frame memory and refresh the display twice.
   */
  epd.SetFrameMemory(IMAGE_DATA);
  epd.DisplayFrame();
  epd.SetFrameMemory(IMAGE_DATA);
  epd.DisplayFrame();

  time_start_ms = millis();
}

void loop() {
  // put your main code here, to run repeatedly:
  time_now_s = (millis() - time_start_ms) / 1000;
  char time_string[] = {'0', '0', ':', '0', '0', '\0'};
  time_string[0] = time_now_s / 60 / 10 + '0';
  time_string[1] = time_now_s / 60 % 10 + '0';
  time_string[3] = time_now_s % 60 / 10 + '0';
  time_string[4] = time_now_s % 60 % 10 + '0';

  paint.SetWidth(32);
  paint.SetHeight(96);
  paint.SetRotate(ROTATE_270);

  paint.Clear(UNCOLORED);
  paint.DrawStringAt(0, 4, time_string, &Font24, COLORED);
  epd.SetFrameMemory(paint.GetImage(), 80, 72, paint.GetWidth(), paint.GetHeight());
  epd.DisplayFrame();

  delay(500);
}

📚驱动示例源码

  • 🌿针对已修改的ESP32驱动代码:

链接:https://pan.baidu.com/s/1mCCXOVrYkKJfQXeAonkz7Q 
提取码:55dh
  • 🌿针对ESP8266驱动代码:

链接:https://pan.baidu.com/s/15NLx8uFa8c0bbkbHmDLXkA?pwd=3bpa 
提取码:3bpa
  • 11
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值