授人以魚不如授人以漁,目的不是爲了教會你具體項目開發,而是學會學習的能力。但願你們分享給你周邊須要的朋友或者同窗,說不定大神成長之路有博哥的奠定石。。。node
QQ技術互動交流羣:ESP8266&32 物聯網開發 羣號622368884,不喜勿噴git
1、基礎篇github
2、網絡篇web
- ESP8266開發之旅 網絡篇① 認識一下Arduino Core For ESP8266
- ESP8266開發之旅 網絡篇② ESP8266 工做模式與ESP8266WiFi庫
- ESP8266開發之旅 網絡篇③ Soft-AP——ESP8266WiFiAP庫的使用
- ESP8266開發之旅 網絡篇④ Station——ESP8266WiFiSTA庫的使用
- ESP8266開發之旅 網絡篇⑤ Scan WiFi——ESP8266WiFiScan庫的使用
- ESP8266開發之旅 網絡篇⑥ ESP8266WiFiGeneric——基礎庫
- ESP8266開發之旅 網絡篇⑦ TCP Server & TCP Client
- ESP8266開發之旅 網絡篇⑧ SmartConfig——一鍵配網
- ESP8266開發之旅 網絡篇⑨ HttpClient——ESP8266HTTPClient庫的使用
- ESP8266開發之旅 網絡篇⑩ UDP服務
- ESP8266開發之旅 網絡篇⑪ WebServer——ESP8266WebServer庫的使用
- ESP8266開發之旅 網絡篇⑫ 域名服務——ESP8266mDNS庫
- ESP8266開發之旅 網絡篇⑬ SPIFFS——ESP8266 Flash文件系統
- ESP8266開發之旅 網絡篇⑭ web配網
- ESP8266開發之旅 網絡篇⑮ 真正的域名服務——DNSServer
- ESP8266開發之旅 網絡篇⑯ 無線更新——OTA固件更新
3、應用篇編程
4、高級篇緩存
筆者本書的主題是基於Arduino平臺來開發ESP8266。那麼從另一個角度來看待這句話,能夠理解爲:把ESP8266看成一款相似於Arduino UNO型號(爲何不是Mega2560呢?能夠從硬件資源方向考慮)的Arduino開發板,用Arduino平臺的開發方式來開發項目,只不過ESP8266是在Arduino UNO的基礎上加了網絡功能。
本章將介紹ESP8266做爲Arduino UNO開發板的一些重要開發知識點。
主要分爲8個部分:
1.ESP8266 Arduino程序結構
2.計時和延時(Timing and delays)
3.NodeMcu 端口映射
4.數字IO(Digital IO)
5.中斷功能
6.模擬輸入(ADC)
7.模擬輸出(PWM)
8.串口通訊(Serial)網絡
在第2章中,筆者提供了一個測試用例,讓咱們來回顧一下,代碼以下:ide
/** * Demo: * 測試ESP8266 demo * 打印ESP8266模塊信息 * 1.打印Arduino Core For ESP8266 版本,筆者是2.4.2版本 * 2.打印Flash的惟一性芯片id(讀者能夠思考一下是否能夠用來作點什麼惟一性參考) * 3.打印Flash實際大小 * 4.打印IDE配置的使用Flash大小 * 5.打印IDE配置的Flash鏈接通訊的頻率 * 6.打印Flash鏈接模式:QIO QOUT DIO DOUT,能夠理解爲Flash傳輸速率 * @author 單片機菜鳥 * @date 2018/10/22 */ void setup() { // put your setup code here, to run once: Serial.begin(115200); //使能軟件看門狗的觸發間隔 ESP.wdtEnable(5000); } void loop() { //喂狗 ESP.wdtFeed(); FlashMode_t ideMode = ESP.getFlashChipMode(); String coreVersion = ESP.getCoreVersion(); Serial.print(F("Arduino Core For ESP8266 Version: ")); Serial.println(coreVersion); Serial.printf("Flash real id(惟一標識符): %08X\n", ESP.getFlashChipId()); Serial.printf("Flash 實際大小: %u KBytes\n", ESP.getFlashChipRealSize()/1024); Serial.printf("IDE配置Flash大小: %u KBytes,每每小於實際大小\n", ESP.getFlashChipSize()/1024); Serial.printf("IDE配置Flash頻率 : %u MHz\n", ESP.getFlashChipSpeed()/1000000); Serial.printf("Flash ide mode: %s\n\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN")); delay(1000); }
去掉代碼細節,會獲得相似於Arduino編程的代碼結構:函數
/** * ESP8266 Arduino程序結構 * @author 單片機菜鳥 * @date 2018/10/24 */ void setup() { // 這裏開始寫初始化代碼,只會執行一次 } void loop() { //這裏寫運行代碼,重複執行 }
對於習慣c語言編程的讀者,以上代碼又能夠抽象成如下僞代碼結構:oop
/** * ESP8266 Arduino程序僞代碼結構 * @author 單片機菜鳥 * @date 2018/10/24 */ void main(){ watchdogEnable();//啓動看門狗 setup();//初始化函數 while(1){ loop();//業務代碼函數 } }
代碼解析
1.在ESP8266 Arduino編程中,默認會開啓看門狗功能,也就是對應僞代碼的watchdogEnable(),意味着咱們須要適當喂狗,否則會觸發看門狗復位;
2.setup()方法:初始化函數,只會運行一次,因此通常狀況下,咱們都會在這裏配置好初始化參數,好比IO口模式、串口波特率設置等等;
3.loop()方法:不斷重複執行,這裏編寫咱們的業務代碼,同時要注意執行喂狗操做。
時間控制,基本上能夠說存在於每個項目代碼中。目前在Arduino中跟時間控制有關的方法包括如下幾個:
delay(ms)
暫停一個給定的毫秒數的時間間隔。
delayMicroseconds(us)
暫停一個給定的微秒數的時間間隔。
millis()
返回重啓(reset)後所通過的毫秒數。
micros()
返回重啓(reset)後所通過的微秒數
舒適提示
一般,咱們控制LED燈閃爍都會加上一個delay延時來達到切換亮滅時間長度。可是delay有個缺點就是:在給定的時間間隔內是不能作其餘操做,這樣對於一些須要響應按鍵操做的場景就不適用了。那麼有沒有什麼辦法既能延時又能不影響其餘操做呢?固然,這就是millis()的妙用,經過獲取兩個時間點的毫秒數,而後計算它們的差值,差值時間間隔內是能夠執行其餘操做的。代碼片斷以下:
long debouncdDelay = 60;//延時間隔 long lastDebounceTime = 0; //最近記錄的一次時間 // 判斷時間間隔是否大於設定的時間間隔。 if(millis()-lastDebounceTime>debouncdDelay){ lastDebounceTime = millis(); }
在前面,筆者有說到,本書的實驗案例是基於NodeMcu這塊ESP8266開發板來進行的,其中NodeMcu的核心芯片是ESP8266-12F。要想知道ESP8266-12F給咱們提供了什麼功能模塊,首先了解一下它有什麼引腳端口以及NodeMcu與它之間的引腳端口映射關係。
首先,認識一下ESP8266-12F的引腳定義,一般會隱藏pin6-pin11,以下圖:
固然,筆者也會提供完整的引腳圖以便對比,以下圖:
分析引腳圖,能夠得出幾個結論:
1.ESP8266-12F總共有22個引腳,對應了第1章選型表的SMD-22封裝工藝,同時有GPIO0-GPIO16共17個通用IO口,可是得注意有些IO口還能夠完成其餘功能(也叫作引腳複用),諸如Serial、I2C、SPI,由相應的函數庫完成;
2.ESP8266具備一個可用的單通道ADC;
3.GPIO6-GPIO11(複用引腳CS、MISO、MOSI、SCK)用於鏈接外部flash,對用戶不可用,試圖使用這些引腳做爲IO將會致使程序奔潰;
4.支持SPI總線通訊,對應引腳爲GPIO12-GPIO15;
5.支持I2C總線,對應引腳爲GPIO4-GPIO5;
6.支持串口通訊Serial、Serial1,默認對應引腳GPIO1-GPIO3;
接下來,先了解一下NoodeMcu的實物圖,以下圖:
同時,讀者也須要知道ESP8266-12F與NodeMcu的端口映射關係,以下圖:
能夠看出:
1.中間的DEVKIT部分,就是NodeMcu提供給外界的端口,對應實物圖上標註的端口名稱;
2.除開中間部分,其餘部分基本上對應ESP8266引腳,以不一樣顏色塊來區分不一樣功能;
舒適提示
NodeMcu上的CLK、SD0、CMD、SD一、SD2引腳,是用於鏈接外接flash芯片,不該該用於鏈接其餘模塊,懸空便可,以防程序奔潰。
或許筆者會以爲看圖有點複雜,因此筆者總結了下面的GPIO引腳映射表,以供參考:
NodeMCU的引腳名稱 | ESP8266內部GPIO引腳號 | 可複用功能 | 備註 |
---|---|---|---|
D0 | GPIO16 | 無 | 可用,只能用做GPIO讀/寫,不支持特殊功能 |
D1 | GPIO5 | I2C總線的SCL | 可用 |
D2 | GPIO4 | I2C總線的SDA | 可用 |
D3 | GPIO0 | 無 | 不可用,燒錄固件或者運行模式控制端口 |
D4 | GPIO2 | Serial1的TX | Serial1沒有RX |
D5 | GPIO14 | SPI總線的SCLK | 可用 |
D6 | GPIO12 | SPI總線的MISO | 可用 |
D7 | GPIO13 | SPI總線的MOSI、Serial的RX | 可用 |
D8 | GPIO15 | SPI總線的CS、Serial的TX | 可用 |
D9 | GPIO3 | Serial的RX | 可用 |
D10 | GPIO1 | Serial的TX | 可用 |
SD2 | GPIO9 | 無 | 儘可能不用 |
SD3 | GPIO10 | 無 | 儘可能不用 |
從上面表格能夠看出,咱們大約11個GPIO引腳可用。而11箇中的2個引腳一般被保留用於RX和TX,以便進行串口通訊。所以最後,只剩下8個通用I / O引腳,即D0到D8(除開D3特殊用途)。
舒適提示
請注意,D0 / GPIO16引腳只能用做GPIO讀/寫,不支持特殊功能。
上面說到,ESP8266-12F(也能夠大膽說ESP8266-12系列)最終只剩下8個通用的I/O引腳以供咱們使用,便是NodeMcu上的D0-D8(除D3以外)。
Arduino中的引腳號直接與ESP8266 GPIO的引腳號對應通訊。pinMode/digitalRead/digitalWrite函數不變,因此要讀取GPIO2,可調用digitalRead(2)。除了D0能夠設置爲INPUT(輸入)、OUTPUT(輸出)或者INPUT_PULLDOWN(輸入,默認下拉,也就是低電平),剩餘的數字IO引腳能夠設置爲INPUT(輸入)、OUTPUT(輸出)或者INPUT_PULLUP(輸入,默認上拉,也就是高電平)。
下面,將在NodeMcu的D1引腳上寫一個LED Blink的Arduino草圖:
/** * LED燈閃爍實驗 */ void setup() { pinMode(D1, OUTPUT); // 初始化D1引腳爲輸出引腳 } void loop() { digitalWrite(D1, LOW); // 亮燈 delay(1000); // 延時1s digitalWrite(D1, HIGH);// 滅燈 delay(1000); // 延時1s }
注意
某些開發板和模塊,仍將使用第9和第11引腳(若是閃存芯片工做於DIO模式,與默認的QIO模式相反),它們可用於IO。
中斷能夠理解爲在正常的運行流程中忽然插入的操做,這就像你在忙於工做的時候,領導忽然叫你去買個下午茶,而後你就去把下午茶買回來,再繼續工做。基於ESP8266的NodeMcu的數字IO的中斷功能是經過attachInterrupt,detachInterrupt函數所支持的。除了D0/GPIO16,中斷能夠綁定到任意GPIO的引腳上。所支持的標準中斷類型有:CHANGE(改變沿,電平從低到高或者從高到低)、RISING(上升沿,電平從低到高)、FALLING(降低沿,電平從高到低)。
首先,咱們來看看Arduino IDE中用於中斷的函數。
1.attachInterrupt()
該功能用於在將指定引腳設置爲響應中斷。
函數: attachInterrupt(pin, function, mode);
參數:
pin:要設置中斷編號,注意,這裏不是引腳編號。
function:中斷髮生時運行的函數, 這個函數不帶任何參數,不返回任何內容。
Interrupt type/mode:它定義中斷被觸發的條件方式。
CHANGE:改變沿,引腳電平從低變爲高或者從高變爲低時觸發中斷。
RISING:上升沿,引腳電平從低變爲高時觸發中斷。
FALLING:降低沿,引腳電平從高變爲低時觸發中斷。
返回值: 無;
2.detachInterrupt()
該功能用於禁用指定GPIO引腳上的中斷。
函數: detachInterrupt(pin)
參數:
pin:要禁用的中斷的GPIO引腳。
返回值: 無;
3.digitalPinToInterrupt()
該功能用於獲取指定GPIO引腳的中斷號。
函數: digitalPinToInterrupt(pin)
參數:
pin:要獲取中斷號的GPIO引腳。
例子
將NodeMcu的D2引腳設置爲上升沿中斷。在D2上外接一個按鍵,按鍵經過電阻下拉到地。當發生中斷的時候,咱們在串口監視器上打印「Hello ESP8266」。
例子代碼
/** * 功能描述:ESP8266中斷演示 */ void setup() { Serial.begin(115200);//設置串口波特率 attachInterrupt(digitalPinToInterrupt(D2), InterruptFunc, RISING);//設置中斷號、響應函數、觸發方式 } void loop() { } /** * 中斷響應函數 */ void InterruptFunc(){ Serial.println("Hello ESP8266"); }
學過模擬電路或者數字電路的人都會聽過ADC,它又叫作模數轉換器,用於將模擬信號轉換成可視化的數字形式。ESP8266具備內置的10位ADC,只有一個ADC通道,即只有一個ADC輸入引腳可讀取來自外部器件的模擬電壓。
ESP8266上的ADC通道和芯片供電電壓複用,也就是說咱們能夠將其設置爲測量系統電壓或者外部電壓。
相關方法
analogRead(A0),用於讀取施加在模塊的ADC引腳上的外部電壓;
輸入電壓範圍
0 - 1.0V之間;
測量精度
因爲ADC具備10位分辨率,所以會給出0-1023的值範圍;
注意點
爲了支持外部電壓範圍(0-3.3v),NodeMcu作了一個電阻分壓器,如圖所示:
例程
編寫一個讀取NodeMcu的ADC引腳上的模擬電壓。咱們這裏使用電位器在ADC引腳上提供0-3.3V的可變電壓。以下圖鏈接線:
代碼以下:
/** * 功能描述:ESP8266 ADC 讀取外部電壓 * 在串口調試器查看效果 */ void setup() { Serial.begin(115200);//配置波特率 } void loop() { Serial.print("ADC Value: "); Serial.println(analogRead(A0));//輸出0-1023 對應 外部輸入電壓 0-1.0v //延時1s delay(1000); }
相關方法
ESP.getVcc(),讀取NodeMCU模塊的VCC電壓,單位是mV;
注意點
ADC引腳必須保持懸空;在讀取VCC電源電壓以前,應更改ADC模式以讀取系統電壓。
要ADC_MODE(mode)在#include行後面改變ADC模式。
模式是ADC_TOUT(對於外部電壓),ADC_VCC(對於系統電壓)。默認狀況下,它讀取外部電壓。
例程
編寫ESP8266讀取系統電壓,代碼以下:
/** * 功能描述:ESP8266 ADC 讀取系統電壓 * 在串口調試器查看效果 */ ADC_MODE(ADC_VCC);//設置ADC模式爲讀取系統電壓 void setup() { Serial.begin(115200); } void loop() { Serial.print("ESP8266當前系統電壓(mV): "); Serial.println(ESP.getVcc()); delay(1000); }
PWM(Pulse Width Modulation,脈寬調製),是在保持波的頻率不變的同時改變脈寬的技術。當咱們須要連續控制電壓變化,實現呼吸燈或者電機轉速的時候,就要用到PWM,以下圖。
首先,咱們來理解一下佔空比。一個脈衝週期由一個ON週期(VCCC)和一個OFF週期(GND)組成。一段時間內ON週期佔據脈衝週期的比例就叫作佔空比。
DutyCycle(percentage)=Ton/TotalPeriodX100
例如,一個10ms的脈衝保持ON 2ms,那麼根據公式,佔空比是20%。
注意點
脈衝頻率通常都是固定的,跟佔空比沒有關係。
NodeMcu PWM引腳
以下圖,標註PWM引腳。
基本上數字IO均可以做爲PWM複用引腳,除了D0。不過須要注意的是,D3儘可能不用,它內部鏈接ESP8266 GPIO0。
NodeMcu PWM有關Arduino函數
1.analogWrite()
該功能用於在指定的引腳上啓用軟件PWM。
函數: analogWrite(pin,val)
參數:
pin:要啓用軟件PWM的GPIO引腳。
val:數值,通常在0到PWMRANGE範圍,默認PWMRANGE是1023。
返回值: 無;
注意點:
analogWrite(pin, 0)用於禁用指定引腳上的PWM。
2.analogWriteRange()
該功能用於改變PWMRANGE數值。
函數: analogWriteRange(new_range)
參數:
new_range:新的PWMRANGE數值。
返回值: 無;
注意點:
能夠理解爲PWM精度範圍。一樣的PWM頻率下,默認佔空數值0-123。若是你改變PWMRANGE爲2047,那麼佔空數值就變成0-2047。精度高了一倍。
3.analogWriteFreq()
該功能用於改變PWM頻率。
函數: analogWriteFreq(new_frequency)
參數:
new_frequency:新PWM頻率,默認是1kHZ。
返回值: 無;
注意點:
百度上不少資料都說PWM頻率範圍爲1-1KHz。可是經過查看源碼,以下:
static uint16_t analogFreq = 1000; extern void __analogWriteFreq(uint32_t freq) { if (freq < 100) { analogFreq = 100; } else if (freq > 40000) { analogFreq = 40000; } else { analogFreq = freq; } }
能夠看出,Arduino For ESP8266的PWM頻率範圍應該是100Hz-40KHz。
呼吸燈,LED燈明暗連續變化。代碼以下:
/** * 功能描述:ESP8266 PWM演示例程 * @author 單片機菜鳥 * @date 2018/10/25 */ #define PIN_LED D6 void setup() { // 這裏開始寫初始化代碼,只會執行一次 pinMode(PIN_LED,OUTPUT); analogWrite(PIN_LED,0); } void loop() { //這裏寫運行代碼,重複執行 for(int val=0;val<1024;val++){ //佔空比不斷增大 亮度漸亮 analogWrite(PIN_LED,val); delay(2); } for(int val=1023;val>=0;val--){ //佔空比不斷變小 亮度漸暗 analogWrite(PIN_LED,1023); delay(2); } }
ESP8266的串口通訊與傳統的Arduino設備徹底同樣。除了硬件FIFO(128字節用於TX和RX)以外,硬件串口還有額外的256字節的TX和RX緩存。發送和接收全都由中斷驅動。當FIFO/緩存滿時,write函數會阻塞工程代碼的執行,等待空閒空間。當FIFO/緩存空時,read函數也會阻塞工程代碼的執行,等待串口數據進來。
NodeMcu上有兩組串口,Serial和Serial1。
Serial使用UART0,默認對應引腳是GPIO1(TX)和GPIO3(RX)。在Serial.begin執行以後,調用Serial.swap()能夠將Serial從新映射到GPIO15(TX)和GPIO13(RX)。再次調用Serial.swap()將Serial從新映射回GPIO1和GPIO3。不過,通常狀況下,默認就好。
串口映射例程
/** * 功能描述:ESP8266 Serial映射例程 * @author 單片機菜鳥 * @date 2018/10/25 */ void setup() { // 這裏開始寫初始化代碼,只會執行一次 Serial.begin(115200); Serial.println("GPIO1(TX),GPIO3(RX)"); //調用映射方法 Serial.swap(); Serial.println("GPIO15(TX),GPIO13(RX)"); //從新映射回來 Serial.swap(); Serial.println("GPIO1(TX),GPIO3(RX)"); } void loop() { //這裏寫運行代碼,重複執行 }
Serial1使用UART1,默認對應引腳是GPIO2(TX)。Serial1不能用於接收數據,由於它的RX引腳被用於flash芯片鏈接。要使用Serial1,請調用Serial.begin(baudrate)。代碼以下:
/** * 功能描述:ESP8266 串口例程 * @author 單片機菜鳥 * @date 2018/10/25 */ void setup() { // 這裏開始寫初始化代碼,只會執行一次 Serial.begin(115200); Serial.println("Hello Serial"); Serial1.begin(115200); Serial1.println("Hello Serial1"); } void loop() { //這裏寫運行代碼,重複執行 }
若是不使用Serial1而且不映射串口,能夠將UART0的TX映射到GPIO2,具體操做是:在Serial.begin()以後調用Serial.set_tx(2)或者直接調用Serial.begin(baud,config,mode,2)。
默認狀況下,當調用Serial.begin後,將禁用WiFi庫的診斷輸出。要想再次啓動調試輸出,請調用Serial.setDebugOutput(true)。要將調試輸出映射到Serial1時,須要調用Serial1.setDebugOutput(true)。
調用Serial.setRxBufferSize(size_t size)容許定義接收緩衝區的大小,默認值是256(緩衝區也是使用內存,意味着不能一味地去增大這個值)。
Serial和Serial1對象都支持5,6,7,8個數據位,奇數(O)、偶數(E)和無(N)奇偶校驗,以及1或者2箇中止位。要設置所需的模式,請調用Serial.begin(baudrate, SERIAL_8N1), Serial.begin(baudrate, SERIAL_6E2)等。
Serial和Serial1都實現了一種新方法用來獲取當前的波特率設置。要獲取當前的波特率,請調用Serial.baudRate(),Serial1.baudRate()。代碼以下:
/** * 功能描述:ESP8266 串口波特率例程 * @author 單片機菜鳥 * @date 2018/10/25 */ void setup() { // 這裏開始寫初始化代碼,只會執行一次 // 設置當前波特率爲57600 Serial.begin(57600); // 獲取當前波特率 int br = Serial.baudRate(); // 將打印 "Serial is 57600 bps" Serial.printf("Serial is %d bps", br); } void loop() { //這裏寫運行代碼,重複執行 }
Serial和Serial1都屬於硬件串口(HardwareSerial)的實例,若是讀者須要使用ESP8266 軟件串口的功能,請參考如下庫:https://github.com/plerup/espsoftwareserial。
爲了檢測進入Serial的未知波特率的數據,能夠調用Serial.detectBaudrate(time_t timeoutMillis)。這個方法嘗試在timeoutMillis ms的時間內檢測波特率,檢測成功返回波特率,檢測失敗返回0。detectBaudrate()方法在Serial.begin()被調用以前調用(由於它不須要用到接收緩衝區或者串口配置),而且它不能檢測數據位位數或者中止位。這個檢測過程不會去改變數據的波特率,因此能夠在檢測成功以後,調用Serial.begin(detectedBaudrate)。
串口用處
通常來講,串口通訊用在兩個方面:
1.與外圍串口設備傳輸數據,好比藍牙模塊、Arduino等等;
2.開發過程當中用來調試代碼,經過串口輸出Debug信息瞭解程序運行信息。例程以下:
/** * Demo1: * statin模式下,建立一個鏈接到可接入點(wifi熱點),而且打印IP地址 * @author 單片機菜鳥 * @date 2019/09/02 */ #include <ESP8266WiFi.h> #define AP_SSID "xxxxx" //這裏改爲你的wifi名字 #define AP_PSW "xxxxx"//這裏改爲你的wifi密碼 //如下三個定義爲調試定義 #define DebugBegin(baud_rate) Serial.begin(baud_rate) #define DebugPrintln(message) Serial.println(message) #define DebugPrint(message) Serial.print(message) void setup(){ //設置串口波特率,以便打印信息 DebugBegin(115200); //延時2s 爲了演示效果 delay(2000); DebugPrintln("Setup start"); //啓動STA模式,並鏈接到wifi網絡 WiFi.begin(AP_SSID, AP_PSW); DebugPrint(String("Connecting to ")+AP_SSID); //判斷網絡狀態是否鏈接上,沒鏈接上就延時500ms,而且打出一個點,模擬鏈接過程 //筆者擴展:加入網絡一直都連不上 是否能夠作個判斷,由大家本身實現 while (WiFi.status() != WL_CONNECTED){ delay(500); DebugPrint("."); } DebugPrintln(""); DebugPrint("Connected, IP address: "); //輸出station IP地址,這裏的IP地址由DHCP分配 DebugPrintln(WiFi.localIP()); DebugPrintln("Setup End"); } void loop() { }
整體上講,本章基礎內容比較多,筆者介紹ESP8266在Arduino平臺上的一些基礎知識點,包括程序結構、NodeMcu端口映射、ESP8266 數字IO、PWM、ADC、串口通訊等等。 本章目的很簡單,就是爲了告訴讀者,ESP8266到底給咱們提供了什麼可利用硬件資源,以方便咱們項目開發。