【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AOP跨模块捕获异常遭CGLIB拦截而继续向上抛出异常

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、BUG详情 1.1 报错信息 1.2 接口响应信息 1.3 全局异常处理器的定义 二、排查过程 三、解决方案 四、总结 前言 最近&…

数据科学工作的20个Pandas函数(备忘)

Pandas 是数据科学社区中使用最广泛的库之一&#xff0c;它是一个强大的工具&#xff0c;可以进行数据操作、清理和分析。 本文将提供最常用的 Pandas 函数以及如何实际使用它们的样例。我们将涵盖从基本数据操作到高级数据分析技术的所有内容&#xff0c;到本文结束时&#xf…

攻防世界题目练习——Web引导模式(五)(持续更新)

题目目录 1. FlatScience2. bug3. Confusion1 1. FlatScience 参考博客&#xff1a; 攻防世界web进阶区FlatScience详解 题目点进去如图&#xff0c;点击链接只能看到一些论文pdf 用dirsearch和御剑扫描出一些隐藏文件&#xff1a; robots.txt: admin.php: login.php: f…

配电站房智慧化改造

随着科技的发展和工业化自动化的不断提高&#xff0c;传统的配电室已经不能满足现代工业的需求。配电站房的智慧化改造可以提高电力系统的运行效率和安全性&#xff0c;依托电易云-智慧电力物联网实现配电房无人值守。以下是配电站房智慧化改造的一些主要方面&#xff1a; 设备…

数据分享 I 全国市级商品房屋销售数据,shp/excel格式,2005-2020年数据

基本信息. 数据名称: 全国市级商品房屋销售数据 数据格式: Shp、excel 数据时间: 2005-2020年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1spxse商品房销售额&#xff08;亿元&#xf…

css 表示具有特定类或者其他属性的某种标签类型的元素

需求 通过 css 选择器获取某种标签&#xff08;如&#xff1a;div、input 等&#xff09;具有某个属性&#xff08;如&#xff1a;class、id 等&#xff09;的元素&#xff0c;从而修改其样式。 代码 通过 [标签].[属性] 的方式来获取 <div class"test">&l…

合封芯片开发就找宇凡微,提供合封芯片技术支持与资讯

一、引言 随着科技的迅速发展&#xff0c;芯片在各种电子设备中的地位日益凸显&#xff0c;其中越来越受关注的合封芯片给芯片和pcb厂商带来惊喜 合封芯片是指将多个芯片&#xff08;或其他电子元件&#xff09;封装在一个芯片封装体中的芯片。这种封装方式可以实现多个芯片的…

APP自动化测试工具大全

一、UI自动化测试工具 1. uiautomator2 openatx开源的ui自动化工具&#xff0c;支持Android和iOS。主要面向的编程语言是Python&#xff0c;API设计简洁易用&#xff0c;在开源社区也是很受欢迎。 安装&#xff1a; pip install --upgrade --pre uiautomator2# Or you can …

ArcGIS无法绘制一个或多个图层

背景&#xff1a;在导入一份数据时候&#xff0c;arcmap出现无法绘制一个或多个图层的错误&#xff0c;...点数少于要素所要求的的数量&#xff0c;查阅了半天资料发现是制作数据时候拓扑关系错误造成&#xff0c;现将处理方法详细记录如下&#xff1a; 1.原数据&#xff1a; …

北斗卫星助力消防救援实现精确升级

北斗卫星助力消防救援实现精确升级 在浙江省湖州市&#xff0c;当地消防支队建设了基于北斗系统的“智慧用水”等湖州市“智慧消防”综合信息指挥平台&#xff0c;初步实现了火灾精确预警、精确防范、精确指挥和精确处置。 湖州市“智慧用水系统”通过将北斗系统与地理信息管网…

plf::list原理分析

plf::list是一个比std::list性能要好的另外一种实现&#xff0c;根据作者的性能测试&#xff1a; 293% faster insertion 57% faster erasure 17% faster iteration 77% faster sorting 70% faster reversal 91% faster remove/remove_if 63% faster unique 811% faster clear …

【分享】7-Zip软件如何压缩文件?

7-Zip是一款完全免费的解压缩软件&#xff0c;不仅拥有自己独特的格式&#xff0c;还支持众多主流压缩格式&#xff0c;相比其他解压缩软件&#xff0c;它的压缩率更好&#xff0c;压缩速度更快。今天来分享一下如何使用7-Zip软件来压缩文件。 首先&#xff0c;我们可以到7-Zi…

SpringBoot热部署

SpringBoot热部署 借鉴链接&#x1f517;&#xff1a;SpringBoot中的热部署 添加devtools依赖和pom插件 <!-- devtools 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId&…

C语言——结构体

一、结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量结构的&#xff0c;每个成员可以是不同类型的变量。 二、结构的声明 struct tag {member-list; }variable-list; 描述一个学生&#xff1a; typedef struct Student {char name[20]; //姓名int age; …

SpringBoot入门及整合

前言 Spring Boot是一个基于Spring框架的快速开发脚手架&#xff0c;它简化了Spring应用的初始化和搭建过程&#xff0c;提供了众多便利的功能和特性并且使用"习惯优于配置"的理念&#xff0c;通过提供默认设置来快速搭建应用&#xff0c;同时也保留了灵活性以进行定…

IntelliJ IDEA创建一个spark的项目

在开始之前&#xff0c;需要说明的是 要跑通基本的wordcount程序&#xff0c;是不需要在windows上安装 hadoop 和spark的&#xff0c;因为idea在跑程序的时候&#xff0c;会按照 pom.xml配置文件&#xff0c;从指定的 repository源&#xff0c;按照properties指定的版本&#x…

系统架构设计师教程(一)绪论

系统架构设计师 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1、软件架构常用分类2、系统架构的常用建模方法 1.2 系统架构设计师概述1.3 如何成为一名好的系统架构设计师 1.1 系统架构概述 自1946年第一台计算机诞生以来&#xff0c;计…

LVDS硬件设计

LVDS接口有: 1、四对信号传输差分线&#xff0c;最多传输 4*728bit数据 2、一对时钟。 3、一对差分线有8位&#xff0c;但是最多传输7 bit 的数据。 4、一个LVDS通道只能传输8bit的RGB信号&#xff08;3*8 3 27bit&#xff09;。高于8Bits 就需要两个channel。 5、LVDS的时钟一…

CSS import 规则

导入 “navigation.css” 样式到当前的样式表&#xff1a; import “navigation.css”; /* 使用字符串 / 或者 import url(“navigation.css”); / 使用 url 地址 */ 属性定义及使用说明 CSS import 用于从其他样式表导入样式规则。 import 规则必须在 CSS 文档的头部&#xff…

怎么用qq邮箱发送大视频文件?一分钟解决!

QQ邮箱发送文件时&#xff0c;单个文件的大小不能超过32MB。但是&#xff0c;如果用户发送的邮件包含多个附件&#xff0c;则所有附件的总大小不能超过2GB。所以&#xff0c;下面就向大家介绍这两种不同的文件大小情况如何发送&#xff0c;下面是三种方法具体的操作。 方法一&…