

今天分析的是點燈程序的升級版,厲害之處在于這個閃爍是用了精度比較高的函數(shù)庫,不是就像以前一樣是delay()延時

首先我們分析的東西不多,就一點

我們先從我們熟悉的代碼入手.
作為標準的Arduino,setup和loop不能少
是mainSetup()函數(shù),在我們上次的分析里面很全面的說過ESPcopter無人機源碼分析.1
接著就出現(xiàn)我們的timer對象的setInterval() 的方法了,下午說
接著就是loop循環(huán)了,這個里面的

在這個地方

我重寫一下,這個就是mainLoop里面的函數(shù)

這個函數(shù)沒有什么注釋,直接看代碼把.大致一致就是一個信號接收函數(shù)
先判斷一個標識位,然后開啟不同的功能.你看如果flag位0就是.要更新飛行器的固件,而且有一個線程是不停的去讀取一個套接字,當然是非阻塞線程.
然后就是無線電控制模式或者是AP熱點模式

這個地方也有一個getRx()的函數(shù),沒有看頭文件的名字.
processNextRequest函數(shù)用于處理DNS請求。當ESP8266模塊收到UDP請求后,它將判斷該請求是否查找域名映射的IP地址。如果是,則返回IP地址。若有錯誤則會返回setErrorReplyCode設(shè)定好的錯誤碼.
DNS函數(shù)的作用是,實現(xiàn)控制飛行器連接的時候就想平時上網(wǎng)一樣輸入IP即可
下面給出一段實例程序:
IPAddress local_IP(192, 168, 4, 1); //IP地址IPAddress gateway(192, 168, 4, 1); //網(wǎng)關(guān)地址IPAddress subnet(255, 255, 255, 0); //子網(wǎng)掩碼const byte DNS_PORT = 53; //DNS服務(wù)端口號,一般為53DNSServer dnsserver; //聲明DNSServer對象WebServer webserver(80);void handleRoot() //回調(diào)函數(shù){webserver.send(200, "text/plain", "通過域名訪問的根頁面");}void handleP1() //回調(diào)函數(shù){webserver.send(200, "text/plain", "通過域名訪問的p1頁面");}void setup(){WiFi.mode(WIFI_AP); //設(shè)置為AP模式WiFi.softAPConfig(local_IP, gateway, subnet);WiFi.softAP("DNSServer example");webserver.on("/", handleRoot);webserver.on("/p1", handleP1);dnsserver.start(DNS_PORT, "example.com", local_IP); //啟動DNS服務(wù),example.com即為注冊的域名webserver.begin();}void loop(){dnsserver.processNextRequest(); //處理來自客戶端的請求webserver.handleClient();}
此函數(shù)主要作用是檢查有沒有客戶端設(shè)備通過網(wǎng)絡(luò)向ESP8266網(wǎng)絡(luò)服務(wù)器發(fā)送請求。每一次handleClient`函數(shù)被調(diào)用時,ESP8266網(wǎng)絡(luò)服務(wù)器都會檢查一下是否有客戶端發(fā)送HTTP請求。因此建議將該函數(shù)放在loop函數(shù)中,從而確保它能經(jīng)常被調(diào)用。假如loop函數(shù)里有類似delay一類的函數(shù)延遲程序運行,那么就一定要注意了。如果handleClient函數(shù)長時間得不到調(diào)用,ESP8266網(wǎng)絡(luò)服務(wù)器會因為無法經(jīng)常檢查HTTP客戶端請求而導致服務(wù)器響應(yīng)變慢,嚴重的情況下,會導致服務(wù)器工作不穩(wěn)定。
那這個函數(shù)的作用就是ESP8266當AP,從機連接它,發(fā)信息時的接收線程
http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-c-plus-plus-reference/esp8266webserver/handleclient/
***********************************************************************/ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti對象,對象名稱是'wifiMulti'ESP8266WebServer esp8266_server(80);// 建立ESP8266WebServer對象,對象名稱為esp8266_server// 括號中的數(shù)字是網(wǎng)路服務(wù)器響應(yīng)http請求的端口號// 網(wǎng)絡(luò)服務(wù)器標準http端口號為80,因此這里使用80為端口號void setup(void){Serial.begin(9600); // 啟動串口通訊//通過addAp函數(shù)存儲 WiFi名稱 WiFi密碼wifiMulti.addAP("taichi-maker", "12345678"); // 這三條語句通過調(diào)用函數(shù)addAP來記錄3個不同的WiFi網(wǎng)絡(luò)信息。wifiMulti.addAP("taichi-maker2", "87654321"); // 這3個WiFi網(wǎng)絡(luò)名稱分別是taichi-maker, taichi-maker2, taichi-maker3。wifiMulti.addAP("taichi-maker3", "13572468"); // 這3個網(wǎng)絡(luò)的密碼分別是123456789,87654321,13572468。// 此處WiFi信息只是示例,請在使用時將需要連接的WiFi信息填入相應(yīng)位置。// 另外這里只存儲了3個WiFi信息,您可以存儲更多的WiFi信息在此處。int i = 0;while (wifiMulti.run() != WL_CONNECTED) { // 此處的wifiMulti.run()是重點。通過wifiMulti.run(),NodeMCU將會在當前delay(1000); // 環(huán)境中搜索addAP函數(shù)所存儲的WiFi。如果搜到多個存儲的WiFi那么NodeMCUSerial.print(i++); Serial.print(' '); // 將會連接信號最強的那一個WiFi信號。} // 一旦連接WiFI成功,wifiMulti.run()將會返回“WL_CONNECTED”。這也是// 此處while循環(huán)判斷是否跳出循環(huán)的條件。// WiFi連接成功后將通過串口監(jiān)視器輸出連接成功信息Serial.println('\n'); // WiFi連接成功后Serial.print("Connected to "); // NodeMCU將通過串口監(jiān)視器輸出。Serial.println(WiFi.SSID()); // 連接的WiFI名稱Serial.print("IP address:\t"); // 以及Serial.println(WiFi.localIP()); // NodeMCU的IP地址//--------"啟動網(wǎng)絡(luò)服務(wù)功能"程序部分開始-------- // 此部分為程序為本示例程序重點1esp8266_server.begin(); // 詳細講解請參見太極創(chuàng)客網(wǎng)站《零基礎(chǔ)入門學用物聯(lián)網(wǎng)》esp8266_server.on("/", handleRoot); // 第3章-第2節(jié) ESP8266-NodeMCU網(wǎng)絡(luò)服務(wù)器-1esp8266_server.onNotFound(handleNotFound);//--------"啟動網(wǎng)絡(luò)服務(wù)功能"程序部分結(jié)束--------Serial.println("HTTP esp8266_server started");// 告知用戶ESP8266網(wǎng)絡(luò)服務(wù)功能已經(jīng)啟動}/* 以下函數(shù)語句為本示例程序重點3詳細講解請參見太極創(chuàng)客網(wǎng)站《零基礎(chǔ)入門學用物聯(lián)網(wǎng)》第3章-第2節(jié) 3_2_1_First_Web_Server 的說明講解*/void loop(void){esp8266_server.handleClient(); // 處理http服務(wù)器訪問}/* 以下兩個函數(shù)為本示例程序重點2詳細講解請參見太極創(chuàng)客網(wǎng)站《零基礎(chǔ)入門學用物聯(lián)網(wǎng)》第3章-第2節(jié) 3_2_1_First_Web_Server 的說明講解*/void handleRoot() { //處理網(wǎng)站根目錄“/”的訪問請求esp8266_server.send(200, "text/plain", "Hello from ESP8266"); // NodeMCU將調(diào)用此函數(shù)。}// 設(shè)置處理404情況的函數(shù)'handleNotFound'void handleNotFound(){ // 當瀏覽器請求的網(wǎng)絡(luò)資源無法在服務(wù)器找到時,esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU將調(diào)用此函數(shù)。}
這個dome是函數(shù)的一個使用法,與上文對應(yīng)

c++不熟悉,但是Handler()一般是回調(diào)函數(shù)的意思




我這里做了一些回調(diào)函數(shù)的總結(jié)
簡單來說,這個函數(shù)你是直接以名字參數(shù)這種形式調(diào)用不了的
只是你程序里面一些流轉(zhuǎn)的數(shù)據(jù)會激活,好像一個管家一樣

這里再放一下這個函數(shù),不然很突兀

這個循環(huán)是讀取各種遙控模式發(fā)出的信息的一個函數(shù)

我們開始看這個函數(shù),首先我在截圖內(nèi)有三個箭頭
一個是我們要用的函數(shù)頭文件<>用的絕對頭文件
一個是面向?qū)ο蟮膭?chuàng)建對象,起名叫timer
然后就是寫了一個函數(shù)來定時的閃爍.

函數(shù)的調(diào)用有兩處,首先進行可相應(yīng)的配置,后面run()方法開啟
https://playground.arduino.cc/Code/SimpleTimer/
https://github.com/schinken/SimpleTimer
這個Simple的優(yōu)點是:
這是(另一個)簡單的庫,可以啟動時分操作。
它基于毫(分)),因此具有1毫秒的分辨率。
它使用輪詢,因此無法保證觸發(fā)回調(diào)的確切時間。例如,如果設(shè)置庫以便它每 2ms 調(diào)用一個函數(shù),但此函數(shù)需要 5ms 才能完成,那么您將每 5ms 調(diào)用一個函數(shù)。
對于非嚴格計時足夠的應(yīng)用程序,不使用中斷可避免中斷服務(wù)例程和主程序之間共享的全局變量的潛在問題,并且不使用硬件計時器。
基本目標是能夠每 n 毫秒執(zhí)行一段特定代碼,而無需使用中斷。
該算法如下所示:
lastMillis = 0forever do:if (millis() - lastMillis > n)call the particular piece of codelastMillis = millis()endend
怎么用:
構(gòu)造函數(shù)。程序中通常只需要一個簡單時間對象。
SimpleTimer timer;
調(diào)用函數(shù) f 每 d 毫秒。回調(diào)函數(shù)必須聲明為 。void f()
void repeatMe() {// do something}timerId = timer.setInterval(1000, repeatMe);
未完待續(xù)
