提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、介绍
- 二、相关介绍
- 2.1helloworld——
- 2.2任务框架
- 2.3消息传递 与消息订阅
- 2.4uart
- 2.5二进制数据/c结构体的打包与解析
- 2.6 zbuffer库
- 2.8 uart 485 数据解析
- 2.9 点亮自带的lcd
- 2.10 lcd显示文字和显示中文字体
- 2.11 lcd显示文字和显示中文字体
- 1.引入库
- 二、联网
- 2.1 连接wifi,并支持smartconfig配网 现在缺少一个判断有数据但是没有这个网络,需要重新配网的一个局面
- 2.2 连接阿里云平台
前言
官网固件处讲解
现在已经不推本地的tools进行esp32c3的烧录; 时间(2024.8.21)
这上面说推荐直接云客户端
直接看官网云客户端配置
提示:以下是本篇文章正文内容,下面案例可供参考
一、介绍
其他介绍看这个
二、相关介绍
上面云端的那个地方就是进行一些固件,不是正在的代码编写。
他没有专有的ide要在vscode里面编写。环境搭建
烧录教程此时resource里面是没有esp32的需要使用上面的云端那个配置soc固件烧到板子里面
此时两个gpio灯微微亮。
2.1helloworld——
这时候我们用vscode编写代码
PROJECT = "hello_world"
VERSION = "0.0.1"sys = require"sys"
--代码区startlocal LEDA= gpio.setup(12, 0, gpio.PULLUP)
local LEDB= gpio.setup(13, 0, gpio.PULLUP)print("hello world")-- LEDA(0)
--代码区endsys.run()
2.2任务框架
然后将脚本烧录了。
使用任务的方式进行闪烁
有需要任务框架教程
对于gpio的操作
PROJECT = "hello_world"
VERSION = "0.0.1"sys = require("sys")
--代码区startlocal LEDA= gpio.setup(12, 0, gpio.PULLUP)
local LEDB= gpio.setup(13, 0, gpio.PULLUP)sys = require("sys")
--第一个任务
sys.taskInit(function()while true dolog.info("task1","-----")print("system start")sys.wait(500) --延时500m秒,这段时间里可以运行其他代码end
end)--第二个任务
sys.taskInit(function()while true dolog.info("task2","------")LEDA(1)LEDB(1)sys.wait(500) --延时0.5秒,这段时间里可以运行其他代码LEDA(0)LEDB(0)sys.wait(500) --延时0.5秒,这段时间里可以运行其他代码end
end)print("system start\n")-- LEDA(0)
--代码区endsys.run()
即可完成打印和闪烁
对于这个函数的定义以及任务的定义 ,也可以采用这种方式
PROJECT = "hello_world"
VERSION = "0.0.1"sys = require("sys")
--代码区startlocal LEDA= gpio.setup(12, 0, gpio.PULLUP)
local LEDB= gpio.setup(13, 0, gpio.PULLUP)sys = require("sys")
--第一个任务function task1()while true dolog.info("task1","-----")print("system start")sys.wait(500) --延时500m秒,这段时间里可以运行其他代码end
end
--第二个任务
sys.taskInit(function()while true dolog.info("task2","------")LEDA(1)LEDB(1)sys.wait(500) --延时0.5秒,这段时间里可以运行其他代码LEDA(0)LEDB(0)sys.wait(500) --延时0.5秒,这段时间里可以运行其他代码end
end)sys.taskInit(task1)print("system start\n")-- LEDA(0)
--代码区endsys.run()
2.3消息传递 与消息订阅
消息传递
sys.publish
sys.waitUntil
订阅消息
sys.subcribe
sys.unsubcribe
2.4uart
local LEDA= gpio.setup(12, 0, gpio.PULLUP)
local LEDB= gpio.setup(13, 0, gpio.PULLUP)
local uartid = 1
--初始化
uart.setup(uartid,--串口id115200,--波特率8,--数据位1--停止位
)
-- 收取数据会触发回调, 这里的"receive" 是固定值
uart.on(uartid, "receive", function(id, len)local s = uart.read(id, len)if #s > 0 then -- #s 是取字符串的长度if s == "on" thenLEDA(1)elseif s == "off" thenLEDA(0)end-- 如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到-- 关于收发hex值,请查阅 https://doc.openluat.com/article/583log.info("uart", "receive", id, #s, s)-- log.info("uart", "receive", id, #s, s:toHex())end-- 如使用2024.5.13之前编译的ESP32C3/ESP32S3固件, 恢复下面的代码可以正常工作-- if #s == len then-- break-- endend)
2.5二进制数据/c结构体的打包与解析
视频
2.6 zbuffer库
2.8 uart 485 数据解析
2.9 点亮自带的lcd
云平台要把这个打开,其他的不变
然后复制demo里面的代码
也可以打图片也放进去
这样屏幕就能正常显示了
精简以后的代码
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "lcddemo"
VERSION = "1.0.0"log.info("main", PROJECT, VERSION)-- sys库是标配
_G.sys = require("sys")-- 提示:
-- 1. 只使用SPI的时钟线(SCK)和数据输出线(MOSI), 其他均为GPIO脚
-- 2. 数据输入(MISO)和片选(CS), 虽然是SPI, 但已复用为GPIO, 并非固定,是可以自由修改成其他脚
-- 3. 若使用多个SPI设备, 那么RES/CS请选用非SPI功能脚
-- 4. BL可以不接的, 若使用Air10x屏幕扩展板,对准排针插上即可
-- ]]--添加硬狗防止程序卡死
if wdt thenwdt.init(9000)--初始化watchdog设置为9ssys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
endlocal spi_id,pin_reset,pin_dc,pin_cs,bl = 2,10,6,7,11spi_lcd = spi.deviceSetup(spi_id,pin_cs,0,0,8,20*1000*1000,spi.MSB,1,0)
port = "device"
print('hello2222222222222222')lcd.init("st7735v",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 1,w = 160,h = 80,xoffset = 0,yoffset = 24},spi_lcd)--如果显示颜色相反,请解开下面一行的注释,关闭反色--lcd.invoff()--0.96寸TFT如果显示依旧不正常,可以尝试老版本的板子的驱动-- lcd.init("st7735s",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 2,w = 160,h = 80,xoffset = 0,yoffset = 0},spi_lcd)-- 不在内置驱动的, 看demo/lcd_customsys.taskInit(function()-- 开启缓冲区, 刷屏速度回加快, 但也消耗2倍屏幕分辨率的内存-- lcd.setupBuff() -- 使用lua内存-- lcd.setupBuff(nil, true) -- 使用sys内存, 只需要选一种-- lcd.autoFlush(false)while 1 dolcd.clear()log.info("wiki", "https://wiki.luatos.com/api/lcd.html")-- API 文档 https://wiki.luatos.com/api/lcd.htmlif lcd.showImage then-- 注意, jpg需要是常规格式, 不能是渐进式JPG-- 如果无法解码, 可以用画图工具另存为,新文件就能解码了lcd.showImage(40,0,"/luadb/logo.jpg")sys.wait(100)endlog.info("lcd.drawLine", lcd.drawLine(20,20,150,20,0x001F))log.info("lcd.drawRectangle", lcd.drawRectangle(20,40,120,70,0xF800))log.info("lcd.drawCircle", lcd.drawCircle(50,50,20,0x0CE0))sys.wait(1000)end
end)-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
上面是没有开启缓冲区,下面这里开启了 缓冲区。注意才操作完以后一定要写lcd.flush()
不然不会进行显示
sys.taskInit(function()-- 开启缓冲区, 刷屏速度回加快, 但也消耗2倍屏幕分辨率的内存lcd.setupBuff() -- 使用lua内存-- lcd.setupBuff(nil, true) -- 使用sys内存, 只需要选一种lcd.autoFlush(false)while 1 dolcd.clear()lcd.flush()log.info("wiki", "https://wiki.luatos.com/api/lcd.html")-- API 文档 https://wiki.luatos.com/api/lcd.htmlif lcd.showImage then-- 注意, jpg需要是常规格式, 不能是渐进式JPG-- 如果无法解码, 可以用画图工具另存为,新文件就能解码了lcd.showImage(40,0,"/luadb/logo.jpg")-- sys.wait(100)endlog.info("lcd.drawLine", lcd.drawLine(20,20,150,20,0x001F))log.info("lcd.drawRectangle", lcd.drawRectangle(20,40,120,70,0xF800))log.info("lcd.drawCircle", lcd.drawCircle(50,50,20,0x0CE0))lcd.flush()sys.wait(1000)end
end)
2.10 lcd显示文字和显示中文字体
需要云编译配置这几项
然后在代码里面写
--- 模块功能:lcddemo
-- @module lcd
-- @author Dozingfiretruck
-- @release 2021.01.25-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "lcddemo"
VERSION = "1.0.0"log.info("main", PROJECT, VERSION)-- sys库是标配
_G.sys = require("sys")-- 提示:
-- 1. 只使用SPI的时钟线(SCK)和数据输出线(MOSI), 其他均为GPIO脚
-- 2. 数据输入(MISO)和片选(CS), 虽然是SPI, 但已复用为GPIO, 并非固定,是可以自由修改成其他脚
-- 3. 若使用多个SPI设备, 那么RES/CS请选用非SPI功能脚
-- 4. BL可以不接的, 若使用Air10x屏幕扩展板,对准排针插上即可
-- ]]--添加硬狗防止程序卡死
if wdt thenwdt.init(9000)--初始化watchdog设置为9ssys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
endlocal spi_id,pin_reset,pin_dc,pin_cs,bl = 2,10,6,7,11spi_lcd = spi.deviceSetup(spi_id,pin_cs,0,0,8,20*1000*1000,spi.MSB,1,0)--打开spi
port = "device"
print('hello2222222222222222')lcd.init("st7735v",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 1,w = 160,h = 80,xoffset = 0,yoffset = 24},spi_lcd)--如果显示颜色相反,请解开下面一行的注释,关闭反色--lcd.invoff()--0.96寸TFT如果显示依旧不正常,可以尝试老版本的板子的驱动-- lcd.init("st7735s",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 2,w = 160,h = 80,xoffset = 0,yoffset = 0},spi_lcd)-- 不在内置驱动的, 看demo/lcd_customsys.taskInit(function()-- 开启缓冲区, 刷屏速度回加快, 但也消耗2倍屏幕分辨率的内存lcd.setupBuff() -- 使用lua内存-- lcd.setupBuff(nil, true) -- 使用sys内存, 只需要选一种lcd.autoFlush(false)while 1 dolcd.clear()lcd.flush()lcd.setFont(lcd.font_opposansm12)lcd.drawStr(40,10,"drawStr")lcd.setFont(lcd.font_sarasa_m14_chinese)-- 具体取值可参考api文档的常量表lcd.drawStr(40,40,"drawStr测试")lcd.flush()sys.wait(1000)end
end)-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
2.11 lcd显示文字和显示中文字体
1.引入库
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
二、联网
2.1 连接wifi,并支持smartconfig配网 现在缺少一个判断有数据但是没有这个网络,需要重新配网的一个局面
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "wifidemo"
VERSION = "1.0.0"-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
require("sysplus")-- -- wifi扫描成功后, 会有WLAN_SCAN_DONE消息, 读取即可
-- sys.subscribe("WLAN_SCAN_DONE", function ()
-- local results = wlan.scanResult()
-- log.info("scan", "results", #results)
-- for k,v in pairs(results) do
-- log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
-- end
-- end)-- sys.taskInit(function()
-- sys.wait(1000)
-- wlan.init()
-- while 1 do
-- wlan.scan()
-- sys.wait(30000) -- 注意, 尤其是Air780系列, 这个时间只能更长不能短
-- end
-- end)
if wdt then--添加硬狗防止程序卡死,在支持的设备上启用这个功能wdt.init(9000)--初始化watchdog设置为9ssys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
fskv.kvdb_init()sys.subscribe("IP_READY", function(ip) -- 联网成功的订阅log.info("wlan", "ip ready", ip)-- 联网成功, 可以发起http, mqtt, 等请求了
end)
-- sys.subscribe("IP_ERROR", function() -- 联网失败的订阅
-- log.info("联网失败 ")
-- end)sys.taskInit(function()sys.wait(2000)wlan.init()sys.wait(1000)-- 获取上次保存的配网信息, 如果存在就直接联网, 不需要配网了-- 注意, fskv保存的数据是掉电存储的, 刷脚本/刷固件也不会清除-- 如需完全清除配置信息, 可调用 fskv.clear() 全清if fskv.kv_get("wlan_ssid") thenwlan.connect(fskv.kv_get("wlan_ssid"), fskv.kv_get("wlan_passwd"))log.info( "fskv有联网数据")log.info( "正在连接请稍等******")--可能连接不成功,如果连接超时了(要有一个定时器计时),就让定时器打开"start_smartconfig" 。return -- 等联网就行了elselog.info( "fskv中没有联网数据")sys.publish("start_smartconfig")end-- wlan.connect("linsen66", "66668888")-- log.info("wlan", "wait for IP_READY")-- sys.waitUntil("IP_READY", 30000)-- if wlan.ready() then-- log.info("wlan", "ready !!")-- sys.wait(100)-- else-- print("wlan NOT ready!!!!")-- endwhile 1 dosys.waitUntil("start_smartconfig")-- 启动配网, 默认是esptouch模式 wlan.smartconfig(wlan.AIRKISS) 是AIRKISS 模式wlan.smartconfig(wlan.AIRKISS)log.info( "打开esptouch模式 的smartconfig")local ret, ssid, passwd = sys.waitUntil("SC_RESULT", 3*60*1000) -- 等3分钟if ret == false thenlog.info("timeout stop smartconfig")wlan.smartconfig(wlan.STOP)-- sys.wait(3000) -- 再等3s重新配网, 或者直接reboot也行else-- 获取配网后, ssid和passwd会有值log.info("获取到的账号和密码 ", ssid, passwd)-- 获取IP成功, 将配网信息存入fskv, 做持久化存储log.info("fskv", "save ssid and passwd")fskv.kv_set("wlan_ssid", ssid)fskv.kv_set("wlan_passwd", passwd)endsys.wait(1000)end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
2.2 连接阿里云平台
参考文档1
参考文档2
参考文档3
代码
参考视频
云端配置
上传数据参考
local basedata =
{method = "thing.event.property.post",id = "1",params = {data_contral = 1},version = "1.0",
}
local led1_data =
{method = "thing.event.property.post",id = "1",params = {led_contral_1 = 0},version = "1.0",
}
--发布一条QOS为1的消息
function publishTest()--注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换-- aliyun.publish(topic,qos,payload,cbFnc,cbPara)log.info("aliyun", "上行数据")jsondata = json.encode(basedata)aliyun.publish("/sys/k021qfZofse/demo_1/thing/event/property/post",1,jsondata,publishTestCb,"publishTest_"..publishCnt)jsonled1= json.encode(led1_data)aliyun.publish("/sys/k021qfZofse/demo_1/thing/event/property/post",1,jsonled1,publishTestCb,"publishTest_"..publishCnt)-- aliyun.publish("/"..tPara[ProductKey]"/"..tPara[DeviceName].."/update",1,12)-- aliyun.publish("/k021qfZofse/demo_1/data_contral",1,"100")-- /sys/k021qfZofse/demo_1/thing/event/property/post
end
下传数据参考
这里进行调试,点击设置以后数据发送到esp32 使用串口产看数据
-- /sys/k021qfZofse/demo_1/thing/service/property/set-- {"method":"thing.service.property.set","id":"1083737772",-- "params":{"led_contral_1":0,"led_contral_2":1,"data_contral":1},"version":"1.0.0"}-- 0 0 0
其中"data_contral":1
是我们需要的
使用这种方式就可以把数据解析出来
local function rcvCbFnc(topic,payload,qos,retain,dup)log.info("aliyun", "收到下行数据", topic,payload,qos,retain,dup)anly_data = json.decode(payload)contral_led = anly_data["params"]["led_contral_2"]print("contral_led的数据是------:",contral_led)
end
相关代码。
gitee