ESP8266:Arduino学习

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

}

}

4. 创建Web服务器

5. 网络客户端

四:物联网协议与云平台

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

2. 对接点灯科技

相关推荐
易享电子1 小时前
基于单片机步进电机控制电机正反转加减速系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·51单片机·proteus·智能家居
易享电子2 小时前
基于单片机空调温度控制测温ds18b20系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·51单片机·proteus·智能家居
点灯小铭2 小时前
基于51单片机汽车自动照明灯超声波光敏远近光灯设计
单片机·嵌入式硬件·汽车·毕业设计·51单片机·课程设计
小刘爱玩单片机3 小时前
【stm32简单外设篇】-4×4 薄膜键盘
stm32·单片机·计算机外设
源远流长jerry4 小时前
STM32之Systick与基础定时器
c语言·stm32·单片机·嵌入式硬件
爱睡觉的王宇昊7 小时前
GD32和STM32的区别在哪里?
stm32·单片机·嵌入式硬件
代码总长两年半9 小时前
STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---AT固件篇(二)
stm32·单片机·物联网
点灯小铭9 小时前
基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
stm32·单片机·嵌入式硬件·毕业设计·课程设计
代码总长两年半11 小时前
STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---MQTT篇(三)
stm32·单片机·物联网