// 1.创建服务对象
WebServer webserver(80);
void setup() {
WiFi.connect("ssid", "password");
// 2.绑定路径处理函数
// 函数原型为 void(void),即无参数、无返回值的函数
webserver.on("/", [](){
webserver.send(200, "text/html", "It's work!");
});
// 3.启动服务
webserver.begin();
)
void loop() {
// 4.响应请求
webserver.handleClient();
delay(1);
}
webserver.on("/form1", []() {
webserver.send(200, "text/html", form1_html);
});
webserver.on("/form1_submit", []() {
String ssid = webserver.arg("ssid");
String password = webserver.arg("password");
// 后续处理...
webserver.send(200, "application/json", "{\"success\":\"true\"}");
}); 其中from1_html为字符数组,如下:
static const char *form1_html PROGMEM = R"(
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='stylesheet' href='/mini.css'>
<script src='/zepto.js'></script>
<title>Form1</title>
</head>
<body>
<h2>Form1</h2>
<p></p>
<form id='form1' method='post'>
<fieldset>
<legend>WiFi配置</legend>
<div class='row responsive-label'>
<div class='col-sm-12 col-md-3'><label for='ssid'>WiFi名称:</label></div>
<div class='col-sm-12 col-md'><input type='text' style='width:90%' name='ssid'></div>
</div>
<div class='row responsive-label'>
<div class='col-sm-12 col-md-3'><label for='password'>WiFi密码:</label></div>
<div class='col-sm-12 col-md'><input type='text' style='width:90%' name='password'></div>
</div>
</fieldset>
<input type='submit' class='primary' value=' 提交 '>
</form>
</body>
<script type='text/javascript'>
$('#form1').on('submit', function(e) {
e.preventDefault();
var formData = $(this).serialize();
$.ajax({
type: 'POST',
url: '/form1_submit',
data: formData,
success: function(response) {
if (response.success) {
alert('ok');
} else {
alert(response.error);
}
},
error: function(xhr, status, error) {
console.error('An error occurred:', error);
}
});
});
</script>
</html>
)"; 可以看到,这个表单使用了ajax方式来提交数据。
webserver.on("/form2", []() {
webserver.send(200, "text/html", form2_html);
});
std::string payload;
webserver.on("/form2_submit", []() {
// 这里使用ESP32内置的cJSON库来解析,也可以用其他第三方库来处理,如ArduinoJson库等 。
cJSON *json = cJSON_Parse(payload.c_str());
std::string ssid = cJSON_GetObjectItem(json, "ssid")->valuestring;
std::string password = cJSON_GetObjectItem(json, "password")->valuestring;
// 后续处理...
webserver.send(200, "application/json", "{\"success\":\"true\"}");
}, []() {
// 通过访问raw来获取上传数据,如果数据量较大(如上传文件),则RAW_WRITE会多次调用
HTTPRaw &raw = webserver.raw();
if (raw.status == RAW_START) {
payload = "";
} else if (raw.status == RAW_WRITE) {
payload = std::string(reinterpret_cast<char*>(raw.buf), raw.currentSize);
} else if (raw.status == RAW_END) {
}
); 其中from2_html为字符数组,如下:
static const char *form2_html PROGMEM = R"(
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='stylesheet' href='/mini.css'>
<script src='/zepto.js'></script>
<title>Form2</title>
</head>
<body>
<h2>Form2</h2>
<p></p>
<form id='form2' method='post'>
<fieldset>
<legend>WiFi配置</legend>
<div class='row responsive-label'>
<div class='col-sm-12 col-md-3'><label for='ssid'>WiFi名称:</label></div>
<div class='col-sm-12 col-md'><input type='text' id='ssid' style='width:90%' name='ssid'></div>
</div>
<div class='row responsive-label'>
<div class='col-sm-12 col-md-3'><label for='password'>WiFi密码:</label></div>
<div class='col-sm-12 col-md'><input type='text' id='password' style='width:90%' name='password'></div>
</div>
</fieldset>
<input type='submit' class='primary' value=' 提交 '>
</form>
</body>
<script type='text/javascript'>
$('#form2').on('submit', function(e) {
e.preventDefault();
var ssidVal = $('#ssid').val();
var passwordVal = $('#password').val();
var payload = {
ssid: ssidVal,
password: passwordVal
};
$.ajax({
type: 'POST',
url: '/form2_submit',
data: JSON.stringify(payload),
contentType: 'application/json',
success: function(response) {
if (response.success) {
alert('ok');
} else {
alert(response.error);
}
},
error: function(xhr, status, error) {
console.error('An error occurred:', error);
}
});
});
</script>
</html>
)"; 这里使用javascript将表单数据放到一个字典对象里,再通过JSON.stringify方法转为json字符串提交到服务端,注意必须指定contentType为application/json
I2S(Inter—IC Sound)总线, 又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。
WebServer是非常常用的一个功能,在设备上使用该功能可以直接通过浏览器访问和操作设备。
Arduino-ESP32与ESP-IDF的版本对应表。
Arduino-ESP32提供了多种文件系统解决方案,本文将深入解析SPIFFS、LittleFS和SD卡三种主流存储方案,帮助你做出最佳选择。
ESP32-P4-WIFI6-DEV-KIT是一款微雪(Waveshare)设计的基于 ESP32-P4 的多媒体开发板,并集成 ESP32-C6,支持 Wi-Fi 6 和 BLE 5 无线连接。它提供丰富的人机交互接口,包括 MIPI-CSI (集成图像信号处理器 ISP)、MIPI-DSI、SPI、I2S、I2C、LED PWM、MCPWM、RMT、ADC、UART 和 TWAI 等。
ESP-Hosted 解决方案提供了将 ESP 板用作 Wi-Fi 和 Bluetooth/BLE 连接的通信处理器的方法。
ESP-Hosted 提供了一种将ESP芯片和模组用作通信协处理器的解决方案,该解决方案为主机微处理器或微控制器提供无线连接,使主机能够与其他设备通信。简单来说为网卡方案。
Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789
本文给出了一个ESP32与SPI 接口TFT显示屏接线的详细说明,供大家参考。
本文讲解如何在Micropython环境下使用ESP32的ESPNow功能进行数据传输。