ESP8266入門指南-微控制器

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種:

GPIO15GPIO0GPIO2Mode
0V0V3.3VUart Bootloader
0V3.3V3.3VBoot sketch (SPI flash)
3.3VXXSDIO 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
1TX0在序列傳輸期間不可用
2啟動模式選擇
TX1
3.3V(僅啟動)啟動時不接地
啟動時發送微調數據
3RX0在序列傳輸期間不可用
4SDA(I²C)
5SCL(I²C)
6 – 11Flash connectionX不可用,也沒有損壞
12MISO(SPI)
13MOSI(SPI)
14SCK(SPI)
15SS(SPI)0V上拉電阻不可用
16睡眠喚醒功能沒有上拉電阻,而是下拉電阻
應連接到RST才能喚醒

ESP8266作為微控制器-軟體

ESP的大多數微控制器功能都使用與一般Arduino完全相同的語法,因此非常容易上手。

數位I / O

就像一般的Arduino一樣,可以設定引腳的功能pinMode(pin, mode);這裡pin是GPIO number*,mode可以是INPUT(預設),OUTPUTINPUT_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是數位引腳,以及value1或0(或HIGHLOW)。

要讀取輸入,請使用 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();放在forwhile循環中裏,這不會花比100ms更長的時間。

資料來源

如果您喜歡一些更高級的知識,例如EEPROM或深度睡眠等,則在GitHub頁面上有更多詳細信息。

發佈留言