【LuatOS】简单案例网页点灯

news2024/11/23 3:48:36

材料

硬件:合宙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

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

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

相关文章

人工智能导论习题集(1)

第二章&#xff1a;知识表示 题1题2题3题4题5 题1 题2 题3 题4 题5

【从零开始学习JVM | 第六篇】快速了解 直接内存

前言&#xff1a; 当谈及Java虚拟机&#xff08;JVM&#xff09;的内存管理时&#xff0c;我们通常会想到堆内存和栈内存。然而&#xff0c;还有一种被称为"直接内存"的特殊内存区域&#xff0c;它在Java应用程序中起着重要的作用。直接内存提供了一种与Java堆内存和…

DRBD分布式存储实验

DRBD DRBD的全称为&#xff1a;Distributed Replicated Block Device (DRBD) 分布式块设备复制 与心跳连接结合使用&#xff0c;构建高可用性(HA)的集群。 实现方式是通过网络来镜像(mirror)整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。DRBD负责接收数据…

[Linux] Tomcat

一、Tomcat相关知识 1.1 Tomcat的简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。Tomc…

Python从入门到精通九:Python异常、模块与包

了解异常 什么是异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”, 也就是我们常说的BUG bug单词的诞生 早期计算机采用大量继电器工作&#xff0c;马克二型计算机就是这样的。 19…

元素定位,年轻人在 Web UI 自动化成长道路上吃的第一个亏

元素定位&#xff0c;对于 Web UI 自动化而言&#xff0c;绝对是大家成长道路上的一道绊脚石。很多初学者&#xff0c;都“死”在了元素定位上&#xff0c;从而失去了学习的兴趣。导致职业规划不得不半途而废~那么&#xff0c;今天&#xff0c;我们就使用 Katalon Studio&#…

我的创作三周年纪念日

今天收到CSDN官方的来信&#xff0c;创作三周纪念日到了。 Dear: Hann Yang &#xff0c;有幸再次遇见你&#xff1a; 还记得 2020 年 12 月 12 日吗&#xff1f; 你撰写了第 1 篇技术博客&#xff1a; 《vba程序用7重循环来计算24》 在这平凡的一天&#xff0c;你赋予了它…

Python编程技巧 – 使用组合运算符

Python编程技巧 – 使用组合运算符 Python Programming Skills – Using Combined Operators Python通过赋值过程&#xff0c;将声明变量与赋值和而为之&#xff0c;可谓讲求效率。此外&#xff0c;在Python赋值运算符里&#xff0c;也有一个强大高效的功能&#xff0c;即复合…

Python 神奇解码器:pyWhat 库全面指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今数字化的世界中&#xff0c;理解和处理文本数据是许多应用程序的关键任务。而PyWhat库作为一个用于处理文本的Python库&#xff0c;提供了强大的功能&#xff0c;帮助开发者在文本中识别和提取有意义的信息…

n-Track Studio Suite,音频录制与编辑的新纪元

在音乐制作领域&#xff0c;n-Track Studio Suite已经成为了音频录制和编辑的新标杆。这款软件将功能强大、操作简便和艺术创新完美融合&#xff0c;为用户提供了前所未有的音乐制作体验。 n-Track Studio Suite以其先进的音频处理技术&#xff0c;提供了精确的音频录制、编辑…

【从零开始学习JVM | 第三篇】类的生命周期(高频面试)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。 在本文中&#xff0c;我们将深入探讨类的生命周期&#xff0c;从类加载到…

VUE3语法--toRefs与toRef用法

1、功能概述 ref和reactive能够定义响应式的数据&#xff0c;当我们通过reactive定义了一个对象或者数组数据的时候&#xff0c;如果我们只希望这个对象或者数组中指定的数据响应&#xff0c;其他的不响应。这个时候我们就可以使用toRefs和toRef实现局部数据的响应。 toRefs是…

【探讨】bp神经网络是前馈还是后馈

目录 一、BP神经网络简介 1.1 什么是BP神经网络 1.2 BP神经网络的结构 二、BP神经网络的前馈与后馈 2.1 什么是BP神经网络的前馈 2.2 什么是BP神经网络的后馈 三、BP神经网络前馈与后馈的关系 3.1 BP神经网络前馈与后馈的区别 3.2 BP神经网络前馈与后馈的意义 四、BP…

论文阅读三——端到端的帧到凝视估计

论文阅读三——端到端的帧到凝视估计 主要内容研究问题文章的解题思路文章的主要结构 论文实验关于端到端凝视估计的数据集3种基线模型与EFE模型的对比在三个数据集中与SOTA进行比较 问题分析重要架构U-Net 基础知识 主要内容 文章从端到端的方法出发&#xff0c;提出了根据he…

Linux---虚拟机软件

1. 虚拟机软件的介绍 它是能够虚拟出来计算机的一个软件。 常用虚拟机软件: VmwareVirtualBox 说明: 只有安装了虚拟机软件才可以创建虚拟机&#xff0c;当然通过虚拟机软件还可以创建多个虚拟机。 2. 虚拟机的介绍 就是模拟一个真实的计算机&#xff0c;好比一个虚拟的…

Mybatis映射接口的动态代理实现原理

Mybatis映射接口的动态代理实现原理 在上一节中&#xff0c;我们介绍了MyBatis的核心配置文件加载流程&#xff0c;Mybatis核心配置文件加载流程详解 在文中&#xff0c;我们介绍了MyBatis在加载配置文件的过程中会针对每个接口类都生成一个相应的MapperProxyFactory动态代理工…

【异常解决】SpringBoot + Maven 在 idea 下启动报错 Unable to start embedded Tomcat(已解决)

Unable to start embedded Tomcat&#xff08;已解决&#xff09; 一、背景介绍二、原因分析2.1 网络上整理2.2 其他原因 三、解决方案 一、背景介绍 spring boot(v2.5.14) maven idea 启动项目 之前项目一直启动的好好的&#xff0c;都能正常运行。重启的时候突然就不能启…

单元测试技术

文章目录 一、单元测试快速入门二、单元测试断言三、Junit框架的常用注解 一、单元测试快速入门 所谓单元测试&#xff0c;就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试。 常规的例如如果在main中测试&#xff0c;比如说我们写了一个学生管理系统&…

MSPM0L1306例程学习-ADC部分(1)

MSPM0L1306例程学习-ADC部分(1) MSPM0L1306例程学习 使用的TI的官方例程&#xff0c;即SDK里边包含的例程代码。 MCU使用的是MSPM0L1306, 对于ADC部分&#xff0c;有10个例程&#xff1a; 例程理解 ADC的转换有多种工作模式&#xff0c;从最简单的单通道单次转换开始入手…

C++共享和保护——(1)作用域

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;要想平衡就…