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

{

这段代码实现了一个基于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());// 启动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.pswp.cn/news/920356.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920356.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920356.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青少年软件编程(python六级)等级考试试卷-客观题(2023年3月)

更多内容和历年真题请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 六级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年软件编程&#xff08;python六级&#xff09;等级考试试卷-客观题&#xff08;2023年3月&#xff09…

mongodb influxdb

、您需要提前配置 MongoDB 和 InfluxDB。让我帮您说明配置步骤&#xff1a; MongoDB 配置 启动 MongoDB 容器后&#xff0c;进入容器创建数据库&#xff1a; # 进入 MongoDB 容器 docker exec -it mongo mongosh -u root -p 123456# 创建 product 数据库 use product# 创建集合…

模拟电路中什么时候适合使用电流传递信号,什么时候合适使用电压传递信号

一、应用 1.实际应用中&#xff0c;需要进行权衡&#xff0c;比如抗干扰能力&#xff0c;传输距离&#xff0c;功耗 2.电压信号比较容易受到干扰&#xff0c;对噪声比较敏感&#xff0c;有噪声容限一说 3.电流信号对噪声不敏感 4.电源电压下降的稳定性或者长距离传输中的损耗问…

Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化

stevensu1/EC0823: Flink2.0学习笔记&#xff1a;使用HikariCP 自定义sink实现数据库连接池化 在 Flink 流处理应用中使用 HikariCP 实现数据库连接池化&#xff0c;对于写入关系型数据库&#xff08;如 MySQL、PostgreSQL&#xff09;的 自定义 Sink 来说&#xff0c;不仅是推…

Ubuntu安装及配置Git(Ubuntu install and config Git Tools)

Setup Git sudo apt update sudo apt install git // 查看git版本 git --versionConfig Github // 不清楚username和email的可以直接在github网站上点击头像选择settings来查看 git config --global user

将C++资源管理测试框架整合到GitLab CI/CD的完整实践指南

将C资源管理测试框架整合到GitLab CI/CD的完整实践指南 摘要 本文深入探讨了如何将先进的C资源管理测试框架无缝集成到GitLab CI/CD流水线中&#xff0c;实现自动化资源监控、性能回归检测和高质量测试。通过实际案例和最佳实践&#xff0c;展示了如何构建一个能够精确控制CPU亲…

Web漏洞

一、Sql注入 sql注入漏洞的成因是由于后端数据库查询语句没有做过滤导致了前端输入字符串可以直接拼接到语句而获取数据库信息。 1.类型 数字型和字符型 区分&#xff1a;数字型可以进行加减运算&#xff0c;id11会获取id2的信息&#xff0c;而字符型只会获取1的数据 2.方…

Java中使用Spring Boot+Ollama构建本地对话机器人

目录结构Ollama是什么安装 Ollama下载大模型运行模型Java和IDEA版本创建一个springboot项目创建一个简单的对话接口启动spring boot流式对话输出用原生 HTML 打造可交互前端接入 OpenAI、DeepSeek 等云模型&#xff08;可选&#xff09;原文地址传送门 我是想做一个大模型本地部…

学习设计模式《二十四》——访问者模式

一、基础概念 访问者模式的本质是【预留后路&#xff0c;回调实现】。仔细思考访问者模式&#xff0c;它的实现主要是通过预先定义好调用的通路&#xff0c;在被访问的对象上定义accept方法&#xff0c;在访问者的对象上定义visit方法&#xff1b;然后在调用真正发生的时候&…

Rust 符号体系全解析:分类、应用与设计意图

Rust 的符号体系是其语法规则、内存安全与类型安全设计的核心载体。每个符号不仅承担特定功能&#xff0c;更隐含 Rust 对 “安全” 与 “表达力” 的平衡逻辑。本文按功能维度&#xff0c;系统梳理 Rust 中所有常用符号&#xff0c;结合代码示例与设计背景&#xff0c;提供全面…

神经网络|(十六)概率论基础知识-伽马函数·上

【1】引言 前序学习进程中&#xff0c;对经典的二项分布和正态分布已经有一定的掌握。 今天为学习一种稍显复杂的分布提前布局一下&#xff0c;学习伽马函数。 【2】伽马函数 伽马函数有两种经典写法&#xff0c;一种是积分形式&#xff0c;另一种是无穷乘积形式。 【2.1】…

安全向量模板类SiVector

实现一个安全向量模板类 SiVector&#xff0c;其设计目标是&#xff1a;在保持 std::vector 易用性的基础上&#xff0c;增强越界访问的安全性&#xff08;避免崩溃&#xff09;&#xff0c;同时兼容 std::vector 的核心接口和使用习惯。支持嵌套使用&#xff08;如 SiVector&l…

Cloudflare 推出 GenAI 安全工具,守护企业数据

8 月 26 日,Cloudflare 为其企业平台 Cloudflare One 推出了新的安全功能,帮助企业安全地采用 ChatGPT、Claude 和 Gemini 等生成式 AI 工具。该工具构建为云访问安全代理 (CASB),通过 API 集成来监控和保护这些 AI 服务,无需安装设备。 随着企业对 GenAI 的使用激增——C…

Mac测试端口连接的几种方式

在 macOS 上测试端口是否开放&#xff0c;可通过以下三种常用方法实现&#xff08;推荐优先使用系统自带的 nc 命令&#xff0c;简单高效&#xff09;&#xff1a;方法 1&#xff1a;用系统自带 nc&#xff08;netcat&#xff09;测试&#xff08;最推荐&#xff09;nc 是 macO…

用PyTorch实现多类图像分类:从原理到实际操作

引言 图像分类作为计算机视觉的基石&#xff0c;已深度渗透到我们生活的方方面面——从医疗影像中早期肿瘤的识别、自动驾驶汽车对道路元素的实时检测&#xff0c;到卫星图像的地形分析与零售行业的商品识别&#xff0c;其核心都是让机器学会"看懂"世界并做出分类决…

window安装python环境

1、确认操作系统类型和位数&#xff0c;明确下载安装包的版本&#xff0c;示例为&#xff1a;windows&#xff0c;64位环境。 2、登录python官网下载exe安装包&#xff0c;下载网址&#xff1a;Download Python | Python.org 找到想要的对应python版本&#xff0c;本次示例下…

用 Streamlit 构建一个简易对话机器人 UI

在这篇文章中&#xff0c;我将演示如何用 Streamlit 快速构建一个轻量的对话机器人 UI&#xff0c;并通过 LangChain / LangGraph 调用 LLM&#xff0c;实现简单的对话功能。通过将前端和后端分离&#xff0c;你可以单独测试模型调用和 UI 显示。为什么选择 Streamlit&#xff…

【Redis 进阶】Redis 典型应用 —— 缓存(cache)

一、什么是缓存 缓存&#xff08;cache&#xff09;是计算机中的一个经典的概念&#xff0c;在很多场景中都会涉及到。核心思路就是把一些常用的数据放到触手可及&#xff08;访问速度更快&#xff09;的地方&#xff0c;方便随时读取。 举例&#xff1a;我需要去高铁站坐高铁…

RK3588 Ubuntu22.04 解决eth0未托管问题

在调试rk3588的Ubuntu的时候发现&#xff0c;网络那里一直显示eth0未托管&#xff0c;但是联网功能又是正常的&#xff0c;猜测是某一个配置文件的问题修改如下&#xff1a;打开/etc/NetworkManager/NetworkManager.conf&#xff0c;将managed&#xff0c;修改成true即可然后重…

雷卯针对香橙派Orange Pi 3G-IoT-B开发板防雷防静电方案

一、应用场景计算机、无线网络服务器、游戏机、音乐播放器、高清视频播放器、扬声器、Android 设备、Scratch 编程平台二、核心功能参数三、扩展接口详情雷卯专心为您解决防雷防静电的问题&#xff0c;有免费实验室供检测。开发板资料转自深圳迅龙软件。谢谢&#xff01;