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()之后后面不要加任何语句!!!!!这串代码为什么显示报错?
时间: 2025-03-30 12:05:21 浏览: 32
从代码整体来看,这是一个基于 LuatOS 的 Lua 脚本程序,旨在让设备(这里是 ESP32-C3)连接 WiFi 后定时请求天气数据并通过电子墨水屏显示出来。如果遇到运行时报错的情况,可能是由于以下几个常见原因导致的问题:
---
### **1. 变量未正确赋值**
检查变量 `wifiName`, `wifiPassword`, `location`, `appid`, 和 `appsecret` 是否都填入了正确的值。
如果没有替换默认注释掉的内容,则可能导致 HTTP 请求失败或者其他错误。
```lua
local wifiName, wifiPassword = "**你的WIFI地址*****", "******你的WIFI密码******"
local location = "101010100" -- 北京的ID
local appid, appsecret = "27*******", "3wd******"
```
请确保上述字段替换成对应的实际信息。
---
### **2. 函数返回空值引发异常**
在 `requestHttp()` 中若连续尝试多次仍无法获取有效数据 (`#data < 100`) ,则退出函数并且不会继续执行后续墨水屏绘图部分逻辑;然而假如此段缺失必要的清理机制也可能干扰下一周期任务正常启动。
建议增加更详细的调试日志来定位具体在哪一步发生问题,比如打印出每次接收到的数据长度或者HTTP响应码等等。
---
### **3. SPI配置不当**
对于ESP32系列芯片而言,虽然理论上应该支持指定引脚映射表里提到的相关GPIO编号来进行硬件级SPI通信操作但是有时候因内部寄存器初始化顺序等原因会造成实际效果不符合预期。因此可以试着修改一下这部分代码看看是否有改善:
原版:
```lua
spi.setup(spi_id,nil,0,0,8,20*1000*1000)
```
改为自定义软SPI模式试试看:
```lua
spi.close(spi_id) -- 关闭之前的设置以防冲突
spi.setup(spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW,
8, 20 * 1000 * 1000, gpio.mode(pin_cs,gpio.OPEN_DRAIN))
```
同时注意确认所选用的管脚是否符合官方推荐列表以及是否存在与其他外设复用情况造成竞争访问隐患。
---
最后提醒一点就是关于内存泄漏方面的事情啦~ 因为涉及到频繁GC动作再加上图片缓存等因素很容易触碰到堆栈溢出风险点所以务必小心处理哦~
---
**
阅读全文
相关推荐

















