文章目錄標題
ESP8266作為微控制器-硬體
ESP8266本身是一個功能非常強大的微控制器。在本章中,我們先介紹ESP8266的非Wi-Fi特定功能。
數位I / O
與一般的Arduino一樣,ESP8266具有數位輸入/輸出引腳(I / O或GPIO,通用輸入/輸出引腳)。顧名思義,它們可用作數位輸入以讀取數位電壓,也可用作數位輸出以輸出0V(sink current)或3.3V(source current)。
電壓和電流限制
ESP8266是3.3V微控制器,因此其I / O也以3.3V工作。引腳不能承受5V的電壓,在任何引腳上施加超過3.6V的電壓都會殺死晶片。
單個GPIO引腳可吸收的最大電流為12mA。
可用的針腳
ESP8266有17個GPIO引腳(0-16),但是您只能使用11個GPIO引腳,因為6個引腳(GPIO 6-11)用於連接快閃記憶體晶片。這是ESP8266旁邊的8腳小晶片。如果嘗試使用這些引腳之一,則可能會使程序崩潰。
GPIO 1和GPIO 3用作硬體序列埠口(UART)的TX和RX,因此在大多數情況下,發送/接收序列數據時,不能將它們用作常規I / O。
開機模式
某些I / O引腳在引導期間具有特殊功能:它們在3種引導模式中選擇1種:
GPIO15 | GPIO0 | GPIO2 | Mode |
---|---|---|---|
0V | 0V | 3.3V | Uart Bootloader |
0V | 3.3V | 3.3V | Boot sketch (SPI flash) |
3.3V | X | X | SDIO mode (not used for Arduino) |
注意:您不必在GPIO2上增加一個外部上拉電阻,內部的上拉電阻在啟動時會啟用。
內部上拉/下拉電阻
GPIO 0-15都內建有上拉電阻,就像在Arduino中一樣。GPIO16內置下拉電阻。
PWM
與大多數Atmel晶片(Arduino)不同,ESP8266不支持硬體PWM,但是所有數字引腳均支持軟體PWM。預設PWM範圍是10-bits @ 1kHz,但可以更改(最大> 14-bit @ 1kHz)。
類比輸入
ESP8266有一個類比輸入,輸入範圍為0-1.0V。例如,如果提供3.3V,將損壞晶片。有些板(例如NodeMCU、WeMos D1 mini)具有板載電阻分壓器,以獲得更容易的0-3.3V範圍。您也可以使用微調電位計作為分壓器。
ADC(類比-數位轉換器)的分辨率為10 bits。
通訊
序列埠
ESP8266有兩個硬體
UART (Serial ports):引腳1和3上的UART0(分別為TX0和RX0)以及引腳2和8上的UART1(分別為TX1和RX1),但是,GPIO8用於連接快閃記憶體晶片。這意味著UART1只能發送數據。
UART0在引腳15和13(分別為RTS0和CTS0)上具有硬體分流控制。這兩個引腳可用作備用TX0和RX0引腳。
I²C
ESP沒有硬體TWI(兩線接口),但可以軟體實現。意思是您幾乎可以使用任何兩個數位引腳。預設情況下,I²C library將引腳4用作SDA,將引腳5用作SCL。(數據手冊將GPIO2指定為SDA,將GPIO14指定為SCL。)最大速度約為450kHz。
SPI
ESP8266有一個可供使用者的SPI連接,稱為HSPI。它使用GPIO14作為CLK,使用12作為MISO,使用13作為MOSI,使用15作為Slave Select(SS)。它可以在從(Slave)模式和主(Master)模式下使用(用軟體)。
GPIO概述
GPIO | 功能 | 狀態 | 限制條件 |
---|---|---|---|
0 | 啟動模式選擇 | 3.3伏 | 沒有Hi-Z |
1 | TX0 | – | 在序列傳輸期間不可用 |
2 | 啟動模式選擇 TX1 | 3.3V(僅啟動) | 啟動時不接地 啟動時發送微調數據 |
3 | RX0 | – | 在序列傳輸期間不可用 |
4 | SDA(I²C) | – | – |
5 | SCL(I²C) | – | – |
6 – 11 | Flash connection | X | 不可用,也沒有損壞 |
12 | MISO(SPI) | – | – |
13 | MOSI(SPI) | – | – |
14 | SCK(SPI) | – | – |
15 | SS(SPI) | 0V | 上拉電阻不可用 |
16 | 睡眠喚醒功能 | – | 沒有上拉電阻,而是下拉電阻 應連接到RST才能喚醒 |
ESP8266作為微控制器-軟體
ESP的大多數微控制器功能都使用與一般Arduino完全相同的語法,因此非常容易上手。
數位I / O
就像一般的Arduino一樣,可以設定引腳的功能pinMode(pin, mode);
這裡pin
是GPIO number*,mode
可以是INPUT
(預設),OUTPUT
或INPUT_PULLUP
啟用GPIO 0-15內建的上拉電阻。要啟用GPIO16的下拉電阻,必須使用INPUT_PULLDOWN_16
。
(*)NodeMCU、WeMos D1 mini使用不同的引腳對應。要設定NodeMCU、WeMos D1 mini引腳(例如pin 5),請使用D5:例如:pinMode(D5, OUTPUT);
要將輸出引腳設定為高電位(3.3V、5V)或低電平(0V),請使用digitalWrite(pin, value);
這裏 pin
是數位引腳,以及value
1或0(或HIGH
和LOW
)。
要讀取輸入,請使用 digitalRead(pin);
要在某個引腳上啟用PWM,請使用analogWrite(pin, value);
這裏pin
是數位引腳,value
是0到1023之間的數字。
您可以使用命令更改PWM輸出的範圍 analogWriteRange(new_range);
更改頻率可用analogWriteFreq(new_frequency);
,new_frequency
在100到1000Hz之間。
類比輸入
就像在Arduino上一樣,您可以analogRead(A0)
用來得到類比輸入上的類比電壓。(0 = 0V,1023 = 5.0V)。
ESP還可以使用ADC來測量電源電壓(V CC)。為此ADC_MODE(ADC_VCC);
,請將其設定在程式碼的頂部,並用於ESP.getVcc();
實際獲得電壓。
如果使用它讀取電源電壓,則無法將其他任何東西連接到類比引腳。
通訊
序列通訊
要使用UART0(TX = GPIO1,RX = GPIO3),你可以使用Serial
對象,就像在一個Arduino: Serial.begin(baud)
。
要使用備用引腳(TX = GPIO15,RX = GPIO13),設定Serial.swap()
在Serial.begin
之後使用。
要使用UART1(TX = GPIO2),請使用Serial1
物件。
read, write, print, println, ...
支持所有Arduino Stream功能。
I²C和SPI
您可以像通常那樣使用預設的Arduino library語法。
與RF部分共享CPU時間
為ESP8266編寫程序時要記住的一件事是,您的程式碼必須與Wi-Fi和TCP堆疊(在後台執行處理所有Wi-Fi和IP連接的軟體)共享資源(CPU時間和記憶體)。
如果您的代碼執行時間太長,並且不讓TCP堆疊執行其操作,則可能會崩潰,或者可能會丟失數據。最好將loop執行時間保持在幾百毫秒以下。
每次重複主循環時,您的程式最好有分配時間給Wi-Fi和TCP,以處理Wi-Fi和TCP的請求。
如果您的循環花費的時間超過此時間,則必須使用包含delay(0);
或將CPU時間分配給Wi-Fi / TCP堆疊yield();
。否則,網絡通信將無法正常工作,並且如果通信時間超過3秒,則WDT(看門狗定時器)將重置ESP。如果禁用了WDT,則在8秒多一點之後,硬體WDT將reset晶片。
從微控制器的角度來看,3秒是很長的時間(2.4億個時鐘週期),因此,除非您進行非常繁瑣的數字運算或通過Serial發送非常長的字符串,否則您將不會受到影響。請記住,您要將yield();
放在for
或while
循環中裏,這不會花比100ms更長的時間。
資料來源
如果您喜歡一些更高級的知識,例如EEPROM或深度睡眠等,則在GitHub頁面上有更多詳細信息。