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,完美。

 

 

posted @ 2021-04-01 13:46  Human_nature  阅读(395)  评论(0编辑  收藏  举报