ESP8266-01S 驱动代码例程
例程一:Arduino AT指令驱动(SoftwareSerial)
#include <SoftwareSerial.h>
#define ESP_RX 2 // Arduino D2 → ESP8266 TXD
#define ESP_TX 3 // Arduino D3 → ESP8266 RXD
#define ESP_RST 4 // 可选:接ESP8266 RST
SoftwareSerial espSerial(ESP_RX, ESP_TX);
char response[512];
unsigned long timeout = 5000;
bool sendATCommand(const char* cmd, const char* expect, uint32_t timeout_ms) {
espSerial.println(cmd); // println 自动添加 \r\n
memset(response, 0, sizeof(response));
unsigned long start = millis();
uint16_t idx = 0;
while (millis() - start < timeout_ms) {
while (espSerial.available() && idx < sizeof(response) - 1) {
response[idx++] = espSerial.read();
}
if (strstr(response, expect) != NULL) {
return true;
}
}
return false;
}
void readResponse(uint32_t timeout_ms) {
memset(response, 0, sizeof(response));
unsigned long start = millis();
uint16_t idx = 0;
while (millis() - start < timeout_ms) {
while (espSerial.available() && idx < sizeof(response) - 1) {
response[idx++] = espSerial.read();
}
}
}
bool ESP8266_Init(void) {
espSerial.begin(115200);
delay(1000);
if (!sendATCommand("AT", "OK", 2000)) {
Serial.println("[ERROR] AT通信失败,检查接线和供电");
return false;
}
Serial.println("[OK] AT通信正常");
sendATCommand("AT+GMR", "OK", 3000);
Serial.print("固件版本: ");
Serial.println(response);
sendATCommand("AT+CWMODE=1", "OK", 2000);
sendATCommand("ATE0", "OK", 1000);
return true;
}
bool ESP8266_ConnectWiFi(const char* ssid, const char* pwd) {
char cmd[128];
snprintf(cmd, sizeof(cmd), "AT+CWJAP=\"%s\",\"%s\"", ssid, pwd);
if (!sendATCommand(cmd, "WIFI GOT IP", 15000)) {
Serial.println("[ERROR] WiFi连接失败");
return false;
}
Serial.println("[OK] WiFi已连接");
sendATCommand("AT+CIFSR", "OK", 2000);
Serial.println(response);
return true;
}
bool ESP8266_TCP_Send(const char* host, uint16_t port, const char* data) {
char cmd[64];
snprintf(cmd, sizeof(cmd), "AT+CIPSTART=\"TCP\",\"%s\",%d", host, port);
if (!sendATCommand(cmd, "OK", 5000)) {
Serial.println("[ERROR] TCP连接失败");
return false;
}
snprintf(cmd, sizeof(cmd), "AT+CIPSEND=%d", strlen(data));
if (!sendATCommand(cmd, ">", 3000)) {
Serial.println("[ERROR] 未收到发送提示符");
return false;
}
espSerial.print(data);
delay(100);
if (!sendATCommand("", "SEND OK", 5000)) {
Serial.println("[ERROR] 数据发送失败");
return false;
}
sendATCommand("AT+CIPCLOSE", "OK", 2000);
return true;
}
void ESP8266_HardReset(void) {
pinMode(ESP_RST, OUTPUT);
digitalWrite(ESP_RST, LOW);
delay(100);
digitalWrite(ESP_RST, HIGH);
delay(1000);
Serial.println("ESP8266 已复位");
}
void setup() {
Serial.begin(9600);
Serial.println("ESP8266-01S AT指令测试");
ESP8266_Init();
ESP8266_ConnectWiFi("YOUR_SSID", "YOUR_PASSWORD");
ESP8266_TCP_Send("api.example.com", 80, "GET /data HTTP/1.1\r\nHost: api.example.com\r\n\r\n");
}
void loop() {
}
例程二:ESP8266-01S 独立编程 (Arduino IDE)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define LED_PIN 2 // GPIO2 (板载LED, 低电平亮)
#define BUTTON_PIN 0 // GPIO0 (兼作按键, 内置上拉)
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
ESP8266WebServer server(80);
bool ledState = false;
void GPIO_Init(void) {
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH); // 初始熄灭(低电平亮)
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void WiFi_Connect(void) {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("正在连接WiFi");
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 40) {
delay(500);
Serial.print(".");
digitalWrite(LED_PIN, (millis() / 200) % 2 ? LOW : HIGH);
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(LED_PIN, HIGH); // 熄灭LED
Serial.println("\nWiFi已连接");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nWiFi连接失败");
}
}
void setupServer(void) {
server.on("/", []() {
String html = "<!DOCTYPE html><html><head><meta charset='UTF-8'>";
html += "<title>ESP8266-01S</title></head><body>";
html += "<h1>ESP8266-01S 控制面板</h1>";
html += "<p>LED状态: <b>" + String(ledState ? "亮" : "灭") + "</b></p>";
html += "<button onclick=\"fetch('/on')\">开灯</button> ";
html += "<button onclick=\"fetch('/off')\">关灯</button> ";
html += "<button onclick=\"fetch('/toggle')\">翻转</button>";
html += "</body></html>";
server.send(200, "text/html", html);
});
server.on("/on", []() {
ledState = true;
digitalWrite(LED_PIN, LOW);
server.send(200, "text/plain", "LED ON");
});
server.on("/off", []() {
ledState = false;
digitalWrite(LED_PIN, HIGH);
server.send(200, "text/plain", "LED OFF");
});
server.on("/toggle", []() {
ledState = !ledState;
digitalWrite(LED_PIN, ledState ? LOW : HIGH);
server.send(200, "text/plain", ledState ? "LED ON" : "LED OFF");
});
server.begin();
Serial.println("HTTP服务器已启动");
}
void checkButton(void) {
static unsigned long lastPress = 0;
if (digitalRead(BUTTON_PIN) == LOW) {
if (millis() - lastPress > 300) { // 消抖
lastPress = millis();
ledState = !ledState;
digitalWrite(LED_PIN, ledState ? LOW : HIGH);
Serial.println("按键触发: LED " + String(ledState ? "ON" : "OFF"));
}
}
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\nESP8266-01S 启动中...");
GPIO_Init();
WiFi_Connect();
setupServer();
}
void loop() {
server.handleClient();
checkButton();
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 30000) {
lastPrint = millis();
Serial.printf("运行中 | 运行时间: %lu秒 | 免费堆: %d字节\n",
millis() / 1000, ESP.getFreeHeap());
}
}
例程三:ESP8266-01S 深度睡眠与低功耗唤醒
#include <ESP8266WiFi.h>
#define LED_PIN 2
void setup() {
Serial.begin(115200);
delay(100);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
delay(200);
digitalWrite(LED_PIN, HIGH);
Serial.println("ESP8266-01S 唤醒!");
Serial.printf("唤醒原因: %s\n",
ESP.getResetInfoPtr()->reason == REASON_DEEP_SLEEP_AWAKE
? "深度睡眠定时唤醒" : "上电/外部复位");
Serial.println("执行任务中...");
delay(1000);
Serial.println("任务完成,进入深度睡眠...");
Serial.println("01S无GPIO16,模拟睡眠5秒后重启...");
delay(5000);
ESP.restart();
}
void loop() {
}
例程四:AT指令常用参考
AT
AT+RST
AT+GMR
ATE0
ATE1
AT+CWMODE=1
AT+CWMODE=2
AT+CWMODE=3
AT+CWLAP
AT+CWJAP="ssid","pwd"
AT+CWQAP
AT+CIFSR
AT+CIPSTART="TCP","192.168.1.100",8080
AT+CIPSTART="UDP","192.168.1.100",8080
AT+CIPSEND=10
AT+CIPCLOSE
AT+CIPSTATUS
AT+HTTPCLIENT=1,"GET","http://example.com/api"