【安信可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/>
<p>我非常支持国产芯片,希望大家多多使用国产芯片</p>
页:
[1]