当前位置: 首页 > 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.dtcms.com/a/353645.html

相关文章:

  • 前端性能优化:从指标监控到全链路落地(2024最新实战指南)
  • 短视频矩阵管理软件推荐——小麦矩阵系统深度解析
  • 关于两视图相机几何关系
  • DevExpress WPF中文教程:如何将WPF数据网格绑定到本地集合?
  • 软件定义汽车(SDV)调试——如何做到 适配软件定义汽车(SDV)?(下)
  • vue新能源汽车销售平台的设计与实现(代码+数据库+LW)
  • 【Vue2✨】 Vue2 入门之旅(二):模板语法
  • Python异步编程:从理论到实战的完整指南
  • Qt---项目架构解读
  • BiLSTM-Attention分类预测+SHAP分析+特征依赖图!深度学习可解释分析,Matlab代码实现
  • 【GaussDB】深度解析:创建存储过程卡死且无法Kill会话的疑难排查
  • codeforces(1045)(div2)D. Sliding Tree
  • 装饰器模式(C++python)
  • 第十四章 Leaflet-Ant-Path 实现西气东输管线动态流向可视化
  • 源代码接入 1688 接口的详细指南
  • 【生产事故处理--kafka日志策略保留】
  • antv x6实现封装拖拽流程图配置(适用于工单流程、审批流程应用场景)
  • 使用Stone 3D快速制作第一人称视角在线小游戏
  • STM32八大模式
  • Yapi接口文档导出测试用例至Excel中
  • ProfiNet 转 Ethernet/IP西门子 S7-400 及罗克韦尔 PLC 于原油蒸馏的集成应用
  • 插入排序讲解
  • D‘RespNeT无人机图像分割数据集与YOLOv8-DRN模型,实时识别入口与障碍,助力灾后救援
  • WebConfig的登录与放行
  • 【C语言16天强化训练】从基础入门到进阶:Day 12
  • 归档和压缩
  • 摄像头镜头模组的设计要点
  • ES03-常用API
  • 安装了TortoiseSVN但是在idea的subversion里面找不到svn.exe
  • Dify 从入门到精通(第 59/100 篇):Dify 的自动化测试(进阶篇)