• Arduino框架下ESP32+合宙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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 🌿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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    📗接线说明

    • 🌿针对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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 🌿针对ESP8266接线说明,参考上面的宏定义内容接线即可。

    📝主程序代码

    /**
     *  @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 
    #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();//显示内容
    
      delay(2000);
    
      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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141

    📚驱动示例源码

    • 🌿针对已修改的ESP32驱动代码:
    链接:https://pan.baidu.com/s/1mCCXOVrYkKJfQXeAonkz7Q 
    提取码:55dh
    
    • 1
    • 2
    • 🌿针对ESP8266驱动代码:
    链接:https://pan.baidu.com/s/1ODbJHVzT7i2fVYRhcVDyDg 
    提取码:qqbr
    
    • 1
    • 2
  • 相关阅读:
    基于K8S单节点部署你的第一个K8S应用
    Linux使用grep查找文件内容
    GFS分布式文件系统
    使用 Ring Buffer 完成数据传递
    传智教育研究院重磅发布Java学科新研发《智慧养老》项目
    3分钟让你学会axios在vue项目中的基本用法(建议收藏)
    linux创建ftp账号
    【C++】list容器介绍及使用
    山东大学人工智能导论实验四 利用神经网络分类红色和蓝色的花
    qt源码解析1--事件循环原理(重写事件函数,事件过滤器等)
  • 原文地址:https://blog.csdn.net/weixin_42880082/article/details/126478662