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

智能推荐

如何生成 .plist文件,plist文件制作教程_plist生成-程序员宅基地

文章浏览阅读8.1k次,点赞4次,收藏7次。如何生成 .plist文件,plist文件制作教程如何生成 plist文件plist文件制作教程准备好已经切分好的序列图打开软件按图提示操作选择位置保存生成的两个文件 plist png example前期准备软件:TexturePacker要制作的序列图1.准备好已经切分好的序列图2.打开软件3.按图提示操作选择位置保存生成的两个文件 *.plist *.png examp_plist生成

JTable的应用(二)-程序员宅基地

文章浏览阅读69次。目录如何使用Table(1)创建一个简单的表格(2)向容器添加表格(3)改变每每一列的宽度(4)用户选择(5)创建表格模型(6)监听数据改变(7)点燃数据改变事件(8)概念:编辑器和渲染器(Editors and Renderers)(9)使用自定义渲染器(10)为单元格指定提示工具(11)为列头指定工具集(12)排序和过滤..._jtable对象两个参数类型

uoj #139-程序员宅基地

文章浏览阅读79次。树链剖分//模板题由于存在换根操作对所有关于节点 u 的修改和查询操作进行分类讨论若 Root 在 u 的子树中,则不处理 u 所在的 Root 的那颗子树否则不会有影响寻找 Root 所在的那颗子树的根可以用倍增求#include <iostream>#include <cstdio>#include <algorithm>#include..._onuoj

宇宙时光推论-程序员宅基地

文章浏览阅读273次。象理主义者认为:时间和空间是无限的,在时间上,没有开始和终了,在空间上没有边界和尽头,而宇宙间的万事万物,小到朝菌、蝇虫,大到整个宇宙,都是有限的产生、存在和无限的循环,任何事物都有开始和结束。静久必静,物极必反。对于整个宇宙而言,物质永不毁灭,循环不已生生不息。第一节太极宇宙一:太易宇宙即宇宙形成过程中“未见气之前”的阶段,阴阳不分,不产生吸引,也不产生排斥,为静止的空间,通过观..._时间有没有开始,空间有没有尽头

【论文阅读】Webshell检测方法研究综述_webshell研究现状-程序员宅基地

文章浏览阅读924次。目录一、论文题目二、作者信息三、论文地址四、论文内容1.webshell检测的分类2.基于静态文本的检测3.基于动态行为的检测4.基于日志分析的监测5.future works一、论文题目Webshell 检测方法研究综述二、作者信息南京林业大学,端木怡婷三、论文地址https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&dbname=CJFDLAST2021&filename=RJZZ202011020四、论文内容1_webshell研究现状

多线程求素数_多线程输出素数-程序员宅基地

文章浏览阅读2k次。一、前言 最近在学习golang的并发语法,想来想去,发现学习的多线程算法着实不多,除了一些传统排序算法的并发版本外,第一时间想起的也就是这个并发求素数的算法。 大部分人了解的单线程求素数算法,应该是两重循环判断是否能够整除,外层循环为被除数,内层循环为除数。而这种形式的求法能做文章的地方无非就是两点:被除数和除数的取值范围。 我所知比较好的被..._多线程输出素数

随便推点

Android Studio APK在真机上运行的方法(1)-程序员宅基地

文章浏览阅读710次,点赞8次,收藏17次。这时候软件可能就会识别手机。如果以上方法不可行,又不想花太多时间去找问题,就可以采用安装安装包的方式。我们可以在每一个对应项目对应目录下面的app\build\outputs\apk\debug查找到软件自动生成的安装包。如果是新版的AS的话可能只会看到一个app-debug.apk,并没有什么网上说的app-debug-unaligned.apk什么的两个.apk结尾的文件,这都不要紧,可以把这个拿到手机上直接安装。

Unity 划线 - 使用Image实现划线_unity quest3 在image上画线-程序员宅基地

文章浏览阅读1w次,点赞11次,收藏38次。unity使用Image实现划线功能_unity quest3 在image上画线

获取表单内部元素的N种方法_提取所有表单元素的方法-程序员宅基地

文章浏览阅读3.1k次。今天讲讲获取表单元素的N种方法~以上是部分资料参考的地方:http://blog.csdn.net/h12kjgj/article/details/61624509先给出一个实例。输入数字1~10,弹出输入的数字,并计算该数字的阶乘;如果输入的数字不在该范围内,则输出“balabala自己编的一些话”源代码: function Count(){var i,r,_提取所有表单元素的方法

脑肠轴——看不见的Crosstalk_脑肠轴检测指标-程序员宅基地

文章浏览阅读1.8w次,点赞5次,收藏11次。文献导读肠道菌群是指存在于宿主肠道内的微生物集合,它参与了宿主多种重要的生理作用,如影响机体的营养代谢、调节机体免疫系统的发育与成熟及抗菌作用,因此肠道菌群又被人称之为"被遗忘的器官"。随着科学技术的发展,人们逐渐意识到到肠道菌群与全身各个系统的疾病的发生发展都存在着密切的关联,从而提出一些像"肠脑轴"和"肠肝轴"等名词。肠脑轴背景介绍据统计,定植于人体肠道内数量约是人体细胞数量的..._脑肠轴检测指标

Qt安装教程(Qt 6.4)_qt6.4安装-程序员宅基地

文章浏览阅读6.5w次,点赞56次,收藏261次。Qt6.4安装教程、组件介绍_qt6.4安装

解决ubuntu1604 64位安装海思V400编译器之后仍然报No such file or directory_hisilicon_v400-程序员宅基地

文章浏览阅读648次。ubuntu1604 64位安装海思V400编译器之后仍然报No such file or directory环境:ubuntu 1604 64位安装:arm-hisiv400-linux工具链安装成功后执行:arm-hisiv400-linux-gcc -v报错:bash: /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-gcc: No such file or directory。但其实工具链已经安_hisilicon_v400

推荐文章

热门文章

相关标签