一、中断

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>.");
}