ESP8266
一:环境搭建
使用Ardino框架,在官网下载,下载离线的支持包
二:实现简单的项目
1. 点灯
{
pinMode(LED_PIN, OUTPUT); // 设置引脚为输出模式
digitalWrite(LED_PIN, HIGH); // 点亮 LED
}
I/O引脚的三种模式分别为:INPUT ------ 输入模式; OUTPUT ------ 输出模式;INPUT _PULLUP ------ 输入上拉模式;
2. 按键控制LED
{
#define KEY_PIN D1 // 定义 KEY 引脚
#define LED_PIN D2 // 定义 LED 引脚
void setup() {
Serial.begin(115200); //初始化波特率
pinMode(LED_PIN, OUTPUT); // 设置引脚为输出模式
pinMode(KEY_PIN, INPUT_PULLUP);// 输入上拉模式
Serial.println("按键LED已启动");//串口打印
}
void loop() {
int keystate=digitalRead(KEY_PIN);//读取key电平
if(keystate==LOW)
{
digitalWrite(LED_PIN, LOW); // 点亮 LED
Serial.println("按键按下,LED灯亮");
}
else
{
digitalWrite(LED_PIN, HIGH); //熄灭
}
delay(50);
}
}
Serial.println();
串口打印行
3. 读取DHT11的数据
{
#include <DHT.h>
// 定义DHT11传感器连接的引脚
#define DHTPIN D2
#define DHTTYPE DHT11 // 使用的是DHT11传感器
// 初始化DHT传感器
DHT dht(DHTPIN,DHTTYPE);
void setup() {
Serial.begin(115200); // 初始化串口通信,波特率9600
dht.begin(); // 初始化DHT传感器
Serial.println("DHT11温湿度传感器测试");
Serial.println("正在读取数据...");
}
void loop() {
// 等待2秒再读取一次数据,DHT传感器需要时间稳定
delay(2000);
// 读取湿度数据
float humi = dht.readHumidity();
// 读取温度数据
float temp= dht.readTemperature();
// 检查是否读取失败
if (isnan(humi) || isnan(temp)) {
Serial.println("读取传感器数据失败!");
return;
}
// 通过串口输出温湿度数据
Serial.print("湿度: ");
Serial.print(humi);
Serial.print("% ");
Serial.print("温度: ");
Serial.print(temp);
Serial.println("°C");
}
}
采用Arduino IDE自带的DHT11库
DHT dht(DHTPIN,DHTTYPE);
将传感器的引脚和型号信息传递给 DHT 类
Isnan
主要功能是检查一个浮点型(float 或 double)变量是否包含有效的数值。如果变量的值是 NaN(表示无效或未定义的数值),isnan() 会返回 true;如果是有效的数字,则返回 false。
三:网络连接与通信
1. 连接wifi
{
#include <ESP8266WiFi.h>
const char* ssid="ESP8266"; //WIFI账号
const char* password="123456789";//密码
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); //初始化串口
delay(10);
Serial.println();
Serial.print("正在连接到:");
Serial.println(ssid);
WiFi.begin(ssid,password); //启动wifi连接
int timeout=60; //判断超时
while(WiFi.status()!=WL_CONNECTED && timeout>0){
delay(500);
timeout--;
Serial.print(".");
}
if(timeout!=0) //不为0就是成功
{
Serial.println("");
Serial.println("WiFi连接成功!");
Serial.print("IP地址:");
Serial.print(WiFi.localIP());
}
else
{ //为0就是失败
Serial.println("");
Serial.println("WiFi连接超时!");
}
}
void loop() {
// put your main code here, to run repeatedly:
if(WiFi.status()!=WL_CONNECTED)//不是成功就是断开
{
Serial.println("WiFi断开,尝试重新连接");
WiFi.reconnect(); //重连
delay(5000);
}
delay(10000);
}
}
2. 创建TCP客户端和服务端
TCP客户端
{
/*
TCP客户端
*/
#include <ESP8266WiFi.h>
const char* ssid="ESP8266";
const char* password="123456789";
//服务器配置
const char* host="192.168.60.14";
const int port=8000;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(10);
Serial.println();
Serial.print("正在连接到:");
Serial.println(ssid);
WiFi.begin(ssid,password);
int timeout=60;
while(WiFi.status()!=WL_CONNECTED && timeout>0){
delay(500);
timeout--;
Serial.print(".");
}
if(timeout!=0)
{
Serial.println("");
Serial.println("WiFi连接成功!");
Serial.print("IP地址:");
Serial.print(WiFi.localIP());
}
else
{
Serial.println("");
Serial.println("WiFi连接超时!");
}
}
void loop() {
// put your main code here, to run repeatedly:
if(WiFi.status()!=WL_CONNECTED)
{
Serial.println("WiFi断开,尝试重新连接");
WiFi.reconnect();
delay(5000);
}
Serial.print("连接到服务器!");
Serial.print(host);
Serial.print(":");
Serial.println(port);
//使用WiFiClient创建TCP连接
WiFiClient client;
if(!client.connect(host,port))
{
Serial.println("连接失败!");
delay(500);
return;
}
Serial.println("连接成功!");
//发送一条消息
String message="Hello from ESP8266 - "+String(millis());
client.println(message);
Serial.println("发送:"+message);
//等待服务器的恢复
unsigned long timeout=millis();
while(client.available()==0)
{
if(millis()-timeout>5000)
{
Serial.println("超时:服务器无响应!");
client.stop();
delay(5000);
return;
}
}
//读取所有来自服务器的回复
Serial.println("收到回复:");
while(client.available())
{
String line=client.readStringUntil('\r');
Serial.print(line);
}
//关闭连接
client.stop();
Serial.println();
Serial.println("连接关闭");
delay(10000); // 短暂延迟
}
}
print():仅打印内容,不自动换行。
println():打印内容 + 自动换行(添加 \n)
millis()
获得启动时间millis() 是获取设备启动时间的 "标准工具"
TCP服务器
{
#include <ESP8266WiFi.h>
const char* ssid="ESP8266";
const char* password="123456789";
//在端口8000上创建TCP服务器
WiFiServer server(8000);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(10);
Serial.println();
Serial.print("正在连接到:");
Serial.println(ssid);
WiFi.begin(ssid,password);
int timeout=60;
while(WiFi.status()!=WL_CONNECTED && timeout>0){
delay(500);
timeout--;
Serial.print(".");
}
if(timeout!=0)
{
Serial.println("");
Serial.println("WiFi连接成功!");
Serial.print("IP地址:");
Serial.print(WiFi.localIP());
//启动TCP服务器
server.begin();
Serial.println("TCP服务器已启动!");
Serial.print("监听端口:");
Serial.println(8000);
}
else
{
Serial.println("");
Serial.println("WiFi连接超时!");
}
}
void loop() {
// put your main code here, to run repeatedly:
if(WiFi.status()!=WL_CONNECTED)
{
Serial.println("WiFi断开,尝试重新连接");
WiFi.reconnect();
delay(5000);
}
//检查是否有客户端连接
WiFiClient client=server.available();
if (client) {
Serial.println("新的客户端连接");
// 客户端连接时的时间
String currentTime = String(millis());
// 向客户端发送欢迎消息
client.println("欢迎连接到ESP8266 TCP服务器!");
client.println("当前时间(毫秒): " + currentTime); // 发送连接时间
client.println("输入'bye'断开连接");
// 处理客户端数据
while (client.connected()) {
if (client.available()) {
// 读取客户端发送的数据,直到遇到回车符('\r')
String line = client.readStringUntil('\r');
line.trim(); // 去除字符串前后的空格和换行符
Serial.print("收到数据: ");
Serial.println(line);
if (line == "bye") {
client.println("再见!");
break;
} else if (line.length() > 0) {
// 回显接收到的数据
client.println("回声: " + line);
}
}
}
// 关闭连接
client.stop();
Serial.println("客户端断开连接");
}
delay(100); // 短暂延迟
}
}
3. 创建UDP客户端和服务端
UDP客户端
{
/*
UDP客户端
*/
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid="ESP8266";
const char* password="123456789";
//upd配置
WiFiUDP udp;
unsigned int localPort=8000;//本地监听端口
unsigned int remotePort=9999;//远程端口
const char* remoteHost="192.168.60.14";//本地主机地址
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(10);
Serial.println();
Serial.print("正在连接到:");
Serial.println(ssid);
WiFi.begin(ssid,password);
int timeout=60;
while(WiFi.status()!=WL_CONNECTED && timeout>0){
delay(500);
timeout--;
Serial.print(".");
}
if(timeout!=0)
{
Serial.println("");
Serial.println("WiFi连接成功!");
Serial.print("IP地址:");
Serial.print(WiFi.localIP());
// 启动UDP
udp.begin(localPort);
Serial.print("UDP客户端已启动,监听端口: ");
Serial.println(localPort);
}
else
{
Serial.println("");
Serial.println("WiFi连接超时!");
}
}
void loop() {
// put your main code here, to run repeatedly:
if(WiFi.status()!=WL_CONNECTED)
{
Serial.println("WiFi断开,尝试重新连接");
WiFi.reconnect();
delay(5000);
}
//发送UPD数据包
Serial.println("发送UDP数据包...");
udp.beginPacket(remoteHost,remotePort);
udp.println("Hello from ESP8266 UDP Client - " + String(millis()));
udp.endPacket();
Serial.println("数据包已发送");
//检查是否有收到数据包
int packetSize=udp.parsePacket();//获取包的大小
if(packetSize)
{
Serial.print("接收来自");
Serial.print(udp.remoteIP());
Serial.print(":");
Serial.print(udp.remotePort()); // 打印发送方端口
Serial.print(" 的数据,大小:");
Serial.println(packetSize);
//读取数据包的内容
// char packetBuffer[255];
// int len=upd.read(packetBuffer,255);//从 UDP 连接中读取数据并存储到缓冲区
// if(len>0)
// {
// packetBuffer[len]=0;//在接收到的数据末尾添加空字符 \0
// }
// Serial.print("内容: ");
// Serial.println(packetBuffer);
String reply = udp.readStringUntil('\n'); // 读取到换行符为止
Serial.print("收到回复:");
Serial.println(reply);
}
delay(5000); // 短暂延迟
}
}
UDP服务器
{
/*
ESP8266 UDP服务器
功能:监听8000端口,接收客户端数据并回复,支持WiFi重连
*/
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid="ESP8266";
const char* password="123456789";
//UDP配置
WiFiUDP udpServer;
unsigned int udpPort=8000; //UDP服务器监听端口
IPAddress serverIP; // 存储服务器IP
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(10);
Serial.println();
Serial.print("正在连接到:");
Serial.println(ssid);
WiFi.begin(ssid,password);
int timeout=60;
while(WiFi.status()!=WL_CONNECTED && timeout>0){
delay(500);
timeout--;
Serial.print(".");
}
if(timeout!=0)
{
Serial.println("");
Serial.println("WiFi连接成功!");
Serial.print("IP地址:");
Serial.print(WiFi.localIP());
serverIP = WiFi.localIP();
//启动UDP服务器
if (udpServer.begin(udpPort)) { // 绑定端口并启动
Serial.println("UDP服务器已启动!");
Serial.print("监听端口:");
Serial.println(udpPort);
} else {
Serial.println("UDP服务器启动失败!");
}
}
else
{
Serial.println("");
Serial.println("WiFi连接超时!");
}
}
void loop() {
// put your main code here, to run repeatedly:
//检查是否有客户端发送UDP数据包
int packetSize=udpServer.parsePacket();//获取数据包的大小
if(packetSize>0)//有数据
{
//读取客户端数据
IPAddress clientIP=udpServer.remoteIP();//客户端IP
unsigned int clientPort=udpServer.remotePort();//客户端的端口号
Serial.println("\n【收到新数据】");
Serial.print("客户端IP:");
Serial.println(clientIP);
Serial.print("客户端端口:");
Serial.println(clientPort);
Serial.print("数据大小:");
Serial.print(packetSize);
Serial.println(" 字节");
char dataBuffer[255];//缓冲区
int dataLen=udpServer.read(dataBuffer,sizeof(dataBuffer)-1);
if(dataLen>0)
{
dataBuffer[dataLen]='\0';//添加结束字符
Serial.print("数据内容:");
Serial.println(dataBuffer);
}
// 回复内容:包含服务器信息和客户端发送的内容
String replyMsg = "ESP8266服务器已收到:" + String(dataBuffer)
+ "服务器IP:" + serverIP.toString();
// 向客户端发送回复(需指定客户端的IP和端口)
udpServer.beginPacket(clientIP, clientPort); // 开始构建回复数据包
udpServer.print(replyMsg); // 写入回复内容
udpServer.endPacket(); // 发送回复(UDP无连接,无需建立连接)
Serial.print("已回复客户端:");
Serial.println(replyMsg);
}
delay(100); // 短暂延迟
}
}