ESP32+UARTHMI屏幕扫描WiFi并连接
- mircopython
- python
- ESP32的python
- 串口屏
- 串口屏程序
- arduino*不可用*
mircopython
python
- 原因
本人对C语言比较精通,但是乐鑫官网的ESP-IDF安装较为复杂,arduino安装较为简单但是arduino语言与C++语言更为相似,以至于对于String、const char*等字符串处理略有欠缺。通过arduino写的程序虽然编译通过了,但是实际运行时显示内存溢出,最后我不得不放弃arduino选择了micropython。 - 安装
mircopython对python用户比较友好,相对于C语言与C++,字符串的处理更加简单,而且python以缩进定义函数域,对于C语言、C++或者其他语言的使用者来说,只要有良好的写作习惯,很难在缩进问题上出现错误。
下年是我使用的固件以及编辑器,没有使用VScode是因为Thonny对ESP32内部文件操作更加方便。烧录也可以使用Thonny,再次不在详述。
ESP32python固件 编辑器:thonny
ESP32的python
烧录固件后,打开Thonny,连接ESP32设备后就进入了python命令行,可以通过指令对ESP32进行控制。
也可以编辑main.py保存到ESP32之中,ESP32复位后会直接运行main.py
串口屏
对于串口屏我也不再做过多描述,只是需要住以要取消串口屏的数据返回功能,因为不管是哪种固件,ESP32复位后都会输出设备信息,一旦处理不好会导致ESP32接受的数据混乱。
#-*-coding:utf-8-*-
import machine
import network
import esp32
import time
import socket
pin33 = machine.Pin(33, machine.Pin.OUT)
pin33.value(0)
essid=""
password=""
#print("ok")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
print("",end=b"\xff\xff\xff")
time.sleep(1)
print("page ssid",end=b"\xff\xff\xff")
while True:
if wlan.status()==1010:
print("",end=b"\xff\xff\xff")
time.sleep(1)
print("page message",end=b"\xff\xff\xff")
time.sleep(1)
print("ip.txt=\""+wlan.ifconfig()[0]+"\"",end=b"\xff\xff\xff")
soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
soc.bind((wlan.ifconfig()[0], 9999))
while True:
data, addr = soc.recvfrom(1024)
print(data)
if wlan.status()!=1010&len(essid)!=0&len(password)!=0:
print('connecting to network...')
wlan.connect(essid, password)
recerve=input()
if recerve.find("scan")==0 :
wifiData=wlan.scan()
n=0
print("",end=b"\xff\xff\xff")
while n<len(wifiData):
print("t"+str(n)+".txt=\""+str(wifiData[n][0])[2:-1]+"\"",end=b"\xff\xff\xff")
n=n+1
if recerve.find("ssid")==0 :
essid=recerve[5:]
if recerve.find("pass")==0 :
password=recerve[5:]
wlan.connect(essid,password)
if recerve.find("disc")==0 :
wlan.disconnect();
print("page ssid",end=b"\xff\xff\xff")
这段代码有两个问题,
一:一旦连接wifi无法断开,只能复位。
二:不知道为什么,输入两次密码才能被判定连接成功与否
出现这两个问题的原因主要是input()函数无法设定超时,而使用串口函数或许能够解决该问题,或者有其他单线程解决此类问题方法可以共同探讨,留言评论,或者加我QQ:1719602121备注ESP即可
我也会附上arduino代码,希望各位能给予指导。
串口屏程序
串口屏程序在我的资源之中,串口屏
arduino不可用
#include <iostream>
#include <string.h>
#include<WiFi.h>
char *ssid="0 ";
char *password="0 ";
char *data="0 ";
char *str="0 ";
String sdata="0 ";
void setup()
{
Serial.begin(115200);
pinMode(33,OUTPUT);
Serial.println("ok");
Serial.print("\xff\xff\xff");
// WiFi.begin(ssid,password);
// while (WiFi.status()!= WL_CONNECTED) {
// delay(500);
// Serial.println("Connectingto WiFi..");
// }
// Serial.println("Connectedto the WiFi network");
digitalWrite(33,LOW);
}
void loop() {
while(Serial.available() > 0)
{
sdata =Serial.readString();
strcpy(data,sdata.c_str());
str=strtok(data,":");
}
if (strncmp(str,"scan",4)==0)
{
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
int n = WiFi.scanNetworks();
for (int i = 0; i < n; ++i)
{
Serial.print("t");
Serial.print(i);
Serial.print(".txt=\"");
Serial.print(WiFi.SSID(i));
Serial.print("\"");
Serial.print("\xff\xff\xff");
delay(10);
}
strcpy(data,"");
}
if (strncmp(str,"ssid",4)==0)
{
str=strtok(data,":");
strcpy(ssid, str);
strcpy(data,"");
}
if (strncmp(str,"pass",4)==0)
{
str=strtok(data,":");
strcpy(password, str);
WiFi.begin(ssid,password);
while (WiFi.status()!= WL_CONNECTED)
Serial.print("page message");
Serial.print("\xff\xff\xff");
Serial.print("ssid.txt=\"");
Serial.print(ssid);
Serial.print("\"");
Serial.print("\xff\xff\xff");
Serial.print("ip.txt=\"");
Serial.print(WiFi.softAPIP());
Serial.print("\"");
Serial.print("\xff\xff\xff");
strcpy(data,"");
}
strcpy(data,"");
}