日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

esp32摄像显示时间_科普系列 || 第一弹~基于ESP32的WiFi连接

發(fā)布時(shí)間:2023/12/19 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 esp32摄像显示时间_科普系列 || 第一弹~基于ESP32的WiFi连接 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(diǎn)擊藍(lán)字關(guān)注

東南大學(xué)電子科協(xié)公眾號~

號外號外!

????還因?yàn)檎诩抑袩o所事事嗎,科協(xié)現(xiàn)在為了同學(xué)們幫助學(xué)習(xí)單片機(jī)和后面準(zhǔn)備競賽,電子科協(xié)決定推出一個(gè)系列文章,幫助大家了解常用的一些總線和一些通訊協(xié)議的概念及其在單片機(jī)上的使用方法,同時(shí)教大家一些自學(xué)API的方法和一些做嵌入式開發(fā)的思想。每周推送一篇!

注意啦~(敲黑板)

下面是正式科普時(shí)間~

1

背景介紹

????近幾年智能家居的發(fā)展有目共睹,由于WiFi的普及,通過WiFi來實(shí)現(xiàn)智能家居便成為了各廠商的選擇。我們同學(xué)們在競賽中很多同學(xué)也想做出來利用WiFi的物聯(lián)網(wǎng)功能。本文主要介紹一下基于ESP32的WiFi的連接,關(guān)于MQTT的內(nèi)容我們下次再講。

生活的藝術(shù)

2

模塊介紹

????ESP32是上海樂鑫公司開發(fā)的有WiFi和藍(lán)牙通信功能的SOC,與經(jīng)常使用的ESP8266 WiFi模塊是同一個(gè)公司開發(fā)的。其支持2.4GHz的WiFi(802.11 b/g/n)。后面PLD競賽會使用到的SEA開發(fā)板上的單片機(jī)部分即為ESP32模塊。所以我們這次就基于此模塊來講解,使用的開發(fā)平臺是Arduino IDE,編程語言為C++。

3

IDE使用

????我們首先打開ESP32 Arduino IDE的示例文件,可以看到WiFi文件夾下有很多示例。因?yàn)槲覀兪沁B接WiFi,所以選擇WiFiClient即可。

????根據(jù)代碼上面的注釋可以知道這個(gè)示例是連接WiFi后從data.sparkfun.com獲取信息的。我們不需要這部分,只需代碼中的連接WiFi部分。根據(jù)示例代碼中的注釋可以看到void setup()部分為WiFi連接部分,可以把void loop()里面的部分都刪除。

????主要用到了WiFi.begin(ssid,password)、WiFi.status()和WiFi.localIP()三個(gè)函數(shù)。現(xiàn)在我們把ssid和password參數(shù)改成我們自己的WiFi賬號和密碼,注意不要刪去雙引號。然后下載到板子中驗(yàn)證一下。推薦連接手機(jī)熱點(diǎn),如果想連接自己家的路由器也可以。但是要注意手機(jī)熱點(diǎn)設(shè)置時(shí)一定要設(shè)置在2.4GHz帶寬下,如圖3所示。如果手機(jī)設(shè)置不了的話,一般默認(rèn)都是2.4GHz,不用管就好了。

4

代碼燒錄

????將代碼編譯并燒錄到開發(fā)板之后,可以看到串口監(jiān)視器返回的數(shù)據(jù)。(ip地址可能不一樣)然后我們再看我們的手機(jī),上面顯示目前已經(jīng)有一個(gè)設(shè)備連接。說明連接成功了。

????當(dāng)然有人可能就要問了,你這手機(jī)上只顯示了設(shè)備MAC地址和名稱,你怎么那么確定這個(gè)就是開發(fā)板那。那我們可以打印mac地址來確定。但是示例中沒有這個(gè)函數(shù)怎么辦那?這時(shí)候我們就要去找?guī)煳募恕i喿x庫文件是單片機(jī)開發(fā)的重要一部分。一般的IDE(比如ARM開發(fā)常用的Keil和IAR)可以直接對著函數(shù)右鍵尋找定義來打開庫文件。Arduino不可以,我這里是用加載了Arduino插件的VS code直接打開的。有的庫函數(shù)的相關(guān)介紹是在.h文件下,有的是在.cpp或.c文件下。

????可以看到他這個(gè)函數(shù)說明都在WiFiSTA.cpp下。可能有人要問為什么不在WiFi.h或WiFi.cpp下那。我們打開WiFi.h可以看到WiFiClass是WiFiSTAClass的一個(gè)派生類。具體我們還是看WiFiSTA.cpp下。

5

函數(shù)使用

????首先可以看看WiFi.begin()函數(shù)。看注釋可知其是用來設(shè)置wifi連接的,輸入?yún)?shù)分別為ssid,passphrase(即password密碼),bssid(或AP的MAC),channel(信道)以及connect(是否連接),除了ssid以外都是可選的,在示例中只使用了ssid和passphrase這兩個(gè)參數(shù)。

????我們再來看看WiFi.status()。可以看到這是返回連接狀態(tài)的,返回值為wl_status_t中的一種。當(dāng)然,每種狀態(tài)代表的意義就必須查官方文檔說明了。可以知道WL_CONNECTED意思是已經(jīng)連接。

????如果你翻一翻庫文件會發(fā)現(xiàn)下面有個(gè)isConnected()函數(shù),其作用就是檢測連接。實(shí)際上可以把源代碼中的WiFi.status()!=WL_CONNECTED改成!WiFi.isConnected(),作用一樣。

????這里也體現(xiàn)了一個(gè)思想,在進(jìn)行通訊連接的時(shí)候一定要確保連接上再進(jìn)行下一步活動。當(dāng)然這里也有一個(gè)問題,就是假如一直沒連接上就死循環(huán)了。實(shí)際上可以增加一個(gè)超時(shí)判斷。一旦超時(shí)就通過串口通知,并不再進(jìn)行需要WiFi連接的活動。我們可以進(jìn)行改寫代碼。

????localIP()這個(gè)函數(shù)則是獲得當(dāng)前的IP地址的,這個(gè)和函數(shù)名是一致的。

下面就能看到macAddress()函數(shù)。

????為什么會有兩個(gè)macAddress()那,這為什么會函數(shù)復(fù)用那?可以看到兩個(gè)macAddress參數(shù)和返回值并不一樣。上面那個(gè)是把mac字符串的首地址返回了,下面那個(gè)則是直接返回了Arduino的字符串類String(注意不是C++標(biāo)準(zhǔn)庫的std::string)。我們這里只要打印出來,所以可以直接使用第二個(gè)。

6

最終結(jié)果

????我們改寫完代碼,來重新燒錄一下,看一下結(jié)果。

????可以看到mac地址一致,說明確實(shí)是開發(fā)板連接上了手機(jī)的熱點(diǎn)。

????我們再關(guān)掉熱點(diǎn)試一下,差不多10s后顯示”Time out!”,需要WiFi連接運(yùn)行的部分沒有運(yùn)行,不需要的部分正常運(yùn)行了。

????這樣我們就實(shí)現(xiàn)了WiFi的連接,同時(shí)我也教了大家通過閱讀庫文件來學(xué)習(xí)單片機(jī)的方法。下次推送我來講講MQTT協(xié)議的實(shí)現(xiàn),然后我們來利用MQTT協(xié)議點(diǎn)個(gè)LED試試。希望大家持續(xù)關(guān)注這個(gè)系列推送。

????另外,示例代碼和最終代碼都放在了最后,大家可以閱讀。

WiFiClient.ino(示例代碼):

/*

?*??This?sketch?sends?data?via?HTTP?GET?requests?to?data.sparkfun.com?service.

?*

?*??You?need?to?get?streamId?and?privateKey?at?data.sparkfun.com?and?paste?them

?*??below.?Or?just?customize?this?script?to?talk?to?other?HTTP?servers.

?*

?*/

#include?

const?char*?ssid?????=?"your-ssid";

const?char*?password?=?"your-password";

const?char*?host?=?"data.sparkfun.com";

const?char*?streamId???=?"....................";

const?char*?privateKey?=?"....................";

void?setup()

{

????Serial.begin(115200);

????delay(10);

????//?We?start?by?connecting?to?a?WiFi?network

????Serial.println();

????Serial.println();

????Serial.print("Connecting?to?");

????Serial.println(ssid);

????WiFi.begin(ssid,?password);

????while?(WiFi.status()?!=?WL_CONNECTED)?{

????????delay(500);

????????Serial.print(".");

????}

????Serial.println("");

????Serial.println("WiFi?connected");

????Serial.println("IP?address:?");

????Serial.println(WiFi.localIP());

}

int?value?=?0;

void?loop()

{

????delay(5000);

????++value;

????Serial.print("connecting?to?");

????Serial.println(host);

????//?Use?WiFiClient?class?to?create?TCP?connections

????WiFiClient?client;

????const?int?httpPort?=?80;

????if?(!client.connect(host,?httpPort))?{

????????Serial.println("connection?failed");

????????return;

????}

????//?We?now?create?a?URI?for?the?request

????String?url?=?"/input/";

????url?+=?streamId;

????url?+=?"?private_key=";

????url?+=?privateKey;

????url?+=?"&value=";

????url?+=?value;

????Serial.print("Requesting?URL:?");

????Serial.println(url);

????//?This?will?send?the?request?to?the?server

????client.print(String("GET?")?+?url?+?"?HTTP/1.1\r\n"?+

?????????????????"Host:?"?+?host?+?"\r\n"?+

?????????????????"Connection:?close\r\n\r\n");

????unsigned?long?timeout?=?millis();

????while?(client.available()?==?0)?{

????????if?(millis()?-?timeout?>?5000)?{

????????????Serial.println(">>>?Client?Timeout?!");

????????????client.stop();

????????????return;

????????}

????}

????//?Read?all?the?lines?of?the?reply?from?server?and?print?them?to?Serial

????while(client.available())?{

????????String?line?=?client.readStringUntil('\r');

????????Serial.print(line);

????}

????Serial.println();

????Serial.println("closing?connection");

}

最終代碼:

#include?

const?char*?ssid?????=?"hotspot";

const?char*?password?=?"abcdefgh";

bool?isConnect?=?true;

unsigned?long?Time;

void?setup()

{

????Serial.begin(115200);

????delay(10);

????//?We?start?by?connecting?to?a?WiFi?network

????Serial.println();

????Serial.println();

????Serial.print("Connecting?to?");

????Serial.println(ssid);

????WiFi.begin(ssid,?password);

????Time?=?millis();

????while?(!WiFi.isConnected())?{

????????if(millis()?-?Time?>?10000){

??????????Serial.println("Time?out!");

??????????isConnect?=?false;

??????????break;

????????}

????}

????if(isConnect){

??????Serial.println("");

??????Serial.println("WiFi?connected");

??????Serial.println("IP?address:?");

??????Serial.println(WiFi.localIP());

??????Serial.println("MAC?address:?");

??????Serial.println(WiFi.macAddress());

????}

????Serial.println("The?program?has?been?run?out");

}

void?loop()

{

}

本期介紹就到這里

,我們下期見

圖片? |? 李力行

文字? |? 李力行、俞峰

排版? |? 徐軼凡、 張幸

總結(jié)

以上是生活随笔為你收集整理的esp32摄像显示时间_科普系列 || 第一弹~基于ESP32的WiFi连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。