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

【ESP32+MicroPython】热点模式及网页控制

在物联网项目中,ESP32作为接入点(AP)可以生成热点网络,设备连接到ESP32后,可以通过Web页面进行交互,例如控制LED的亮灭。本文将讲解如何在MicroPython下实现:

  1. ESP32作为Wi-Fi热点;
  2. 创建简单的Web服务器;
  3. 控制LED的亮灭。

通过学习本教程,你将能够使用ESP32在局域网中创建网页控制器,实现LED灯的远程控制。

搭建ESP32热点

ESP32作为Wi-Fi接入点,可以创建热点,供其他设备连接。热点模式适用于无需外部网络的本地控制场景。

代码实现

我们首先定义一个函数,使ESP32创建一个热点并显示其IP地址。

import networkdef create_ap(ssid, password):ap = network.WLAN(network.AP_IF)       # 配置为AP模式ap.active(True)                        # 激活AP模式ap.config(essid=ssid, password=password)  # 设置热点SSID和密码print("热点已启动,IP地址为:", ap.ifconfig()[0])# 启动热点
create_ap("ESP32_Hotspot", "12345678")
  • network.WLAN(network.AP_IF):配置Wi-Fi为AP模式。
  • ap.config(essid=ssid, password=password):设定热点的名称和密码。
  • ap.ifconfig():获取网络配置,ap.ifconfig()[0]返回IP地址。

现在,ESP32将创建一个名为ESP32_Hotspot的Wi-Fi热点,密码为12345678。设备可以连接此热点进行通信。

创建Web服务器

ESP32作为HTTP服务器,可以在用户访问其IP地址时返回网页并接受用户的请求,接下来我们将搭建简单的服务器,实现网页控制LED。

代码实现

我们创建一个简单的Web服务器,允许用户通过点击网页上的按钮来控制LED的开关。

import socket
from machine import Pin# LED连接的GPIO引脚
led = Pin(2, Pin.OUT)def web_page():"""生成网页内容"""# HTML代码,包含按钮用以控制LED状态html = """<html><head><title>ESP32 LED控制</title></head><body><h2>ESP32 LED 控制器</h2><p>点击按钮来切换LED状态。</p><a href="/?led=on"><button>LED ON</button></a><a href="/?led=off"><button>LED OFF</button></a></body></html>"""return html# 创建并启动服务器
def start_server():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(('', 80))s.listen(5)print("服务器启动,监听端口80")while True:conn, addr = s.accept()print("客户端连接自", addr)request = conn.recv(1024).decode()print("请求内容:", request)# 检测请求中的LED控制指令if '/?led=on' in request:led.value(1)  # 点亮LEDelif '/?led=off' in request:led.value(0)  # 熄灭LED# 返回HTML页面response = web_page()conn.send("HTTP/1.1 200 OK\n")conn.send("Content-Type: text/html\n")conn.send("Connection: close\n\n")conn.sendall(response)conn.close()# 运行服务器
start_server()
  • LED控制:在web_page()中生成一个简单的HTML页面,包含两个按钮:LED ONLED OFF。这些按钮指向带有不同参数的URL,用于控制LED。
  • 请求解析if '/?led=on' in request检测GET请求中的参数来判断是否需要点亮或熄灭LED。
  • HTTP响应conn.send()用于将网页内容返回给客户端。

运行效果

  • 将ESP32连接至电源,其他设备连接至ESP32_Hotspot热点。
  • 打开浏览器访问ESP32的IP地址(如192.168.4.1)。
  • 点击按钮即可控制LED的亮灭状态。

状态反馈

在实际应用中,通常需要在页面上实时显示LED的状态。我们可以对网页进行扩展,使页面根据LED状态动态显示。

def web_page():"""生成带状态反馈的网页内容"""# 检查LED当前状态if led.value() == 1:led_state = "ON"else:led_state = "OFF"html = """<html><head><title>ESP32 LED控制</title></head><body><h2>ESP32 LED 控制器</h2><p>LED 当前状态: <strong>{}</strong></p><a href="/?led=on"><button>LED ON</button></a><a href="/?led=off"><button>LED OFF</button></a></body></html>""".format(led_state)return html

刷新页面时会动态显示LED状态(ON或OFF),更便于用户了解设备当前状态。

完整代码

以下是实现上述功能的完整代码,将ESP32设为热点,启动Web服务器,并通过网页控制LED。

import network
import socket
from machine import Pin# 创建热点
def create_ap(ssid, password):ap = network.WLAN(network.AP_IF)ap.active(True)ap.config(essid=ssid, password=password)print("热点已启动,IP地址为:", ap.ifconfig()[0])# LED控制代码
led = Pin(2, Pin.OUT)def web_page():"""生成网页内容并包含LED状态"""led_state = "ON" if led.value() == 1 else "OFF"html = """<html><head><title>ESP32 LED控制</title><meta charset="UTF-8"></head><body><h2>ESP32 LED 控制器</h2><p>LED 当前状态: <strong>{}</strong></p><a href="/?led=on"><button>LED ON</button></a><a href="/?led=off"><button>LED OFF</button></a></body></html>""".format(led_state)return htmldef start_server():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(('', 80))s.listen(5)print("服务器启动,监听端口80")while True:conn, addr = s.accept()print("客户端连接自", addr)request = conn.recv(1024).decode()print("请求内容:", request)if '/?led=on' in request:led.value(1)  # 点亮LEDelif '/?led=off' in request:led.value(0)  # 熄灭LEDresponse = web_page()conn.send("HTTP/1.1 200 OK\n")conn.send("Content-Type: text/html\n")conn.send("Connection: close\n\n")conn.sendall(response)conn.close()# 启动程序
create_ap("ESP32_Hotspot", "12345678")
start_server()

总结

本文介绍了ESP32在MicroPython环境下的Wi-Fi热点模式、简单Web服务器搭建及GPIO控制方法。通过将这些功能组合,你可以构建基于ESP32的局域网控制系统,实现对LED等外设的网页控制。这种方法非常适合本地物联网项目,如家居自动化、传感器数据展示等。


http://www.mrgr.cn/news/66334.html

相关文章:

  • 安科瑞Acrel-2000ES储能柜能量管理系统的详细介绍-安科瑞 蒋静
  • 第十二章 spring Boot+shiro权限管理
  • MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!
  • 第3章 CentOS系统管理
  • Oracle OCP认证考试考点详解082系列11
  • 语言模型的采样方法
  • 产品增长之付费推广
  • 光伏设计软件如何快速上手?
  • 【万字详文介绍】:迭代扩张卷积神经网络(IDCNN)
  • 模拟实现C库函数~
  • 【OJ题解】在字符串中查找第一个不重复字符的索引
  • 华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力5-识别平面语义
  • 【LeetCode】【算法】146. LRU缓存
  • Python学习笔记-生成器的应用与原理
  • 好看的超清4K视频素材去哪儿找?下载素材资源网站推荐
  • AI大模型重塑软件开发:流程、优势、挑战与展望
  • 「C/C++」C/C++标准库 之 #include<cctype> 字符分类处理库
  • 牛客周赛 66 F 小苯的字符提前
  • 进程的调度(超详细解读)
  • Day 49 || 1143.最长公共子序列、1035.不相交的线、 53. 最大子序和 、392.判断子序列
  • Java入门(8)--反射机制
  • 零基础学习Spring AI Java AI SpringBoot AI调用大模型OpenAi Ollama集成大模型
  • HarmonyOS开发 - Ability往页面(Pages)中传递数据
  • 年薪平均几十万?!哪些行业的软件测试工程师需求量大,前景好?
  • ubuntu工具 -- ubuntu服务器临时没有网络,急需联网下载东西怎么办? 使用手机提供网络
  • @ApiOperation(“修改帐号状态“)详细解释一下以上代码