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

{

這段代碼實現了一個基于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;