当前位置: 首页 > news >正文

【LuatOS】简单案例网页点灯

材料

硬件:合宙ESP32C3简约版,BH1750光照度模块,0.96寸OLED(4P_IIC),杜邦线若干

接线:

ESP32C3.GND — OLED.GND — BH1750.GND

ESP32C3.3.3V — OLED.VCC — BH1750.VCC

ESP32C3.GPIO5 — OLED.SCL — BH1750.SCL

ESP32C3.GPIO4 — OLED.SDA — BH1750.SDA

LED灯是调用板载的gpio12/gpio13

功能

  • 连接上ESP32C3开启的AP站点,能通过网页交互数据控制LED

  • 采集BH1750的光强度数据,给单片机做判断

  • OLED上显示采集到的光强度数据,和当前LED灯的控制模式(自动或手动)

  • 灯光的控制模式分成两种

    自动模式:根据光强度数据来自动调整灯光亮度

    手动模式:通过网页端控制灯光亮度

程序

main.lua

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "Demo"
VERSION = "1.0.0"-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
-- sys库的强力补充,增加任务通知之类的
sysplus = require("sysplus")
local bh1750 = require "bh1750"-- 全局变量
_G.BH1750_DATA = 0
_G.LedPwm_Data = 0
_G.LedMode = 0-- 初始化LED灯, 开发板上左右2个led分别是gpio12/gpio13
local LED_PWM = gpio.setup(12, 0, gpio.PULLUP)
local LED_RUN = gpio.setup(13, 0, gpio.PULLUP)-- 任务0--运行闪烁LED
function Task0_RunLed()log.info("Task0_RunLed_OK")while true doLED_RUN(0)sys.wait(500)LED_RUN(1)sys.wait(500)end
end-- 任务1--OLED显示
function Task1_OLED()log.info("Task1_OLED_Init")-- 初始化硬件i2c的ssd1306u8g2.begin({ic = "ssd1306",direction = 0,mode="i2c_hw",i2c_id = 0,i2c_speed = i2c.FAST}) u8g2.SetFontMode(1)u8g2.ClearBuffer()u8g2.SetFont(u8g2.font_opposansm10)log.info("Task1_OLED_OK")u8g2.SendBuffer()while true dou8g2.ClearBuffer()u8g2.DrawUTF8("RealTime", 30, 14)-- 显示光感u8g2.DrawUTF8("SunData: " .. string.format("%.2f", _G.BH1750_DATA), 0, 32)-- 控制模式u8g2.DrawUTF8("ConMode: " .. _G.LedMode, 0, 50)u8g2.SendBuffer()sys.wait(10)end
end-- 任务2--WIFI站点
function Task2_WiFI()log.info("Task2_WiFI_Init")wlan.init()-- 设置为AP模式, 广播ssid, 接收wifi客户端的链接wlan.setMode(wlan.AP)wlan.createAP("ESP32C3_AP_Mode", "12345678")log.info("Task2_WiFI_OK")-- 80端口监听事件log.info("WIFI_status:",wlan.ready())httpsrv.start(80,function(client, method, uri, headers, body)log.info("httpsrv",method, uri, json.encode(headers), body)if uri == "/led/1" then-- LED_PWM(1)_G.LedPwm_Data = 100return 200, {},"ok"elseif uri == "/led/0" then-- LED_PWM(0)_G.LedPwm_Data = 0return 200, {},"ok"elseif uri == "/mode/0" then_G.LedMode = 0return 200, {},"ok"elseif uri == "/mode/1" then_G.LedMode = 1return 200, {},"ok"-- elseif uri:find("/led_pwm/") thenelseif string.find(uri,"/led_pwm/") thenlog.info("YS:" .. string.match(uri,"%d+"))_G.LedPwm_Data = string.match(uri,"%d+")  end-- 无响应返回return 404, {}, "Not Found" .. uriend)log.info("WIFI_status:",wlan.ready())while true dosys.wait(500)end
end-- 任务3--BH1750光感
function Task3_BH1750()log.info("Task3_BH1750_OK")i2c.setup(0,i2c.FAST)bh1750.init(0)--初始化,传入i2c_idwhile 1 dolocal bh1750_data = bh1750.read_light()_G.BH1750_DATA = bh1750_datalog.info("bh1750_read_light", bh1750_data)sys.wait(1000)end
end-- 任务4--LED调光
function Task4_LEDPWM()log.info("Task4_LEDPWM_Init")-- pwm.open(12, 1000, 50)log.info("Task4_LEDPWM_OK")while true doif _G.LedMode == 0 then         -- 手动模式pwm.open(12, 1000, _G.LedPwm_Data) -- 频率1000hz, 占空比0-100elseif _G.LedMode == 1 then     -- 自动模式if _G.BH1750_DATA > 1000 then-- 强光pwm.open(12, 1000, 0)elseif _G.BH1750_DATA > 50 then-- 正常光pwm.open(12, 1000, 40)else-- 较暗pwm.open(12, 1000, 80)endendsys.wait(10)end
end-- 编写用户主事件 --
function MainTask()log.info("MainTask_OK")-- 引导任务创建 --sys.taskInit(Task0_RunLed)sys.taskInit(Task1_OLED)sys.taskInit(Task2_WiFI)sys.taskInit(Task3_BH1750)sys.taskInit(Task4_LEDPWM)
endsys.taskInit(MainTask)
sys.run()

index.html

<!DOCTYPE html>
<html>
<header><meta charset="utf-8" /><title>智能控制</title><script type="text/javascript">const progress = document.getElementById('progress');function Mode() {// 0.手动模式 1.自动模式console.log(document.getElementById('ModeText').innerText);  if (document.getElementById('ModeText').innerText.includes('手动模式')) {document.getElementById("ModeText").innerText = '自动模式'fetch("/mode/" + "1")} else {document.getElementById("ModeText").innerText = '手动模式'fetch("/mode/" + "0")}   }function led(key) {fetch("/led/" + key)document.getElementById("SunValue").innerHTML = 100 * keydocument.getElementById('progress').value = 100 * key}function myFunction() {// 获取进度条当前值  document.getElementById("SunValue").innerHTML = document.getElementById('progress').value;fetch("/led_pwm/" + document.getElementById('progress').value)}</script><style>body {display: flex;justify-content: center;align-items: center;}.Box {text-align: center;width: 80%;height: 80%;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);background-color: aqua;border-radius: 3%;}.ButBox,.RanBox {height: auto;}h2 {font-size: 100px;margin: 30px 20px;}p {font-size: 60px;}button {font-size: 50px;}#progress {width: 300px;/* 设置宽度 */height: 100px;/* 设置高度 */}</style>
</header><body><div class="Box"><!-- 任务:自动或手动模式 --><h2>灯光亮度控制</h2><div class="ModeBox"><p>当前模式:<span><u id="ModeText" onclick="Mode()" >手动模式</u></span></p></div><div class="ButBox"><!-- <span>手动控制</span> --><p><button onclick="led(1)">LED亮</button><button onclick="led(0)">LED灭</button></p></div><div class="RanBox"><!-- <h2>灯光亮度</h2> --><p id="SunValue">0</p><input type="range" id="progress" min="0" max="100" value="0" oninput="myFunction()"></div></div></div>
</body></html>

实物

在这里插入图片描述

在这里插入图片描述

连接上AP后,至于映射到本地网址,我的地址是192.168.4.1,不知道大家的一样,不一样的话,可以在Luatools_v2的串口日志上查看。

在这里插入图片描述

烧录

  上面的程序包含了index.html和main.lua,更完整的分享在下面了。

  程序(bh1750.lua+index.html+main.lua)+ESP32C3固件(LuatOS-SoC_V1005_ESP32C3.soc)打包好了,在链接。记得是用合宙的Luatools_v2烧录的。

链接:https://pan.baidu.com/s/1TEH0fz6HQ6Hw3IQBodJssw  提取码:rgx8

相关文章:

【LuatOS】简单案例网页点灯

材料 硬件&#xff1a;合宙ESP32C3简约版&#xff0c;BH1750光照度模块&#xff0c;0.96寸OLED(4P_IIC)&#xff0c;杜邦线若干 接线&#xff1a; ESP32C3.GND — OLED.GND — BH1750.GND ESP32C3.3.3V — OLED.VCC — BH1750.VCC ESP32C3.GPIO5 — OLED.SCL — BH1750.SCL E…...

百度APP iOS端包体积50M优化实践(七)编译器优化

一. 前言 百度APP iOS端包体积优化系列文章的前六篇重点介绍了包体积优化整体方案、图片优化、资源优化、代码优化、无用类优化、HEIC图片优化实践和无用方法清理&#xff0c;图片优化是从无用图片、Asset Catalog和HEIC格式三个角度做深度优化&#xff1b;资源优化包括大资源…...

STM32-新建工程(标准库)

目录 STM32F10x新建工程&#xff08;标准库&#xff09; 移植文件夹 新建工程 添加启动文件和必需文件 在工程中加载新添加的文件 在工程中添加文件路径 在工程中添加main函数 添加lib库 添加必需文件 添加宏定义 点亮LED&#xff08;标准库&#xff09; STM32F10x新…...

Android集成科大讯飞语音识别与语音唤醒简易封装

目录 一、语音唤醒部分 1、首先在科大讯飞官网注册开发者账号 2、配置唤醒词然后下载sdk 3、选择对应功能下载 4、语音唤醒lib包全部复制到工程目录下 5、把语音唤醒词文件复制到工程的assets目录 6、复制对应权限到AndroidManifest.xml中 7、唤醒工具类封装 二、语音识…...

【Linux】telnet命令使用

telnet命令 telnet命令用于使用telnet协议与另一台主机进行通信。如果在没有主机参数的情况下调用telnet&#xff0c;它将进入命令模式&#xff0c;由其提示&#xff08;telnet>&#xff09;指示。在这种模式下&#xff0c;它接受并执行下面列出的命令。如果使用参数调用它…...

VCG 标记使用(BitFlags)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 对于网格的每个单形,我们都有一个称为BitFlags的组件,该组件存储固定大小的32位向量,用于各种需求。管理这些标志的相关类:vcg::tri::UpdateFlags与vcg::tri::UpdateSelection。主要的标记有:删除标记、边界标记…...

Pandas中的Series(第1讲)

Pandas中的Series(第1讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…...

从手工测试进阶中高级测试?如何突破职业瓶颈...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、手工测试如何进…...

【链表Linked List】力扣-114 二叉树展开为链表

目录 题目描述 解题过程 官方题解 题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应…...

Go (一) 基础部分4 -- 文件处理

一、文件基本介绍 1.1、打开一个文件 基本介绍&#xff1a;打开一个文件用于读取&#xff0c;如果操作成功&#xff0c;返回的文件对象的方法可用于读取文件数据。如果出错&#xff0c;错误底层类型是"*.PathError" func Open(name string) (*File, error) name stri…...

集合03 Collection (List) - Java

List ArrayListArrayList注意事项ArrayList底层操作机制-源码分析&#xff08;重点&#xff09; VectorVector基本介绍 ——Vector和ArrayList比较Vector底层结构和源码分析 LinkedList基本介绍LinkedList的底层结构和操作机制LinkedList的增删改查 ——LinkedList和ArrayList比…...

国产化软件突围!怿星科技eStation产品荣获2023铃轩奖“前瞻优秀奖”

11月11日&#xff0c;2023中国汽车供应链峰会暨第八届铃轩奖颁奖典礼在江苏省昆山市举行。怿星科技凭借eStation产品&#xff0c;荣获2023铃轩奖“前瞻智能座舱类优秀奖”&#xff0c;怿星CEO潘凯受邀出席铃轩奖晚会并代表领奖。 2023铃轩奖“前瞻智能座舱类优秀奖” 铃轩奖&a…...

如何解决Redis热Key问题?

Redis热点key是指访问频率较高的key&#xff0c;当大量的请求集中在一个或少数几个热点key上时&#xff0c;会导致这些key所在的Redis节点的CPU、内存和网络带宽等资源被大量消耗&#xff0c;影响Redis集群的整体性能和稳定性。 热点Key带来的问题 Redis节点负载过高&#xff1…...

react Hooks之useId

当我们在编写React组件时&#xff0c;有时需要为元素生成唯一的ID。这种情况经常出现在表单元素、标签和用于无障碍性的目的上。React提供了一个名为useId的自定义Hook&#xff0c;它可以帮助我们生成唯一的ID。 1、作用&#xff1a; 用于生成一个唯一的 ID。这个 ID 可以用于…...

2023年全球软件开发大会(QCon广州站2023)-核心PPT资料下载

一、峰会简介 本次峰会包含&#xff1a;泛娱乐时代的边缘计算与通讯、稳定性即生命线、下一代软件架构、出海的思考、现代数据架构、AGI 与 AIGC 落地、大前端技术探索、编程语言实战、DevOps vs 平台工程、新型数据库、AIGC 浪潮下的企业出海、AIGC 浪潮下的效能智能化、数据…...

MicroSD 卡 使用读卡器 读取速度测试

设备 - - 电脑为m.2固态硬盘 usb口为USB3.2 gen2接口(即支持1GB/s的接口) cpu: amd3600 测试方案1 直接MicroSD卡放入读卡器测试 38MB/s 从sd卡复制到本地C盘 测试方案2 MicroSD卡使用闪迪的SD卡套套上之后一起插入读卡器 76MB/s 从sd卡复制到本地C盘...

Selenium+Unittest+HTMLTestRunner框架更改为Selenium+Pytest+Allure(一)

背景&#xff1a;之前的框架&#xff0c;Selenium是3.x版本&#xff0c;现在更新到4.15版本后&#xff0c;一些写法如find_element_by_xxx 不再支持&#xff0c;改为find_element(By.xxx)的方式&#xff0c;同时由于Unittest不如Pytest在执行方面灵活&#xff08;比如只执行冒烟…...

LoRA(Low-Rank Adaptation)

LoRA&#xff08;Low-Rank Adaptation&#xff09; LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种针对深度学习模型的参数调整方法&#xff0c;特别适用于大型预训练模型如GPT-3或BERT。它通过在模型的原有权重上添加低秩&#xff08;low-rank&#xff09;矩阵&…...

【银行测试】第三方支付功能测试点+贷款常问面试题(详细)

前言 1、第三方支付功能测试点 支付流程&#xff1a; 我们在测试一个功能时&#xff0c;需要先了解一下这个逻辑&#xff0c;而订单支付逻辑普遍都会有以下内容&#xff1a; 1&#xff09;创建本地唯一订单号&#xff1b; 2&#xff09;去调用支付&#xff0c;在支付平台生…...

前端:HTML+CSS+JavaScript实现轮播图2

前端&#xff1a;HTMLCSSJavaScript实现轮播图2 1. 和之前版本的区别2. 实现原理3. 针对上述的改进3. 参考代码 1. 和之前版本的区别 之前发布的那篇关于轮播图的文章在这&#xff1a;前端&#xff1a;HTMLCSSJavaScript实现轮播图&#xff0c;只能说存在问题吧&#xff01;比…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...