ESP8266入门 - 移植游戏:星球大战【1】
屏幕接线:
四针脚的屏幕很简单:
oled - ESP8266
GND - GND
VCC - 3V3
SCL - D2
SDA - D1
前期准备完成了。我们开始编码。
这里用到了 【U8G2】这个库,接下来点亮屏幕:
local sda = 1 -- GPIO4 local scl = 2 -- GPIO5 local sla = 0x3c i2c.setup(0, sda, scl, i2c.SLOW) disp = u8g2.ssd1306_i2c_128x64_noname(0, sla) disp:setFont(u8g2.font_6x10_tf) disp:setFontRefHeightExtendedText() disp:setDrawColor(1) disp:setFontPosTop() disp:setDrawColor(1) -- White disp:drawStr(75, 40, "By:bool")
然后显示logo比较复杂:
主要是用到了 drawXBM 这个方法,但是图片的显示要先把图片转换成XBM格式,然后提取里面的数据。比如:
这是一个图片,正常颜色的图片。然后通过画图打开,另存为
选择单色位图,转换成bmp格式。
再通过 搜索 “XBM转换器” 找到线上工具,比如我用的这个 https://convertio.co/zh/xbm-converter/ 转换完成之后,得到一个XMB文件。
能不能打开无所谓,这就是一个文本文件:
我们用记事本打开:
真棒,不但有位图数据,还有大小。复制bits里面的内容,到代码里 : 上代码
local star_war_logo_bits = { 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xF8, 0x9F, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x00, 0x00, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x01, 0x00, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x80, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0x80, 0xC1, 0xFF, 0x03, 0xC0, 0xFF, 0x00, 0x03, 0x80, 0x83, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x03, 0x80, 0x81, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0x00, 0x01, 0x07, 0x00, 0x00, 0x20, 0x04, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x84, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x80, 0x60, 0x10, 0x00, 0x00, 0xC0, 0x07, 0x06, 0x40, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x00, 0x00, 0xC0, 0x0C, 0x00, 0x40, 0x30, 0xC8, 0x03, 0x00, 0xD0, 0x2C, 0x00, 0xE0, 0x31, 0xC8, 0x03, 0x00, 0x90, 0x24, 0x00, 0xE0, 0x31, 0x8C, 0x07, 0x00, 0x04, 0x80, 0x00, 0xF0, 0x30, 0x0C, 0x0B, 0x00, 0x01, 0x00, 0x02, 0x68, 0x10, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x18, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0C, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x80, 0x07, 0x00, 0xC0, 0x00, 0x00, 0x06, 0x00, 0xC0, 0x07, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0xE0, 0x0F, 0x00, 0x60, 0x00, 0x00, 0x0C, 0x10, 0xE0, 0x0F, 0x0C, 0x60, 0x00, 0x00, 0x08, 0xFC, 0xE0, 0xCF, 0x3F, 0x20, 0x00, 0x00, 0x08, 0xCC, 0xF7, 0xDF, 0x33, 0x20, 0x00, 0x00, 0x18, 0x04, 0xF7, 0xFF, 0x70, 0x20, 0x00, 0x00, 0x10, 0x8C, 0xF7, 0xFF, 0x70, 0x30, 0x00, 0x00, 0x30, 0xFC, 0xE7, 0xCF, 0x3F, 0x18, 0x00, 0x00, 0x60, 0xF8, 0xE3, 0x8F, 0x1F, 0x18, 0x00, 0x00, 0xC0, 0xC1, 0xF8, 0x1B, 0x00, 0x0E, 0x00, 0x00, 0x80, 0x0F, 0x1C, 0x70, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x07, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } local star_war_logo_bits = string.char(unpack(star_war_logo_bits)) local function u8g2_star_war_logo() local frame_size = 0 --disp:setBitmapMode(0) -- solid disp:setBitmapMode(1) -- transparent disp:setDrawColor(1) -- White disp:drawStr(75, 40, "By:bool") disp:drawStr(70, 56, "2021-04-01") disp:drawXBM(5, 0, 64, 64, star_war_logo_bits) draw_state = draw_state + 1 end
这里需要注意,有的教程是直接把 bits数据传给了 string.char 方法。 这种一般来说可行,但是我们这次的就不行,因为lua语言的寄存器很小,只能存200多个参数,如果再多的话就直接报错了。 这个问题困扰了我一天。
一开始一直报错:function or expression too complex near
function or expression too complex near。意思是你的函数表达式 太复杂了,其实就是大小超出了。
解决办法是:先把数据传给一个table对象,然后使用unpack方法,把table给解构了,这样就完美解决了.
运行这个方法:出现星战的logo,完美。