(1)实验平台: 普中ESP32开发板https://item.taobao.com/item.htm?id=693779703604(2)资料下载:普中科技-各型号产品资料下载链接
前面我们已经学习了ESP32的WIFI使用,包括连接路由器、Socket通信和MQTT通信,本章就来应用下Socket,实现手机WIFI连接控制板载LED。本章分为如下几部分内容:
29.1 实验介绍
29.1.1 实验简介
29.1.2 实验目的
29.1.3 MicroPython函数使用
29.2 硬件设计
29.3 软件设计
29.4 实验现象
29.1 实验介绍
29.1.1 实验简介
前面我们已经学习了ESP32的WIFI常用通信方法,要实现远程控制,可使用MQTT通信与云端连接进行数据传输,然后远端设备同样连接到云端收发ESP32数据。但有的场景需要在局域内实现无线控制,比如利用WIFI连接控制小车或家居内智能设备等,此时可使用Socket通信。本实验就使用Socket通信让手机或电脑控制ESP32开发板上LED。
29.1.2 实验目的
使用Socket通信让手机或电脑控制ESP32开发板上LED。
29.1.3 MicroPython函数使用
MicroPython 已经封装好相关模块usocket,它与传统的 socket 大部分兼容,两者均可使用,本实验使用 usocket,对象如下介绍:
其它更多用法请阅读 MicroPython 文档:(搜索:socket)http://docs.micropython.org/en/latest/library/socket.html?highlight=socket
29.2 硬件设计
由于ESP32内置WIFI功能,所以直接在开发板上使用即可,无需额外连接。
29.3 软件设计
下面我们打开“\\4–实验程序\\1–MicroPython实验\\1–基础实验\\28-WIFI实验-手机控制LED”程序。控制代码全部都在main.py中,代码如下:
'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
普中
实验名称:WIFI实验-手机控制LED
接线说明:LED模块–>ESP32 IO
(D1)–>(15)
实验现象:程序下载成功后,手机连接的WIFI需和ESP32连接的WIFI处于同一频段(比如192.168.1.xx),
然后在手机网页输入Shell控制台输出的本机IP地址即可进入手机端网页控制板子LED
注意事项:ESP32作为服务器,手机或电脑作为客户端
'''
#导入Pin模块
from machine import Pin
import time
import network
import socket
#定义LED控制对象
led1=Pin(15,Pin.OUT,Pin.PULL_DOWN)
#连接的WIFI账号和密码
ssid = "puzhong88"
password = "PUZHONG88"
#WIFI连接
def wifi_connect():
wlan=network.WLAN(network.STA_IF) #STA模式
wlan.active(True) #激活
if not wlan.isconnected():
print("conneting to network…")
wlan.connect(ssid,password) #输入 WIFI 账号密码
while not wlan.isconnected():
led1.value(1)
time.sleep_ms(300)
led1.value(0)
time.sleep_ms(300)
led1.value(0)
return False
else:
led1.value(0)
print("network information:", wlan.ifconfig())
return True
#网页数据
def web_page():
if led1.value() == 0:
gpio_state="OFF"
else:
gpio_state="ON"
html = """<html><head> <title>ESP32 LED control</title> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none;
border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
.button2{background-color: #4286f4;}</style></head><body> <h1>ESP32 LED control</h1>
<p>GPIO state: <strong>""" + gpio_state + """</strong></p><p><a href="/?led=on"><button class="button">ON</button></a></p>
<p><a href="/?led=off"><button class="button button2">OFF</button></a></p></body></html>"""
return html
#程序入口
if __name__=="__main__":
if wifi_connect():
#SOCK_STREAM表示的是TCP协议,SOCK_DGRAM表示的是UDP协议
my_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socket连接
# 将socket对象绑定ip地址和端口号
my_socket.bind(('', 80))
# 相当于电话的开机 括号里的参数表示可以同时接收5个请求
my_socket.listen(5)
while True:
# 进入监听状态,等待别人链接过来,有两个返回值,
#一个是对方的socket对象,一个是对方的ip以及端口
client, addr = my_socket.accept()
print('Got a connection from %s' % str(addr))
# recv表示接收,括号里是最大接收字节
request = client.recv(1024)
request = str(request)
print('Content = %s' % request)
led_on = request.find('/?led=on')
led_off = request.find('/?led=off')
if led_on == 6:
print('LED ON')
led1.value(1)
if led_off == 6:
print('LED OFF')
led1.value(0)
response = web_page()
client.send('HTTP/1.1 200 OK\\n')
client.send('Content-Type: text/html\\n')
client.send('Connection: close\\n\\n')
client.sendall(response)
client.close()
有关网页编程及格式大家可上网百度,网上有详细教程。
29.4 实验现象
下载程序前,按照如下接线:
首先要确认ESP32连接的WIFI网络与手机端或电脑端同一个,比如ESP32模块连接路由器WIFI,然后手机或者电脑也连接同一路由器。
注意:程序中ssid和password为所要连接路由器的WIFI账号和密码,按照自己路由器账号密码自行修改即可。如下所示:
将程序下载到开发板内(可参考第2章节“2.2.5 程序下载运行”),实验现象:软件Shell控制台上输出当前模块的IP地址和端口。
可打开手机浏览器或电脑浏览器输入对应IP,然后即可显示控制页面,通过点击页面中的ON或OFF按钮控制板子LED。
评论前必须登录!
注册