xiyou2020eeeee 发表于 2024-3-5 16:59

【安信可BW16-Kit】 8、使用WiFi控制RGB灯

# 【安信可BW16-Kit】 8、使用WiFi控制RGB灯

## 1、程序功能介绍
### 1.1 先决设置
1、BW16和电脑要处于同一个局域网。电脑上需要访问网页。

### 1.2 功能解释
该程序是一个基于BW16开发板的简单Web服务器示例,能够通过WiFi连接到一个网络,并允许用户通过Web浏览器控制连接到BW16的三个LED灯(红色、绿色、蓝色)的开关状态。程序的主要功能分为几个部分:

### 1. 初始化和WiFi连接
- **设置WiFi凭据**:程序开始时,首先定义了连接到WiFi网络所需的SSID(网络名称)和密码。
- **初始化WiFi连接**:在`setup()`函数中,程序尝试使用提供的凭据连接到WiFi网络。这一过程在一个循环中进行,直到设备成功连接到WiFi网络为止。连接成功后,它还会启动一个在端口80上监听的Web服务器,这是HTTP默认端口。
- **串行通信初始化**:通过`Serial.begin(115200)`启动串行通信,以便在串行监视器中打印调试信息和WiFi状态信息。

### 2. 设置LED引脚
- **定义LED引脚**:定义了三个LED灯(红、绿、蓝)所连接的GPIO引脚号。
- **初始化LED引脚**:将这些LED引脚设置为输出模式,准备接收高低电平信号以控制LED的亮灭。

### 3. Web服务器功能
- **处理客户端请求**:在`loop()`函数中,ESP32作为Web服务器不断监听是否有客户端(如Web浏览器)连接。一旦有客户端连接,服务器就读取客户端发送的HTTP请求。
- **解析HTTP请求**:服务器读取和解析来自客户端的HTTP请求。特别是,它检查请求的URL,看看用户是否请求了开启或关闭某个颜色LED的路径(例如`/RH`表示打开红色LED,`/RL`表示关闭红色LED)。
- **控制LED状态**:根据解析出的请求路径,服务器通过向相应的LED引脚写高电平(HIGH)或低电平(LOW)来开启或关闭LED灯。
- **发送HTTP响应**:服务器对客户端的请求做出响应,发送一个简单的HTML页面,其中包含链接,用户可以点击这些链接来控制每个颜色LED的状态。

### 4. 打印WiFi状态信息
- **打印连接信息**:`printWifiStatus()`函数用于打印ESP32连接到的WiFi网络的信息,包括SSID、设备的IP地址以及信号强度(RSSI)。这些信息有助于调试和确认设备是否成功连接到了指定的WiFi网络。

总的来说,这个程序通过结合WiFi模块和Web服务器功能,实现了一个简单的物联网(IoT)应用,用户可以通过网络远程控制硬件设备(LED灯)的状态。这种模式为开发更复杂的基于ESP32的IoT应用提供了一个基础模板。

## 2、程序详解
```cpp
#include <WiFi.h>

char ssid[] = "xxss";            // WiFi网络名称
char pass[] = "999999999";       // WiFi网络密码

int status = WL_IDLE_STATUS;   // WiFi连接状态

WiFiServer server(80);         // 创建一个在端口80监听的服务器

// 定义红、绿、蓝LED的引脚
#define LED_PINR 11
#define LED_PING 12
#define LED_PINB 7

void setup() {
    Serial.begin(115200);      // 启动串行通信,波特率设置为115200
    // 将LED引脚设置为输出模式
    pinMode(LED_PINR, OUTPUT);   
    pinMode(LED_PING, OUTPUT);   
    pinMode(LED_PINB, OUTPUT);   

    // 尝试连接到WiFi网络
    while (status != WL_CONNECTED) {
      Serial.print("Attempting to connect to Network named: ");
      // 显示正在尝试连接的网络SSID
      Serial.println(ssid);                  
      // 开始连接到WPA/WPA2网络,如果使用开放或WEP网络,需要修改此行代码
      status = WiFi.begin(ssid, pass);
      // 等待10秒以完成连接
      delay(10000);
    }
    server.begin();               // 启动web服务器
    printWifiStatus();            // 打印连接状态信息
}

void loop() {
    WiFiClient client = server.available();   // 监听是否有客户端连接

    if (client) {                           // 如果有客户端连接,
      Serial.println("new client");         // 通过串行端口输出消息
      String currentLine = "";            // 创建一个String对象,用于存储来自客户端的数据
      while (client.connected()) {          // 当客户端保持连接状态时
            if (client.available()) {         // 如果客户端有数据发送
                char c = client.read();       // 读取一个字节的数据
                Serial.write(c);            // 并通过串行端口输出
                if (c == '\n') {            // 如果读取的字节是换行符

                  // 如果当前行为空,表示收到了连续的两个换行字符,即HTTP请求的结束
                  if (currentLine.length() == 0) {
                        // 发送HTTP响应头
                        client.println("HTTP/1.1 200 OK");
                        client.println("Content-type:text/html");
                        client.println();

                        // 发送HTML内容,包括控制LED状态的链接
                        client.print("Click <a href=\"/RH\">here</a> to turn the LED on R on<br>");
                        client.print("Click <a href=\"/RL\">here</a> to turn the LED on R off<br>");
                        client.print("Click <a href=\"/GH\">here</a> to turn the LED on G on<br>");
                        client.print("Click <a href=\"/GL\">here</a> to turn the LED on G off<br>");
                        client.print("Click <a href=\"/BH\">here</a> to turn the LED on B on<br>");
                        client.print("Click <a href=\"/BL\">here</a> to turn the LED on B off<br>");

                        // HTTP响应结束
                        client.println();
                        // 结束循环
                        break;
                  } else {    // 如果读取到的是新的一行
                        currentLine = "";// 清空当前行,准备读取下一行
                  }
                } else if (c != '\r') {// 如果读取到的不是回车符
                  currentLine += c;    // 将其添加到当前行的末尾
                }

                // 根据请求路径,控制LED的开关
                if (currentLine.endsWith("GET /RH")) {
                  digitalWrite(LED_PINR, HIGH); // 打开红色LED
                }
                if (currentLine.endsWith("GET /RL")) {
                  digitalWrite(LED_PINR, LOW);// 关闭红色LED
                }

                if (currentLine.endsWith("GET /GH")) {
                  digitalWrite(LED_PING, HIGH); // 打开绿色LED
                }
                if (currentLine.endsWith("GET /GL")) {
                  digitalWrite(LED_PING, LOW);// 关闭绿色LED
                }

                if (currentLine.endsWith("GET /BH")) {
                  digitalWrite(LED_PINB, HIGH); // 打开蓝色LED
                }
                if (currentLine.endsWith("GET /BL")) {
                  digitalWrite(LED_PINB, LOW);// 关闭蓝色LED
                }

            }
      }
      // 断开客户端连接
      client.stop();
      Serial.println("client disconnected");
    }
}

void printWifiStatus() {
    // 打印当前连接的WiFi网络SSID
    Serial.print("SSID: ");
    Serial.println(WiFi.SSID());

    // 打印WiFi IP地址
    IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
    Serial.println(ip);

    // 打印信号强度
    long rssi = WiFi.RSSI();
    Serial.print("signal strength (RSSI):");
    Serial.print(rssi);
    Serial.println(" dBm");
    // 提示用户在浏览器中访问的地址
    Serial.print("To see this page in action, open a browser to http://");
    Serial.println(ip);
}

```

## 3、效果展示

583d0931824670fdb0aa613775ea0485<br/>

humancat01 发表于 2024-3-6 08:57

<p>我非常支持国产芯片,希望大家多多使用国产芯片</p>
页: [1]
查看完整版本: 【安信可BW16-Kit】 8、使用WiFi控制RGB灯