目录
参考博文
项目官方地址
显示效果:
硬件准备
软件版本
日志及soc下载工具
软件使用
接线示意图
硬件接线
一、Elink驱动管脚适配
二、天气信息获取
API使用方式:
接口格式(注意需不需要tls):http://apicn.luatos.org:23328/luatos-calendar/v1?mac=[设备码]&location=[城市id]&appid=[你的APPID]&appsecret=[你的APPSecret]例子:
三、连接WIFI
示例代码:
四、elink屏幕显示代码
初始化:
显示:
完成后屏幕休眠
五、完整代码:
PS:collectgarbage 垃圾回收
CORE-ESP32C3|eink|日期格式化|IO11解锁|墨水屏操作库|SNTP自动同步|局部刷新|全局刷新|LuatOS-SOC接口|官方demo|学习(12):简单日期显示合宙Air105|摄像头|capture|SPI|Serial 串口|TFTLCD|Micro SD卡|GC032A|USB转TTL|官方demo|学习(2-1):摄像头camera-capture_合宙air105的摄像头_打酱油的工程师的博客-CSDN博客
合宙ESP32系列|自定义固件|在线云编译|本地编译|Windows|luat_conf_bsp.h|(2)、CORE-ESP32S3编译_打酱油的工程师的博客-CSDN博客
Lua基础|CORE-ESP32C3|eink|日期格式化|os.date|weekarray|tonumber|SOC固件编译|汉字星期|墨水屏:今天星期几?
https://gitee.com/openLuat/LuatOS/blob/master/script/turnkey/eink-calendar
ESP32C3-CORE开发板(经典款)1块,面包板1块,EINK1.54墨水屏。
ESP32C3-CORE开发板pinout
EINK1.54墨水屏
CORE-ESP32C3:LuatOS@ESP32C3 base 22.12 bsp V1003 32bit
luatools 版本:2.1.88
Luatools软件安装目录下存放有各型号的SOC,也可用于刷机。
接口文档可参考: eink - 墨水屏操作库
显示屏为合宙 1.54寸v2,200x200,快刷屏,SPI标准屏
显示屏SPI --> CORE-ESP32
GND GND
VCC 3.3V
SCL (IO02)
SDA (IO03)
RES (IO10)
DC (IO06)
CS (IO07)
BUSY (IO11)-IO11默认配置为SPI-FLASH的VDD,需解锁配置为GPIO使用。
如不考虑解锁,可选择右侧IO,但后期存在复用冲突风险。
Air系列开发板使用不同的管脚来驱动Eink屏幕,官方驱动中适配了不同的开发板,本文测试采用ESP32C3,仅对其适配端口进行了测试,后续再陆续对其他开发板端口进行测试,可自行参考使用。
官方示例代码:
local rtos_bsp = rtos.bsp()
-- spi_id,pin_reset,pin_dc,pin_cs,pin_busy,mode
function eink_pin()
if rtos_bsp == "AIR101" then
return 0,pin.PB03,pin.PB01,pin.PB04,pin.PB00
elseif rtos_bsp == "AIR103" then
return 0,pin.PB03,pin.PB01,pin.PB04,pin.PB00
elseif rtos_bsp == "AIR105" then
return 5,pin.PC12,pin.PE08,pin.PC14,pin.PE09
elseif rtos_bsp == "ESP32C3" then
--(spi_id, pin_busy, pin_reset, pin_dc, pin_cs)
return 2,11,10,6,7
elseif rtos_bsp == "ESP32S3" then
return 2,16,15,14,13
elseif rtos_bsp == "EC618" then
return 0,1,10,8,18
else
log.info("main", "bsp not support")
return
end
end
通过api.luatos.org调用天气API接口,获得城市数据(V1, 地面气象要素数据文件格式)并解析,后期通过get方法取得解析后的位图数据。
天气API的使用接口需自行注册。
采用天气API:免费天气API接口|天气预报接口|全球天气API接口|气象预警|空气质量
https://api.luatos.org/luatos-calendar/v1?mac=111&battery=10&location=101011700&appid=288******&appsecret=zHI*****
浏览器中访问该地址后,可得到天气V1数据,该数据为地面气象要素数据文件格式,具体的解析由luatos进行。
城市id可以前往官网地址查询:
查询城市id
若没有传位置参数,默认会尝试从ip获取位置,但成功率和准确度极低。
示例代码:
local function requestHttp()
local code, headers, body = http.request("GET","http://apicn.luatos.org:23328/luatos-calendar/v1?mac=111&battery=10&location="..location.."&appid="..appid.."&appsecret="..appsecret).wait()
if code == 200 then
return body
else
log.info("http get failed",code, headers, body)
sys.wait(500)
return ""
end
end
官方示例中的标准程序
local function connectWifi()
log.info("wlan", "wlan_init:", wlan.init())
wlan.setMode(wlan.STATION)
wlan.connect(wifiName,wifiPassword,1)
-- 等待连上路由,此时还没获取到ip
result, _ = sys.waitUntil("WLAN_STA_CONNECTED")
log.info("wlan", "WLAN_STA_CONNECTED", result)
-- 等到成功获取ip就代表连上局域网了
result, data = sys.waitUntil("IP_READY")
log.info("wlan", "IP_READY", result, data)
墨水屏初始化前需要先初始化SPI设备:
这里设置为全部刷新(每小时更新一次)。
eink.model(eink.MODEL_1in54)
spi.setup(spi_id,nil,0,0,8,20*1000*1000)
eink.setup(mode, spi_id,pin_busy,pin_reset,pin_dc,pin_cs)
eink.setWin(200, 200,2)
--稍微等一会,免得墨水屏没初始化完成
sys.wait(100)
eink.clear(1)
log.info("eink", "end setup")
eink.drawXbm(0, 0, 200, 200, data)
-- 刷屏幕
eink.show()
--进入休眠模式,再次使用时需要重新初始化
eink.sleep()
PROJECT = "wifidemo"
VERSION = "1.0.0"
--测试支持硬件:ESP32C3
--测试固件版本:LuatOS-SoC_V0003_ESP32C3[_USB].soc
local sys = require "sys"
require("sysplus")
-- 兼容V1001固件的
if http == nil and http2 then
http = http2
end
local rtos_bsp = rtos.bsp()
-- spi_id,pin_reset,pin_dc,pin_cs,pin_busy,mode
function eink_pin()
if rtos_bsp == "AIR101" then
return 0,pin.PB03,pin.PB01,pin.PB04,pin.PB00
elseif rtos_bsp == "AIR103" then
return 0,pin.PB03,pin.PB01,pin.PB04,pin.PB00
elseif rtos_bsp == "AIR105" then
return 5,pin.PC12,pin.PE08,pin.PC14,pin.PE09
elseif rtos_bsp == "ESP32C3" then
--(spi_id, pin_busy, pin_reset, pin_dc, pin_cs)
return 2,11,10,6,7
elseif rtos_bsp == "ESP32S3" then
return 2,16,15,14,13
elseif rtos_bsp == "EC618" then
return 0,1,10,8,18
else
log.info("main", "bsp not support")
return
end
end
--需要自行填写的东西
--wifi信息
local wifiName,wifiPassword = "**你的WIFI地址*****", "******你的WIFI密码******"
--地区id,请前往https://api.luatos.org/luatos-calendar/v1/check-city/ 查询自己所在位置的id
local location = "101010100" --北京
--天气接口信息,需要自己申请,具体参数请参考https://api.luatos.org/ 页面上的描述
--采用天气API:https://tianqiapi.com/
local appid,appsecret = "27*******","3wd******"
local function connectWifi()
log.info("wlan", "wlan_init:", wlan.init())
wlan.setMode(wlan.STATION)
wlan.connect(wifiName,wifiPassword,1)
-- 等待连上路由,此时还没获取到ip
result, _ = sys.waitUntil("WLAN_STA_CONNECTED")
log.info("wlan", "WLAN_STA_CONNECTED", result)
-- 等到成功获取ip就代表连上局域网了
result, data = sys.waitUntil("IP_READY")
log.info("wlan", "IP_READY", result, data)
end
local function requestHttp()
local code, headers, body = http.request("GET","http://apicn.luatos.org:23328/luatos-calendar/v1?mac=111&battery=10&location="..location.."&appid="..appid.."&appsecret="..appsecret).wait()
if code == 200 then
return body
else
log.info("http get failed",code, headers, body)
sys.wait(500)
return ""
end
end
function refresh()
log.info("refresh","start!")
local data
for i=1,5 do--重试最多五次
collectgarbage("collect")
data = requestHttp()
collectgarbage("collect")
if #data > 100 then
break
end
log.info("load fail","retry!")
end
if #data < 100 then
log.info("load fail","exit!")
return
end
collectgarbage("collect")
local spi_id, pin_busy, pin_reset, pin_dc, pin_cs = eink_pin()
local mode =0
if spi_id then
eink.model(eink.MODEL_1in54)
spi.setup(spi_id,nil,0,0,8,20*1000*1000)
eink.setup(mode, spi_id,pin_busy,pin_reset,pin_dc,pin_cs)
eink.setWin(200, 200,2)
--稍微等一会,免得墨水屏没初始化完成
sys.wait(100)
eink.clear(1)
log.info("eink", "end setup")
eink.drawXbm(0, 0, 200, 200, data)
-- 刷屏幕
eink.show()
eink.sleep()
log.info("refresh","done")
end
end
sys.taskInit(function()
--先连wifi
connectWifi()
while true do
refresh()
sys.wait(3600*1000)--一小时刷新一次吧
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
collectgarbage ([opt [, arg]])
这个函数是垃圾收集器的通用接口。 通过参数 opt 它提供了一组不同的功能: