一、中断
ESP32每个引脚都可以当做中断源
触发中断情况有五种:
- FALLING 下降
- RISING 上升
- CHANGE 改变
- LOW 低电平
- HIGH 高电平
这里就通过一个按键中断来记录一下ESP32的中断、LED、串口相关的使用。
功能:GPIO4低电平触发中断,累积触发5次以上中断之后,中断取消。通过LED以及串口打印可查看中断情况。
主要涉及到:中断的设置,中断的使能,中断的失能。
#define LED 2
#define KEY 4
volatile int counter = 0; // 中断中加入可变值的时候需要加volatile
// 初始化函数
void setup(){
pinMode(LED, OUTPUT); // LED灯的初始化
Serial.begin(115200); // 串口的初始化
pinMode(KEY, INPUT_PULLUP); // 按键初始化,上拉
attachInterrupt(KEY, Interrupt1, FALLING); // 将按键和中断源绑定起来,下降沿触发中断
}
// 循环函数
void loop(){
digitalWrite(LED, LOW); // 灯灭
if( counter > 5){
detachInterrupt(KEY); //取消中断
Serial.println("中断停止");
counter = 0;
}
delay(500);
}
// 中断函数
void Interrupt1(){
counter++;
Serial.printf("第%d次按下按钮\n", counter);
digitalWrite(LED, HIGH); // 灯亮
}
二、WiFi连接
#include <WiFi.h>
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
WiFi.begin("wifiname", "wifipassword"); // 网络名称,密码
// 检查有没有连接成功,没有成功继续连接
while (WiFi.status() != WL_CONNECTED)
{
Serial.println("等待连接...");
delay(500);
}
Serial.print("IP地址:");
Serial.println(WiFi.localIP());
}
void loop()
{
// put your main code here, to run repeatedly:
}
三、创建WiFi热点
#include "WiFi.h"
const char *ssid = "ESP32Test";
const char *password = "123123456";
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
WiFi.softAP(ssid, password);
Serial.print("\n WiFi接入点的ip: ");
Serial.println(WiFi.softAPIP());
}
void loop() {
// put your main code here, to run repeatedly:
}
四、http请求控制开关灯
#include <WiFi.h>
#include <WebServer.h>
const char *ssid = "wificount";
const char *password = "wifipassword";
#define LED 2
// 服务器的操作,默认端口号 80
WebServer server(80);
void handleRoot(){
String HTML = "<!DOCTYPE html> \
<html> \
<head> <meta charset='utf-8'> </head> \
<body> \
你好,我的朋友! \
</body> \
</html>"; // 语法符合html格式的字符串
// 成功返回 200,失败404;类型 text或者html;字符串是啥
server.send(200, "text/html", HTML);
// 以上就创建好了一个server
}
void setup() {
// put your setup code here, to run once:
// 打开串口
Serial.begin(115200);
// led初始化
pinMode(LED, OUTPUT);
// 设置esp32的工作模式
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); // 连接
while(WiFi.status() != WL_CONNECTED){
delay(50);
Serial.print(".");
}
// 打印IP地址
Serial.print("\n IP地址:");
Serial.println(WiFi.localIP());
// 创建服务器
// 监听哪个地址或者说是哪个目录
server.on("/", handleRoot); // 根目录,回调函数
// 这个网页就是需要在ip地址后面加/hello访问, ip/hello
// 后面的[](){}这个是匿名函数,就是将 /hello 这个端口的网页链接到 显示hello
server.on("/hello", [](){server.send(200, "text/html", "hello");});
// 当没有找到这个端口时,访问的页面
server.onNotFound( [](){server.send(200, "text/html;charset=utf-8", "没有找到相关页面"); });
// 定义一个从网页控制灯的亮灭的页面
server.on("/sw", LEDsw);
server.begin(); // 把服务器启动起来
digitalWrite(LED, HIGH); // 让灯一开始亮起来
}
void loop() {
// put your main code here, to run repeatedly:
server.handleClient(); // 处理客户端的连接
}
// 从网页控制灯的亮灭
void LEDsw(){
// 请求的参数名 led,就是获取 ip/sw页面的 led 等于的参数是什么
String state = server.arg("led");
// 网页上通过
// ip/sw?led=on 打开
// ip/sw?led=off 关闭
if( state == "on"){
digitalWrite(LED, HIGH);
}else if(state == "off"){
digitalWrite(LED, LOW);
}
server.send(200, "text/html", "LED is <b>" + state + "</b>.");
}
五、网页按钮控制灯的开关
#include <WiFi.h>
#include <WebServer.h>
const char *ssid = "wifiname";
const char *password = "wifipassword";
#define LED 2
// 服务器的操作,默认端口号 80
WebServer server(80);
/*回调函数你们的js语法是通过function创建函数,
按键通过接收sw函数的参数是on还是off来判断是哪个按键按下,
以此来判断是开灯还是关灯*/
void handleRoot(){
String HTML = "<!DOCTYPE html> \
<html> \
<head> <meta charset='utf-8'> </head> \
<body> \
你好,我的朋友! \
<script>var xhttp = new XMLHttpRequest();\
function sw(arg){\
xhttp.open('Get', '/sw?led=' + arg, true);\
xhttp.send()}\
</script>\
<button onmousedown=sw('on')> 开灯 </button>\
<button onmousedown=sw('off')> 关灯 </button>\
</body> \
</html>"; // 语法符合html格式的字符串
// 成功返回 200,失败404;类型 text或者html;字符串是啥
server.send(200, "text/html", HTML);
// 以上就创建好了一个server
}
void setup() {
// put your setup code here, to run once:
// 打开串口
Serial.begin(115200);
// led初始化
pinMode(LED, OUTPUT);
// 设置esp32的工作模式
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); // 连接
while(WiFi.status() != WL_CONNECTED){
delay(50);
Serial.print(".");
}
// 打印IP地址
Serial.print("\n IP地址:");
Serial.println(WiFi.localIP());
// 创建服务器
// 监听哪个地址或者说是哪个目录
server.on("/", handleRoot); // 根目录,回调函数
// 这个网页就是需要在ip地址后面加/hello访问, ip/hello
// 后面的[](){}这个是匿名函数,就是将 /hello 这个端口的网页链接到 显示hello
server.on("/hello", [](){server.send(200, "text/html", "hello");});
// 当没有找到这个端口时,访问的页面
server.onNotFound( [](){server.send(200, "text/html;charset=utf-8", "没有找到相关页面"); });
// 定义一个从网页控制灯的亮灭的页面
server.on("/sw", LEDsw);
server.begin(); // 把服务器启动起来
digitalWrite(LED, HIGH); // 让灯一开始亮起来
}
void loop() {
// put your main code here, to run repeatedly:
server.handleClient(); // 处理客户端的连接
}
// 从网页控制灯的亮灭
void LEDsw(){
// 请求的参数名 led,就是获取 ip/sw页面的 led 等于的参数是什么
String state = server.arg("led");
// ip/sw?led=on 打开
// ip/sw?led=off 关闭
if( state == "on"){
digitalWrite(LED, HIGH);
}else if(state == "off"){
digitalWrite(LED, LOW);
}
server.send(200, "text/html", "LED is <b>" + state + "</b>.");
}