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); // 短暂延迟
}
        }