【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 do
        LED_RUN(0)
        sys.wait(500)
        LED_RUN(1)
        sys.wait(500)
    end
end

-- 任务1--OLED显示
function Task1_OLED()
    log.info("Task1_OLED_Init")
    -- 初始化硬件i2c的ssd1306
    u8g2.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 do
        u8g2.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 = 100
            return 200, {},"ok"
        elseif uri == "/led/0" then
            -- LED_PWM(0)
            _G.LedPwm_Data = 0
            return 200, {},"ok"
        elseif uri == "/mode/0" then
            _G.LedMode = 0
            return 200, {},"ok"
        elseif uri == "/mode/1" then
            _G.LedMode = 1
            return 200, {},"ok"
        -- elseif uri:find("/led_pwm/") then
        elseif string.find(uri,"/led_pwm/") then
            log.info("YS:" .. string.match(uri,"%d+"))
            _G.LedPwm_Data = string.match(uri,"%d+")  
        end
        -- 无响应返回
        return 404, {}, "Not Found" .. uri
    end)
    log.info("WIFI_status:",wlan.ready())
    while true do
        sys.wait(500)
    end
end

-- 任务3--BH1750光感
function Task3_BH1750()
    log.info("Task3_BH1750_OK")
    i2c.setup(0,i2c.FAST)
    bh1750.init(0)--初始化,传入i2c_id
    while 1 do
        local bh1750_data = bh1750.read_light()
        _G.BH1750_DATA = bh1750_data
        log.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 do
        if _G.LedMode == 0 then         -- 手动模式
            pwm.open(12, 1000, _G.LedPwm_Data) -- 频率1000hz, 占空比0-100
        elseif _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)
            end
        end
        sys.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)
end


sys.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 * key
            document.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.猫群算法4.实验参数设定5.算法结果6.参考文献7.MA…

c++ map

unordered_map #include <iostream> #include <string> #include <unordered_map>int main() {// 创建包含三个字符串的&#xff08;映射到字符串的&#xff09;unordered_mapstd::unordered_map<std::string, std::string> u {{"red", &qu…

el-collapse 默认展开第一个(实测有效)

<el-collapse accordion v-model"activeCollapse"> <el-collapse-item v-for"(item, index) in assetList" :name"index" :key"item.id" > 我这个是通过循环, 只需要v-model 绑定的值和 name 相等,就可以实现展开 然后就…

調整 Windows server DHCP 日誌存儲大小

(1) 開啟 [Windows PowerShell] (2) 查看 DHCP Server 稽核 Log 設定 PS C:\> Get-DhcpServerAuditLog (3) 設定 DHCP Log 檔案大小 PS C:\> Set-DhcpServerAuditLog -MaxMBFileSize 700 註冊表位置&#xff1a;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\S…

【产品经理】需求池和版本树

在这个人人都是产品经理的时代&#xff0c;每位入行的产品人进阶速度与到达高度各有不同。本文作者结合自身三年产品行业的经历&#xff0c;根据案例拆解产品行业的极简研发过程、需求池、版本树、产品自我优化等相关具体方法论。 一、产品研发的极简过程 1. 产品概述 产品就…

【笔记】硬件工程师入门基础课程

学习视频&#xff08;b站&#xff09;&#xff1a;硬件工程师入门基础元器件课程 基础元器件课程 p1 电阻1. 定义、特性及参数1.1 色环电阻 识别方法&#xff1a;1.2 伏安特性1.3 基本参数 2.电阻的功能2.1 分压2.2 限流2.3 浪涌保护 3. 如何选择电阻 p2 电容1. 电容的定义1.1电…

SpringBoot入门及整合

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

Python使用其它文件夹中的.py文件

一、背景 在python构建的工程中&#xff0c;A.py 可能要使用 B.py 文件中的函数、或者类、或者变量&#xff0c;如果这两个文件在同一个目录下&#xff0c;只需要在 A.py 中使用 import B 即可&#xff0c;但如果不在同一目录下&#xff0c;则这种方法不可用&#xff0c;将工程…

阿木实验室普罗米修斯项目环境配置

引言 普罗米修斯项目其实只是个大ROS功能包&#xff0c; 里面每个模块就是每个ROS功能包&#xff0c;比如控制模块&#xff0c;视觉模块等等。对PX4配置的与这个一样&#xff0c;另外他是使用自己的P系列无人机&#xff08;我个人是&#xff30;450&#xff09;&#xff0c;所…

系统延时函数的实现

滴答定时器的工作原理 STM32F103的内核时钟由AHB总线时钟(72M)经过8分频得到&#xff0c;即72/89M LOAD的取值范围是0-1677215&#xff0c;也就是VAL最多可以计2^24次。 滴答定时器的寄存器 系统延时函数的配置 当需要计1us(1/100 0000)时&#xff0c;9M的时钟就要计9次&#x…

TOWE 高品质220V/380V工业插头插座:插座篇

在不同工业场合和环境中&#xff0c;对工业用插头插座和耦合器的配置有着不同的要求。在实际应用中&#xff0c;我们要根据用途、工作环境、规格大小、外观造型、安装形式、功能等方面进行选择。只有确保正确选择产品&#xff0c;才能确保现实用电环境的安全、高效。 同为科技&…

AntDB-M的审计功能

数据库的审计功能是指对数据库访问行为进行监管&#xff0c;记录数据库里面发生了什么操作&#xff0c;是数据库系统安全功能的组成部分。 AntDB-M的审计功能关注客户端的连接信息&#xff0c;比如&#xff1a;用户名和主机地址、客户端发送的SQL语句、SQL执行访问的对象、修改…

CSS3颜色渐变选择-可以自由拖动DIV的渐变颜色,并直接复制代码即可,方便快捷,供大家学习研究参考

用CSS3实现DIV渐变 可以自由拖动DIV的渐变颜色,并直接复制代码的一款插件 <script src="lib/js/jquery.js"></script> <!-- <script src="lib/js/jquery-ui.js"></script> --> <!-- <link type="text/css"…

Leetcode—713.乘积小于 K 的子数组【中等】

2023每日刷题&#xff08;五十六&#xff09; Leetcode—713.乘积小于 K 的子数组 实现代码 class Solution { public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {int ans 0;int len nums.size();int l 0, r 0;int prod 1;if(k < 1) {re…

TailwindCSS 如何设置 placeholder 的样式

前言 placeholder 在前端多用于 input、textarea 等任何输入或者文本区域的标签&#xff0c;它用户在用户输入内容之前显示一些提示。浏览器自带的 placeholder 样式可能不符合设计规范&#xff0c;此时就需要通过 css 进行样式美化。 当项目中使用 TailwindCSS 处理样式时&a…

知网查重重复率多少标红 神码ai

大家好&#xff0c;今天来聊聊知网查重重复率多少标红&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 知网查重重复率多少标红 在论文撰写过程中&#xff0c;我们常常需要使用各种查重工具来检测论文的…

在我们日常生活有哪些东西是激光切割机做的

激光加工技术是当前最先进的切割技术&#xff0c;在工业生产中&#xff0c;能解决许多常规方法无法解决的难题&#xff0c;而且应用非常广。让人意想不到的是&#xff0c;很多生活中常见的物品&#xff0c;都是靠激光切割完成的。 它具备精密制造、柔性切割、异形加工、一次成型…

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

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

音频APP商业化指南及广告收益提升攻略 | TopOn变现干货

注&#xff1a;声音类娱乐细分行业包括在线音乐、网络音频和网络K歌&#xff0c;本文主要探讨狭义的网络音频行业&#xff0c;其形式包括有声书、相声评书、知识课程、广播剧等版权内容、播客以及语音直播和社交形式。 近年来&#xff0c;音频赛道步入高速增长期。艾媒咨询的最…

破译模式:模式识别在计算机视觉中的作用

一、介绍 在当代数字领域&#xff0c;计算机视觉中的模式识别是关键的基石&#xff0c;推动着众多技术进步和应用。本文探讨了计算机视觉中模式识别的本质、方法、应用、挑战和未来趋势。通过使机器能够识别和解释视觉数据中的模式&#xff0c;模式识别不仅推动了计算机视觉领域…