Micropython oled中文显示 基于esp32,esp8266

前言:

参考资料:

  1. 整个好活:micropython utf-8转gb2312_micropython中文转gb2312-CSDN博客
  2. python实现汉字点阵显示_python生成汉字点阵-CSDN博客​​​​​

不知道大家在刚买回esp32开发板,和一个0.96寸的oled显示屏的时候有没有想要显示一些文字但却遇到一个致命的问题,就是官方提供的oled驱动不支持中文。这也使得我们很头疼,为此就出现了这篇文章。(虽然网上已经有大佬开发出来了,当是我觉得不够轻量,所以决定自己开发一个)

想要开发能够中文显示的 oled 屏,那就必须解决如何让文字显示在oled上(废话)

思路

首先我的大概思路是这样的:

  1. 生成中文的点阵图,让后将生成的文字数据在oled上显示
  2. 查找资料,看看有什么办法可以让oled的指定位置的像素亮起来

生成点阵图

那么我就开始解决第一个问题了,就是生成点阵图。这第一个问题就很好解决,因为网上有很多资料,但是有一个问题,那就是需要多个字的时候就很麻烦了。具体问题就不在这里讲述了,感兴趣的可以自己百度一下,应该是很好找的。

想要生成大量文字的点阵图,那就必须要一个字库。但是在找了许多文章后仍然无果,于是我就换个思路,先在python上实现然后再想办将它在oled上显示。

于是我就又开始了一顿凶猛的查找,终于早到了这篇文章python实现汉字点阵显示_python生成汉字点阵-CSDN博客

能够在终端上显示点阵字

37ce8e888aaa4eb19f1f98ac7268d360.png

嗯,是我想要的结果。于是我就开始读他的代码,然后尝试在mircopython的终端运行一下,不出意外的就出意外了,mircopython不支持gb2312的编码。那么该内容就无法在mircopython上显示了。

然后我就又开始了我的查找大法,功夫不负有心人,又让我找到了解决方法(嘴角疯狂上扬)

那就是这个 ​​​​​​整个好活:micropython utf-8转gb2312_micropython中文转gb2312-CSDN博客​​​​https://blog.csdn.net/jd3096/article/details/130257320

而且这个大佬都封装好了,那么就开箱即食吧(滑稽)

最终成功的在mircopython的终端上显示出来了(因为例子已经被删掉了,我本人也懒,所以就没有

图片展示了),那么我们就直接开始下一步吧

显示

37ce8e888aaa4eb19f1f98ac7268d360.png

首先我们先观察上面的图片发现,只要将 0 给在oled上显示出来就行了,所以我们开始的第二步

显示文字在oled上,经过我的查找发现了mircopython中有个库可以处理

framebuf库

具体的的使用方法可以看这个链接,现在懒得介绍了(不错,我就是懒)(滑稽)

https://docs.singtown.com/micropython/zh/latest/openmvcam/library/framebuf.html

然后emmm...,问题就这么解决了

实现效果如图

00ab2fb25228421da18bea756b4f822a.jpeg

代码如下,这个是实现的库已经封装好了,可以即食

import binascii
import gb2312
import framebuf
from machine import Pin, I2C
import ssd1306

class OLEDController:
    def __init__(self, scl_pin=22, sda_pin=21, font_size=2):
        self.scl_pin = scl_pin
        self.sda_pin = sda_pin
        self.font_size = font_size  # 添加字体大小变量
        self.i2c = I2C(0, scl=Pin(self.scl_pin), sda=Pin(self.sda_pin))
        self.oled = ssd1306.SSD1306_I2C(128, 64, self.i2c)
        self.buf = bytearray(128 * 64 // 8)
        self.fb = framebuf.FrameBuffer(self.buf, 128, 64, framebuf.MONO_HLSB)
        self.KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]
        self.rect_list = [[] for _ in range(16)]
        self.font_file = "HZK16"

    def display_char(self, char, x, y):
        try:
            self.display_chinese(char, x, y)
        except:
            self.fb.text(char, x, y)

        self.oled.blit(self.fb, 0, 0)
        self.oled.show()

    def display_chinese(self, char, x, y):
        self.rect_list = [[] for _ in range(16)]

        get_gb2312 = gb2312.fontbyte.strs(char)
        hex_str = binascii.hexlify(get_gb2312).decode('utf-8')
        area = eval('0x' + hex_str[:2]) - 0xA0
        index = eval('0x' + hex_str[2:]) - 0xA0
        offset = (94 * (area-1) + (index-1)) * 32

        font_rect = None
        with open(self.font_file, "rb") as f:
            f.seek(offset)
            font_rect = f.read(32)

        for k in range(len(font_rect) // 2):
            row_list = self.rect_list[k]
            for j in range(2):
                for i in range(8):
                    asc = font_rect[k * 2 + j]
                    flag = asc & self.KEYS[i]
                    row_list.append(flag)

        # 计算新的字体大小
        new_font_size = self.font_size // 2
        for row in range(len(self.rect_list)):
            for col in range(len(self.rect_list[0])):
                if self.rect_list[row][col]:
                    self.fb.fill_rect(x + col * new_font_size, y + row * new_font_size, new_font_size, new_font_size, 1)

    def display_chinese_on_oled(self, text, x=0, y=0):
        for index, char in enumerate(text):
            self.display_char(char, x + index * self.font_size*8, y)


# 创建 OLED 控制器实例
oled_controller = OLEDController()

# 调用示例
#oled_controller.display_chinese_on_oled("你好世界word", 0, 0)

gb2312源码如下:

class gb2312(object):
    def __init__(self):
        self.f = open('utf2gb2312.bin', 'r', encoding='utf-8')

    def b2i(self, byte):  # bytes转int
        r = 0
        for i in range(len(byte)):
            r = (r << 8) + byte[i]
        return r

    def i2b(self, num):  # int转bytes
        num = int(num, 16)
        return num.to_bytes(2, 'big')

    def one_char(self, char):  # 将一个字符转化成gb2312
        utf_byte = char.encode('utf-8')
        r = self.B_S(0, 7296, self.b2i(utf_byte))
        gb2312_byte = self.i2b(r)
        # print(gb2312_byte)
        return gb2312_byte

    def strs(self, st):  # 将字符串转化成gb2312
        r = b''
        for s in st:
            # print(s.encode('utf-8'))
            if len(s.encode('utf-8')) <= 1:
                r += s.encode('utf-8')
            else:
                r += self.one_char(s)
        return r

    def B_S(self, low, high, m):  # 二分查找
        if 0 <= low <= high <= 7296:
            mid = (low + high) // 2
            self.f.seek(mid * 12)
            data = self.f.read(12)
            utf = data[0:6]
            if int(utf, 16) < m:
                return self.B_S(mid + 1, high, m)
            elif int(utf, 16) > m:
                return self.B_S(low, mid - 1, m)
            else:
                return data[7:-1]

    def __del__(self):
        self.f.close()
        
fontbyte = gb2312()
# r = fontbyte.strs('你')
# print(r)
        



食用方法如下:

import input_chinese
oled_controller = input_chinese.OLEDController() #创建示例
oled_controller.display_chinese_on_oled("你好世界!",0,0)#后面的为位置

结语

代码文件已发到github上了,记得点个star(上面的代码并没有给全,建议在下面链接看完整代码)

GitHub - cjz-wr/mircopython_oled_display

其它资料:


https://github.com/kaixindelele/ssd1306-MicroPython-ESP32-Chinese/

https://github.com/funnygeeker/micropython-easydisplay

  • 49
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值