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