PlatformIO中ESP8266使用GxEPD库和U8G2库驱动 2.9寸黑白墨水屏显示中文

Content

  • 0. 前言
  • 1. 安装platformIO环境
  • 2. 新建工程
  • 3. 添加外部库
  • 4. 修改U8g2_for_Adafruit_GFX库
  • 5. 代码和烧录

0. 前言

墨水屏是黄鱼淘的,效果还不错。

U8G2库一直编译不进去,显示汉字始终不太美观,个人一直不太喜欢汉字取模的方法,过于累赘且不美观,所以探索了以下优化办法。

开发环境:vscode PlatformIO 框架
操作系统:Windows10 专业版
开发板:ESP8266

1. 安装platformIO环境

参考以下博客安装platformIO插件:
platformIO环境安装

如果新建工程速度慢或下载速度慢,使用以下方法来加速:
解决PlatformIO下载速度慢

2. 新建工程

点击新建工程:
在这里插入图片描述
工程名可以随便起,但是芯片和框架一定要选对:

ESP-12E和ESP-12F都是选相同的ESP-12E,都是同样的4M内存,但布线方式不同,ESP-12F在ESP-12E的基础上重新布线,目的是为了增强信号。
在这里插入图片描述

如果这一步一直转圈圈,这是下载编译工具链慢导致,尝试参考以下文章解决:
解决PlatformIO下载速度慢

在这里插入图片描述

新建完工程的目录结构如下图所示:
在这里插入图片描述
其中:

  • .vscode:文件夹存放vscode配置文件,不必过多理会。
  • .pio:通过platformIO下载的库会放入此文件夹中 /芯片 目录中,我的芯片选择是 esp12e,所以我添加的库会存放至 ./pio/esp12e 中,有些如 lvgl 的库是需要做编译设置的,需要时在这边查看。
  • src:存放main.cpp,这是我们主要编写代码的地方。
  • include:技术拙劣,目前没用到还不清楚
  • lib:存放我们自己编写的库,需要放进去并且在用到的地方声明。
  • platformio.ini:这是一个很重要的配置文件,我们添加库和修改编译项目需要在这个地方修改。

3. 添加外部库

现在工程已经新建完成,接下来添加库。

懒人方法:

注释原来的全部内容,加上我的内容

[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino
lib_deps = 
	olikraus/U8g2_for_Adafruit_GFX@^1.8.0
	zinggjm/GxEPD2@^1.5.4

在这里插入图片描述
按下Ctrl + S 即可开始下载第三方库,其中下载的库为 GxEPDU8g2_for_Adafruit_GFX

正常方法:

正常来说应该要学会自己如何添加自己需要的库:
在这里插入图片描述
点进GxEPD注意!!! 不要点错为 GxEPD2,二者有差别。
GxEPD2 貌似并不支持ssd1608,所以理论上不能直接选,需要在配置文件中找能替换的IC,目前找不到,先不考虑。

接下来添加进工程:

在这里插入图片描述

选择工程
在这里插入图片描述

等待即可。

U8g2_for_Adafruit_GFX库也是这样操作,将其添加进去。

4. 修改U8g2_for_Adafruit_GFX库

如果不修改库内容,后续会引发错误,导致内存过大无法编译通过。

所以这里使用 甘草酸不酸 修改过的库,感谢开源者做出的贡献:
甘草酸不酸-U8G2-gitee

将这个文件下载下来并且解压:
在这里插入图片描述

复制解压出来的库:

在这里插入图片描述

在这里插入图片描述

进入 .pio\libdeps\esp12e ,粘贴:
在这里插入图片描述
然后库的修改就做好了。

如果你动手能力很强不怕出错,你可以尝试不用别人修改的库:
在.pio\libdeps\esp12e\U8g2_for_Adafruit_GFX\src\u8g2_fonts.h添加

#if defined(ESP8266)
#define U8X8_FONT_SECTION(name) attribute((section(".text." name)))
#endif

\.pio\libdeps\esp12e\U8g2_for_Adafruit_GFX\src\U8g2_for_Adafruit_GFX.cpp添加

#if defined(ESP8266)
uint8_t u8x8_pgm_read_esp(const uint8_t * addr)
{
	uint32_t bytes;
	bytes = (uint32_t)((uint32_t)addr & ~3);
	return ((uint8_t*)&bytes)[(uint32_t)addr & 3];
}
#endif

5. 代码和烧录

现在开始在main.cpp中编程,在第二、第三行中修改你的墨水屏文件:

#include <GxEPD.h>
#include <GxGDEW029T5/BitmapExamples.h>      // 2.9" b/w IL0373
#include <GxGDEW029T5/GxGDEW029T5.h>      // 2.9" b/w IL0373

// FreeFonts from Adafruit_GFX
#include <Fonts/FreeMonoBold9pt7b.h>
#include <Fonts/FreeMonoBold12pt7b.h>
#include <Fonts/FreeMonoBold18pt7b.h>
#include <Fonts/FreeMonoBold24pt7b.h>

#include <GxIO/GxIO_SPI/GxIO_SPI.h>
#include <GxIO/GxIO.h>

#include <U8g2_for_Adafruit_GFX.h>

#if defined(ESP8266)
GxIO_Class io(SPI, /*CS=D8*/ SS, /*DC=D2*/ 4, /*RST=D4*/ 2); 
GxEPD_Class display(io, /*RST=D4*/ 2, /*BUSY=D1*/ 5); 

#endif

U8G2_FOR_ADAFRUIT_GFX u8g2Fonts; //初始化 U8G2 对象

void fun();

void setup()
{
  display.init(115200); // enable diagnostic output on Serial
  display.setRotation(3);

  u8g2Fonts.begin(display);                        // 将u8g2过程连接到Adafruit GFX
  //u8g2Fonts.setFontMode(1);                        // 使用u8g2透明模式(这是默认设置)
  u8g2Fonts.setFontDirection(0);      
  u8g2Fonts.setForegroundColor(GxEPD_BLACK);             // 设置前景色
  u8g2Fonts.setBackgroundColor(GxEPD_WHITE);             // 设置背景色
  //u8g2Fonts.setFont(chinese_gb2312);

  display.setTextColor(GxEPD_BLACK);
  u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312a); // select u8g2 font from here: https://github.com/olikraus/u8g2/wiki/fntlistall
}

void loop()
{
  display.drawPaged(fun);
  delay(5000);
}

void fun()
{
  const char* name = "FreeMonoBold9pt7b";
  const GFXfont* f = &FreeMonoBold9pt7b;
  display.fillScreen(GxEPD_WHITE);
  display.setTextColor(GxEPD_BLACK);
  display.setFont(f);//设置字体
  display.setCursor(0, 0);//设置游标

  u8g2Fonts.setCursor(0, 128/2);
  u8g2Fonts.println("人不能同时拥有青春和对青春的感受.");
}

编译并烧录后,是这样的结果:

黄色是警告,暂时忽略
在这里插入图片描述

这是资源使用情况,非常的清晰直观,还剩下很多可以供我们操作:
在这里插入图片描述

烧录进去后,是这个效果:
在这里插入图片描述

测试后一行可以显示 18个汉字+1个标点符号,共八行,标点建议使用英文标点,如中文逗号无法显示,但中文句号可以显示并且还不错。

人不能同时拥有青春和对青春的感受,且行且珍惜!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/326080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节、字符与字符编码的区别与联系

字节、字符与字符编码的区别与联系 字节 位(bit)是计算机中信息的最小单元。位是由电路实现的&#xff0c;硬件底层使用数字电路&#xff0c;以电压的高低作为记录信息的方式&#xff1a;较高的电压表示数值“1”&#xff0c;较低的电压表示数字“0”。因此&#xff0c;一个位…

微信预约挂号系统源码,公众服务号(小程序)预约挂号,适用于各级公立和民营医院,用来搭建互联网医院平台,可对接院内his、lis、pacs系统

掌上智慧医院、公众服务号&#xff08;小程序&#xff09;预约挂号、互联网平台源码 系统介绍 “移动智慧医院”平台既可以让患者足不出户就可以利用微信进行在线挂号&#xff0c;实现分时段就诊&#xff0c;就诊后也可以直接使用手机微信缴费&#xff0c;还可以通过微信实现查…

NFS网络共享存储服务技术攻略

目录 一.NFS 1.定义 2.特点 3.原理 二.服务端NFS配置文件 1.主配置文件 2.文件格式 3.相关命令 三.实验&#xff1a;NFS共享存储服务配置 1.服务端安装nfs-utils和rpcbind软件包 2.服务端新建共享目录给权限 3.服务端修改配置文件/etc/exports 4.服务端关闭防火墙…

FlinkAPI开发之水位线(Watermark)

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 Flink中的时间语义 哪种时间语义更重要 从《星球大战》说起 数据处理系统中的时间语义 在实际应用中&#xff0c…

CC工具箱使用指南:【获取所有字段信息】

一、简介 这个工具的目的简单易懂&#xff0c;就是获取选定要素图层的所有字段信息。 本身不对要素图层作任何处理&#xff0c;只是一个查看属性的工具。 问我要用在什么地方&#xff0c;我也不知道-_- 二、工具参数介绍 点击【信息获取】组里的【获取所有字段信息】工具&a…

解决flask中jinja2插值变量变成字符串的办法

今天在通过使用{{ variable_name }}这种方式插入html内容时&#xff0c;发现变量内容到了页面中全部变成了字符串&#xff0c; python代码&#xff1a; return render_template(FilePath.file_path_to_page,md_contenthtml_content # 返回html内容 )html代码中插入&#xff1…

【运维杂谈】为什么docker镜像推送至harbor上就变小了?

为什么docker镜像推送至harbor上就变小了&#xff1f;我们以一个游戏镜像为例&#xff0c;在Linux显示295MB。 [rootWorker232 ~]# docker images | grep v0.6 harbor.koten.com/koten-games/games v0.6 30ec3e6e4747 25 hours ago 295MB […

C# Cad2016二次开发HelloWorld(一)

1 新建类库 二 引用 acdbmgd.dll、acmgd.dll、accoremgd.dll 三 HelloWorld代码 public class Class1{/// <summary>/// 程序入口标识/// </summary>[CommandMethod("HelloWorld")]public void HelloWorld(){Document adoc Autodesk.AutoCAD.Applicatio…

presto 支持regexp_count

一、背景 1、查询regexp_count 函数提示未注册 用户想正则查询特定字符出现次数 function regexp_count not registered 二、调研 1、官网地址&#xff1a; Presto Documentation — Presto 0.284 Documentation 2、regexp_extract_all Regular Expression Functions —…

如何为 SEO 进行关键字研究

什么是关键词研究&#xff1f; 关键字研究是查找和分析理想网站访问者输入搜索引擎的关键字的过程。这使您能够在内容策略中定位最有效的关键字。 关键字是人们用来在搜索引擎中查找信息或产品的单词或短语。例如&#xff0c;如果您想为您的小狗购买食物&#xff0c;您可以在…

最简单爱心的解析

首先你需要了解爱心代码在直角坐标系的方程 数学知识&#xff1a;x 属于 -1.5 ~ 1.5 y 属于 -1 ~ 1.5 和 高中所学的线性规划 请看代码 #include <math.h> #include <stdlib.h> #include <Windows.h> #include <stdio.h> int main() { …

迅软科技丨IT企业如何应对数据泄密危机?

随着信息技术的快速发展&#xff0c;软件IT行业面临着前所未有的数据安全挑战。黑客攻击、病毒传播、内部泄密等安全威胁层出不穷&#xff0c;给企业的核心资产和运营带来严重威胁。同时&#xff0c;国家对于数据安全的法律法规也日益严格&#xff0c;要求企业必须采取更加有效…

【转载】MyBatisCodeHelperPro最新版使用教程

在开发中编写生成bean&#xff0c;mapper&#xff0c;mapper.xml费时也费力&#xff0c;可以通过MyBatisCodeHelper-Pro自动生成bean&#xff0c;dao&#xff0c;mapper.xml等文件。 MyBatisCodeHelper-Pro是IDEA下的一个插件&#xff0c;类似于mybatis plugin&#xff0c;但可…

iPhone是国内最畅销的智能手机

据调研机构BCI发布最新数据显示&#xff0c;去年中国一共卖出2.7亿部智能手机&#xff0c;其中&#xff0c;苹果的iPhone系列是国内最畅销的机型。 其中&#xff0c;苹果以17.1%的市场份额占据了第一&#xff0c;而vivo手机和OPPO则以16.7%和16%紧随其后&#xff0c;接着是荣耀…

【C#】面向对象的三大特性,还记得吗,简单代码举例回顾

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

论文阅读 Vision Transformer - VIT

文章目录 1 摘要1.1 核心 2 模型架构2.1 概览2.2 对应CV的特定修改和相关理解 3 代码4 总结 1 摘要 1.1 核心 通过将图像切成patch线形层编码成token特征编码的方法&#xff0c;用transformer的encoder来做图像分类 2 模型架构 2.1 概览 2.2 对应CV的特定修改和相关理解 解…

程序员应该学习的 10 件事

程序员应该学习的 10 件事&#xff08;省流版&#xff09; 翻译&#xff1a;10 Things Software Developers Should Learn about Learning 原文&#xff1a;https://cacm.acm.org/magazines/2024/1/278891-10-things-software-developers-should-learn-about-learning/fulltex…

【教学类-43-21】完结篇 16宫格(4*4可算全部数字)

作品展示&#xff1a; 16宫格里面的4*4小格子可以凑满1-16&#xff0c;旁边的7宫格格2份 背景需求&#xff1a; 做完了1-20宫格的A4模板&#xff0c;最后做一个16宫格小格子&#xff08;附加7宫格2套&#xff09;的样式&#xff0c;只有4宫格&#xff08;2*2&#xff09;、9宫…

vue3二次封装element-ui中的table组件

为什么要做这件事 借助封装table组件的过程来巩固一下vue3相关知识点。 组件有哪些配置项 options:表格的配置项data: 表格数据源elementLoadingText&#xff1a;加载文案elementLoadingSpinner&#xff1a;加载图标elementLoadingBackground&#xff1a;背景遮罩的颜色elem…

【RabbitMQ】RabbitMQ高级:死信队列和延迟队列

目录 设置TTL&#xff08;过期时间&#xff09;概述RabbitMQ使用TTL原生API案例springboot案例 死信队列概述原生API案例springboot案例 延迟队列概述插件实现延迟队列安装插件代码 TTL实现延迟队列实现延迟队列优化 设置TTL&#xff08;过期时间&#xff09; 概述 在电商平台…