CORE-ESP32C3|eink|墨水屏日历|天气API|LuatOS公共接口|气象要素数据V1|collectgarbage|LuatOS-SOC接口|官方demo|学习(13):墨水屏动态日历_air105驱动墨水屏幕-程序员宅基地

技术标签: 国产mcu  实时日历  lua  墨水屏  LuatOS-SOC接口学习  ESP32C3  

目录

参考博文

项目官方地址

显示效果:

硬件准备

软件版本

日志及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的摄像头_打酱油的工程师的博客-程序员宅基地

合宙ESP32系列|自定义固件|在线云编译|本地编译|Windows|luat_conf_bsp.h|(2)、CORE-ESP32S3编译_打酱油的工程师的博客-程序员宅基地

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

日志及soc下载工具

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,但后期存在复用冲突风险。

一、Elink驱动管脚适配

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://tianqiapi.com/user/login

  • 登陆后得到appid和appsecret,后期LuatOS公共接口中使用,用来获得天气数据。

API使用方式:

接口格式(注意需不需要tls):
http://apicn.luatos.org:23328/luatos-calendar/v1?mac=[设备码]&location=[城市id]&appid=[你的APPID]&appsecret=[你的APPSecret]
例子:

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

三、连接WIFI

官方示例中的标准程序

示例代码:

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)

四、elink屏幕显示代码

初始化:

墨水屏初始化前需要先初始化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()之后后面不要加任何语句!!!!!

PS:collectgarbage 垃圾回收

这个函数是垃圾收集器的通用接口。 通过参数 opt 它提供了一组不同的功能:

  • "collect": 做一次完整的垃圾收集循环。 这是默认选项。
  • "stop": 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。
  • "restart": 重启垃圾收集器的自动运行。
  • "count": 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。
  • "step": 单步运行垃圾收集器。 步长“大小”由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。
  • "setpause": 将 arg 设为收集器的 间歇率 (参见 §2.5)。 返回 间歇率 的前一个值。
  • "setstepmul": 将 arg 设为收集器的 步进倍率 (参见 §2.5)。 返回 步进倍率 的前一个值。
  • "isrunning": 返回表示收集器是否在工作的布尔值 (即未被停止)。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Medlar_CN/article/details/128908188

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search