在现代电子项目中,单片机如Arduino或ESP32等微控制器因其灵活性和低成本而受到广泛欢迎。这些设备能够通过多种方式与外部世界进行交互,包括通过串行端口、LCD显示屏、蓝牙和Wi-Fi通信协议等。本文将介绍如何使用ESP32开发一个基于WiFi的Web服务器应用,并通过Arduino IDE进行编程。
首先,需要了解WiFi的两种工作模式:一种是作为现有WiFi网络的客户端,另一种是作为访问点(AP)。在本文中,将关注后者,即ESP32作为访问点。为了实现这一点,需要使用两个库:WiFi.h库用于设置WiFi部分,WebServer.h库用于构建Web页面。
接下来,将详细介绍如何设置WiFi服务器。虽然互联网上有许多教程详细介绍了如何实现服务器,但本文将重点介绍如何创建一个有效的应用程序,而不会过分关注美学。
在设置函数中,首先创建一个软访问点:
void setup() {
// Create SoftAP
WiFi.softAP(ssid, password);
WiFi.softAPConfig(local_ip, gateway, subnet);
server.on("/", handle_root);
server.onNotFound([](){server.send(404, "text/plain", "The content was not found.")});
server.begin();
}
在这里,使用WebServer库来模拟事件驱动的应用程序。例如,server.on("/", handle_root)将一个函数附加到一个请求上,在这种情况下,获取根页面"/"的请求将由函数handle_root满足。可以为服务器最终需要提供的每个“页面”附加函数,也可以为未知请求附加函数。
在循环函数中,有listen指令以及一个延迟,用于模拟板卡功能,即对控制、传感器等的定时循环。串行通信用于模拟中断以激活WiFi,它需要持续监听(注意小的delay(10)):
void loop() {
while(Serial.available() > 0) {
char cmd = Serial.read();
if(cmd == 115) listen = !listen;
// s start/stop listening
Serial.println(listen? "WEB on" : "WEB off");
}
if(listen) server.handleClient();
else delay(1980);
delay(10);
}
处理请求的函数(右侧)并不特别有趣。通过args()方法获取的URL中参数的数量,可以区分请求,例如,如果数量为0,则发送根页面,否则可能是Ajax请求,通过arg("c")方法,函数检索并执行所需的命令。
HTML页面包含两个按钮,与onClick事件相关联,一个数字输入和一个用于接收答案的pre格式化标签。Ajax函数在接收到数据后,直接将其添加到pre格式化标签中。
<!DOCTYPE html>
<html>
<meta name='viewport' content='width=device-width, initial-scale=1'/>
<body>
<h1>Condor Web Server with ESP32 - AP Mode</h1>
<input type='button' value='Set time' onClick='ajx("c=h&n="+$("n").value)'/>
<input type='number' id='n' value='36000'/>
<p>
<input type='button' value='Get temp.' onClick='ajx("c=t")'/>
</pre>
</pre>
<script type='text/javascript'>
$=i=>document.getElementById(i);
ajx=u=>{
var x = new XMLHttpRequest();
x.onreadystatechange = () => {
if(x.readyState == 4) {
if(x.status == 200) $( 'f').innerHTML += '\\n' + x.responseText;
else $( 'f').innerHTML = 'Err: ' + x.status;
}
};
x.open('GET', '?'+u, true);
x.send(null)
}
</script>
</body>
</html>
meta标签告诉浏览器适应客户端大小,因此在手机上,页面是可接受的。
要访问板卡,检查设备必须连接到WiFi板(通过设置中的App设置部分),然后在浏览器中输入IP,例如192.168.1.1;它应该显示一个页面,用户可以要求温度和湿度或设置时钟,输入从午夜开始的秒数。