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客户端

{

这段代码实现了一个基于ESP8266的TCP客户端,它能够:

  1. 连接到指定的WiFi网络
  2. 连接到指定的TCP服务器(IP和端口)
  3. 向服务器发送消息
  4. 等待并接收服务器的响应
  5. 处理超时情况
  6. 定期重复上述过程
/*

  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() 是获取设备启动时间的 “标准工具”

WiFiClient client - 创建TCP客户端对象

client.connect(host, port) - 连接到服务器

client.println(message) - 向服务器发送数据

client.available() - 检查是否有数据可读

client.readStringUntil('\r') - 读取数据直到回车符

客户端启动后,会每10秒执行一次以下操作:

  1. 尝试连接到服务器
  2. 发送一条包含时间戳的消息
  3. 等待服务器响应(最多5秒)
  4. 读取并打印服务器响应
  5. 关闭连接

流程图:

}

TCP服务器

{

这段代码实现了一个基于ESP8266的TCP服务器,它能够:

  1. 连接到指定的WiFi网络
  2. 在端口8000上启动TCP服务器
  3. 监听并接受客户端的连接
  4. 与客户端进行双向通信
  5. 处理客户端发送的命令
#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); // 短暂延迟

}

WiFiServer server(8000) - 创建在端口8000上监听的TCP服务器

server.begin() - 启动TCP服务器

server.available() - 检查是否有客户端连接

WiFiClient client - 表示连接到服务器的客户端

服务器启动后,会持续监听客户端连接。当客户端连接时,服务器会:

  1. 发送欢迎消息
  2. 进入循环等待客户端输入
  3. 读取并回显客户端发送的数据
  4. 如果客户端发送"bye",则关闭连接

流程图:

}

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

}

}

4. 创建Web服务器

  1. 创建Web服务器控制LED

{

/*

  创建Web服务器

*/

#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>



//配置WiFi和创建服务器对象

const char* ssid="ESP8266";

const char* password="123456789";

ESP8266WebServer server(80);//在80端口创建Web服务器



//根目录处理函数

void handleRoot(){

  String html="<html><head><meta charset=\"UTF-8\"><title>ESP8266 Web服务器</title></head>";

  html+="<body><h1>欢迎使用ESP8266 Web服务器</h1>";

  html+="<p>设备运行时间:"+String(millis()/1000)+"秒</p>";

  html+="<a href='/ledon'><button>打开LED</button></a>";

  html+="<a href='/ledoff'><button>关闭LED</button></a>";

  html+="</body></html>";

  server.send(200,"text/html",html);

}



//LED控制处理函数

void handleLEDon(){

  digitalWrite(LED_BUILTIN,LOW);//点亮LED

  server.send(200,"text/plain;charset=UTF-8

","LED已打开");

}

void handleLEDoff(){

  digitalWrite(LED_BUILTIN,HIGH);//关闭LED

  server.send(200,"text/plain;charset=UTF-8

","LED已关闭");

}

void setup() {

  // put your setup code here, to run once:

  Serial.begin(115200);

  pinMode(LED_BUILTIN,OUTPUT);

  digitalWrite(LED_BUILTIN,HIGH);



  //连接wifi

  WiFi.begin(ssid,password);

  while(WiFi.status()!=WL_CONNECTED){

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.println("WiFi连接成功");

  Serial.println("IP地址:");

  Serial.println(WiFi.localIP());



  //设置URL处理函数

  server.on("/",handleRoot);

  server.on("/ledon",handleLEDon);

  server.on("/ledoff",handleLEDoff);



  //启动Web服务器

  server.begin();

  Serial.println("HTTP服务器已启动");

}



void loop() {

  // put your main code here, to run repeatedly:

  server.handleClient(); // 处理客户端请求

}



}

不加<meta charset=\"UTF-8\">会导致乱码

5. 网络时间
获取网络时间
{

/*

获取网络时间示例

功能:从NTP服务器获取当前时间并且显示

*/

#include <ESP8266WiFi.h>

#include <NTPClient.h>

#include <WiFiUdp.h>



char* ssid="ESP8266";

char* password="123456789";



//定义NTP客户端

WiFiUDP ntpUDP;

NTPClient timeClient(ntpUDP,"pool.ntp.org",8*3600,60000);//东八区时区



void setup() {

  // put your setup code here, to run once:

  Serial.begin(115200);



  WiFi.begin(ssid,password);

  while(WiFi.status()!=WL_CONNECTED){

    delay(500);

    Serial.print(".");

  }

    Serial.println("WiFi连接成功");

  timeClient.begin();//启动NTP客户端

}



void loop() {

  // put your main code here, to run repeatedly:

  timeClient.update();

  Serial.print("当前时间:");

  Serial.println(timeClient.getFormattedTime());

  delay(1000);



}

handleRoot()函数是ESP8266 Web服务器中处理根目录请求的核心函数。当用户访问服务器的根URL(如http://192.168.1.100/)时,这个函数会被调用。

HTML结构

<html> - HTML文档根元素

<head> - 文档头部,包含元数据和标题

<title> - 浏览器标签页标题

<body> - 文档主体内容

<h1> - 一级标题

<p> - 段落

<a> - 超链接

<button> - 按钮

String(millis()/1000) - 将设备运行时间从毫秒转换为秒

html += - 字符串拼接,逐步构建HTML内容

href='/ledon' - 指向LED打开功能的链接

href='/ledoff' - 指向LED关闭功能的链接

}

四:物联网协议与云平台

1. 使用手机APPMQTT调试APP控制ESP8266

2. 对接点灯科技

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐