# ESP32 **Repository Path**: bh-feng/esp32 ## Basic Information - **Project Name**: ESP32 - **Description**: ESP32WIFI控制LED - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2022-06-12 - **Last Updated**: 2024-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ESP32工程 ## 目录 1. [ESP32WIFI编程](# 1、ESP32WIFI编程) 2. [ESP32PC端控制LED](# 2、ESP32PC端控制LED) --- ### 1、ESP32WIFI编程 ESP32中自带WIFI功能模块,本工程事基于**Micropython**编写的。这里工程代码借鉴于[IT项目网](https://doc.itprojects.cn/0006.zhishi.esp32/02.doc/index.html#/README)。 ESP32Wifi编程主要有一下几个步骤: >1. 设置工作模式 >2. 链接Wifi服务器 >3. 创建套接字以发送数据 #### (1)设置工作模式 `Wi-Fi`网络环境通常有两种设备: * `Access Point(AP)` 无线接入点,提供无线接入的设备,家里的光猫就是结合WiFi和internet路由功能的AP。AP和AP可以相互连接。 * `Station(STA)` 无线终端,连接到AP的装置,手机,电脑等需要联网的设备都是出于STA模式,这个模式不允许其他设备接入 ```PYTHON import network wlan = network.WLAN(network.STA_IF) ``` #### (2)链接Wifi服务器 以下是[官方文档][id]的例程: ```PYTHON import network wlan = network.WLAN(network.STA_IF) # create station interface wlan.active(True) # activate the interface wlan.scan() # scan for access points wlan.isconnected() # check if the station is connected to an AP wlan.connect('essid', 'password') # connect to an AP wlan.config('mac') # get the interface's MAC address wlan.ifconfig() # get the interface's IP/netmask/gw/DNS addresses ``` * `essid`其实和ssid相同,就相当于多个路由器公用这个名字,是一个总称。比如`nuaa.wifi6`。 * `ssid`就是手机上搜索到的wifi名(本质是一串**字符**) #### (3)创建套接字以发送数据 使用套接字发送数据主要有以下几个步骤: >1. 创捷套接字(socket) >2. 发送/接收数据 >3. **关闭**套接字 想要深入了解什么是套接字Socket,可以参考以下链接: https://doc.itprojects.cn/0001.zhishi/python.0006.networkprogram/index.html#/03.pingifconfig 简而言之,套接字(socket)就是网络中运行的进程之间相互通信的一种方式,而不同PC端进程之间的通讯需要的条件有: >1. 明确是哪台电脑到哪台电脑,即用ip地址来标记 >2. 明确电脑上的那个程序,即用端口来标记 >3. 还要明确怎样进行传送数据,即网络协议(可以通俗的理解为怎样发送数据,怎样接收数据的规范,这里我们主要使用UDP) #### Step1:创建套接字 ```python import socket s = socket.socket(AddressFamily, Type) ``` * `AddressFamily`:可以选择`AF_INET`(用于Internet进程之间通讯)或者`AF_UNIX`(用于同一台机器进程间通信),实际工作中常用的是`AF_INET` * `Type`:套接字的类型,可以是`SOCK_STREAM`(流式套接字,主要用于 TCP 协议)或者 `SOCK_DGRAM`(数据报套接字,主要用于 UDP 协议) ```python from socket import * #创建UDP套接字 s = socket(AF_INET, SOCK_DGRAM) #不使用时关闭套接字 s.close() ``` #### Step2:发送接收数据 发送接收数据时需要协议的,主要协议有: * `udp`:只负责发送,不管是否成功接收 * `tcp`:每发送一个数据,接收方需要发送一个响应即收到了 ```python from socket import * # 1. 创建udp套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 设置UDP套接字允许其广播(注意如果udp套接字需要广播,则一定要添加此语句) #udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #绑定端口号 端口号不能绑定1-1023,且这个端口不能被占用 #如果需要绑定端口,需要先绑定再接收发送 udp_socket.band('ip可以不绑定',7788) # 2. 准备接收方的地址 dest_addr = ('192.168.31.56', 8080) # 3. 从键盘获取数据 send_data = input("请输入需要发送的数据") # 4. 发送数据到指定的电脑上 udp_socket.sendto(send_data.encode('utf-8'), dest_addr) # 5. 接收数据并打印 recv_msg=udp_socket.recvfrom(1024) #udp_socket.recvfrom(接收数据的最大数量) print("%s(%d)>>>%s" % (recv_msg[1][0],recv_msg[1][1],(recv_msg[0].decode("gbk"))) # 6. 关闭套接字 udp_socket.close() ``` ### 2、ESP32PC端控制LED #### 2.1 运行代码 ```python #流程 #1.Connect wifi #2.Create socket #3.receive Udqp #4.on/off led import socket import machine import time import network #======================连接Wifi====================== def wifi_connect(): wlan=network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): wlan.connect('Xiaomi_F627','12345678') i=1 while not wlan.isconnected(): print("正在连接网络。。。{}".format(i)) time.sleep(1)#1s询问一次 print('network config:',wlan.ifconfig()) #======================创建套接字====================== def create_udp_socket(): udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) udp_socket.bind(("0.0.0.0",6789)) return udp_socket def main(): led = machine.Pin(2, machine.Pin.OUT) led.value(1) time.sleep(1) led.value(0) #1.Connect wifi wifi_connect() #2.Create socket udp_socket=create_udp_socket() #3.receive Udqp while True: recv_data, sender_info = udp_socket.recvfrom(1024) print("{}发送{}".format(sender_info, recv_data)) recv_data_str = recv_data.decode("utf-8") try: print(recv_data_str) except Exception as ret: print("error:", ret) # 处理接收的数据 if recv_data_str == "light on": print("这里是要灯亮的代码...") led.value(1) elif recv_data_str == "light off": print("这里是要灯灭的代码...") led.value(0) elif recv_data_str == "light triggle": print("这里是要灯闪烁的代码...") for i in range(5) : led.value(1) time.sleep(0.5) led.value(0) time.sleep(0.5) if __name__ == '__main__': main() ``` #### 2.2 运行效果 |网络调试助手|python运行结果| |:---:|:---:| ||| [id]:https://docs.micropython.org/en/latest/esp32/quickref.html#