当前位置: 首页 > news >正文

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); // 点亮 LEDSerial.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);  // 初始化串口通信,波特率9600dht.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());// 启动UDPudp.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;        // 存储服务器IPvoid 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();//客户端IPunsigned 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. 对接点灯科技

http://www.xdnf.cn/news/1376731.html

相关文章:

  • 高并发内存池(12)-ThreadCache回收内存
  • 【HTML】隐藏滚动条但保留功能
  • 什么是AI+?什么是人工智能+?
  • redis---set详解
  • ICCV 2025 | 清华IEDA提出GUAVA,单图创建可驱动的上半身3D化身!实时、高效,还能捕捉细腻的面部表情和手势。
  • 《MongoDB 常用命令详解:从数据库操作到高级查询》
  • Windows/Linux 环境下 Jmeter 性能测试的安装与使用
  • 未成功:使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)
  • Linux学习-TCP并发服务器构建
  • 在 Windows 上部署 Go 语言开发环境
  • 数据分析编程第五步:数据准备与整理
  • JoyAgent-JDGenie开源多智能体系统详解:架构、部署与企业级应用案例
  • 5G NR学习笔记 预编码(precoding)和波束赋形(beamforming)
  • 嵌入式第三十九天(TCP多任务并发)
  • QT应用层项目20250822
  • MAX系列FPGA型号对比及低功耗特性分析
  • 【Linux 小实战】自定义 Shell 的编写
  • 把CentOS 7默认yum源改成腾讯云镜像
  • 移动端(微信等)使用 vConsole调试console
  • Web漏洞
  • Vue-24-利用Vue3的element-plus库实现树形结构数据展示
  • 一文详解 LangChain4j AiServices:自动代理实现大模型交互
  • 【datawhale组队学习】RAG技术 -TASK05 向量数据库实践(第三章3、4节)
  • 如何使用windows实现与iphone的隔空投送(AirDrop)
  • linux部署overleaf服务器
  • HarmonyOS布局实战:用声明式UI构建自适应电商卡片
  • 华为鸿蒙HarmonyOS Next基础开发教程
  • 【前端】Devtools使用
  • 毕业项目推荐:28-基于yolov8/yolov5/yolo11的电塔危险物品检测识别系统(Python+卷积神经网络)
  • 极限RCE之三字节RCE