esp32摄像显示时间_科普系列 || 第一弹~基于ESP32的WiFi连接
點擊藍字關注
東南大學電子科協公眾號~
號外號外!
????還因為宅在家中無所事事嗎,科協現在為了同學們幫助學習單片機和后面準備競賽,電子科協決定推出一個系列文章,幫助大家了解常用的一些總線和一些通訊協議的概念及其在單片機上的使用方法,同時教大家一些自學API的方法和一些做嵌入式開發的思想。每周推送一篇!
注意啦~(敲黑板)
下面是正式科普時間~
1 | 背景介紹 ????近幾年智能家居的發展有目共睹,由于WiFi的普及,通過WiFi來實現智能家居便成為了各廠商的選擇。我們同學們在競賽中很多同學也想做出來利用WiFi的物聯網功能。本文主要介紹一下基于ESP32的WiFi的連接,關于MQTT的內容我們下次再講。 生活的藝術 |
2 | 模塊介紹 ????ESP32是上海樂鑫公司開發的有WiFi和藍牙通信功能的SOC,與經常使用的ESP8266 WiFi模塊是同一個公司開發的。其支持2.4GHz的WiFi(802.11 b/g/n)。后面PLD競賽會使用到的SEA開發板上的單片機部分即為ESP32模塊。所以我們這次就基于此模塊來講解,使用的開發平臺是Arduino IDE,編程語言為C++。 |
3 | IDE使用 ????我們首先打開ESP32 Arduino IDE的示例文件,可以看到WiFi文件夾下有很多示例。因為我們是連接WiFi,所以選擇WiFiClient即可。 ????根據代碼上面的注釋可以知道這個示例是連接WiFi后從data.sparkfun.com獲取信息的。我們不需要這部分,只需代碼中的連接WiFi部分。根據示例代碼中的注釋可以看到void setup()部分為WiFi連接部分,可以把void loop()里面的部分都刪除。 ????主要用到了WiFi.begin(ssid,password)、WiFi.status()和WiFi.localIP()三個函數。現在我們把ssid和password參數改成我們自己的WiFi賬號和密碼,注意不要刪去雙引號。然后下載到板子中驗證一下。推薦連接手機熱點,如果想連接自己家的路由器也可以。但是要注意手機熱點設置時一定要設置在2.4GHz帶寬下,如圖3所示。如果手機設置不了的話,一般默認都是2.4GHz,不用管就好了。 |
4 | 代碼燒錄 ????將代碼編譯并燒錄到開發板之后,可以看到串口監視器返回的數據。(ip地址可能不一樣)然后我們再看我們的手機,上面顯示目前已經有一個設備連接。說明連接成功了。 ????當然有人可能就要問了,你這手機上只顯示了設備MAC地址和名稱,你怎么那么確定這個就是開發板那。那我們可以打印mac地址來確定。但是示例中沒有這個函數怎么辦那?這時候我們就要去找庫文件了。閱讀庫文件是單片機開發的重要一部分。一般的IDE(比如ARM開發常用的Keil和IAR)可以直接對著函數右鍵尋找定義來打開庫文件。Arduino不可以,我這里是用加載了Arduino插件的VS code直接打開的。有的庫函數的相關介紹是在.h文件下,有的是在.cpp或.c文件下。 ????可以看到他這個函數說明都在WiFiSTA.cpp下。可能有人要問為什么不在WiFi.h或WiFi.cpp下那。我們打開WiFi.h可以看到WiFiClass是WiFiSTAClass的一個派生類。具體我們還是看WiFiSTA.cpp下。 |
5 | 函數使用 ????首先可以看看WiFi.begin()函數。看注釋可知其是用來設置wifi連接的,輸入參數分別為ssid,passphrase(即password密碼),bssid(或AP的MAC),channel(信道)以及connect(是否連接),除了ssid以外都是可選的,在示例中只使用了ssid和passphrase這兩個參數。 ????我們再來看看WiFi.status()。可以看到這是返回連接狀態的,返回值為wl_status_t中的一種。當然,每種狀態代表的意義就必須查官方文檔說明了。可以知道WL_CONNECTED意思是已經連接。 ????如果你翻一翻庫文件會發現下面有個isConnected()函數,其作用就是檢測連接。實際上可以把源代碼中的WiFi.status()!=WL_CONNECTED改成!WiFi.isConnected(),作用一樣。 ????這里也體現了一個思想,在進行通訊連接的時候一定要確保連接上再進行下一步活動。當然這里也有一個問題,就是假如一直沒連接上就死循環了。實際上可以增加一個超時判斷。一旦超時就通過串口通知,并不再進行需要WiFi連接的活動。我們可以進行改寫代碼。 ????localIP()這個函數則是獲得當前的IP地址的,這個和函數名是一致的。 下面就能看到macAddress()函數。 ????為什么會有兩個macAddress()那,這為什么會函數復用那?可以看到兩個macAddress參數和返回值并不一樣。上面那個是把mac字符串的首地址返回了,下面那個則是直接返回了Arduino的字符串類String(注意不是C++標準庫的std::string)。我們這里只要打印出來,所以可以直接使用第二個。 |
6 | 最終結果 ????我們改寫完代碼,來重新燒錄一下,看一下結果。 |
????可以看到mac地址一致,說明確實是開發板連接上了手機的熱點。
????我們再關掉熱點試一下,差不多10s后顯示”Time out!”,需要WiFi連接運行的部分沒有運行,不需要的部分正常運行了。
????這樣我們就實現了WiFi的連接,同時我也教了大家通過閱讀庫文件來學習單片機的方法。下次推送我來講講MQTT協議的實現,然后我們來利用MQTT協議點個LED試試。希望大家持續關注這個系列推送。
????另外,示例代碼和最終代碼都放在了最后,大家可以閱讀。
代 | 碼 | 示 | 例 |
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()
{
}
本期介紹就到這里
,我們下期見
圖片? |? 李力行
文字? |? 李力行、俞峰
排版? |? 徐軼凡、 張幸
總結
以上是生活随笔為你收集整理的esp32摄像显示时间_科普系列 || 第一弹~基于ESP32的WiFi连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4 根 48GB DDR5 内存,华硕预
- 下一篇: iQOO Z7 系列手机预热:配备 OI