esp32摄像显示时间_科普系列 || 第一弹~基于ESP32的WiFi连接
點(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4 根 48GB DDR5 内存,华硕预
- 下一篇: 移动app部分机型无法唤起h5支付宝支付