Digital IO(數(shù)字輸入輸出接口)
Arduino中的管腳編號(hào)和ESP8266 GPIO管腳編號(hào)相對(duì)應(yīng)∽得校可以直接使用pinMode
,digitalRead
,digitalWrite
,例如讀GPIO2贪嫂,使用digitalRead(2)
蛆橡。
引腳 0-15 可以使用INPUT, OUTPUT, INPUT_PULLUP
邪意。 引腳 16 可以使用INPUT, OUTPUT, INPUT_PULLDOWN_16
。 啟動(dòng)時(shí)引腳被設(shè)置成INPUT
丽蝎。
引腳也可以用于其他功能猎拨,像 Serial, I2C, SPI。這些功能有對(duì)應(yīng)的庫(kù)屠阻。常見(jiàn)的ESP-12模塊引腳對(duì)應(yīng)關(guān)系如下圖红省。
引腳功能
圖中沒(méi)有顯示 6-11引腳,正常情況它們用來(lái)連接模塊上的閃存芯片国觉。把這些引腳作為IO引腳使用可能導(dǎo)致程序崩潰吧恃。
有些開(kāi)發(fā)板和模塊(ESP-12ED, NodeMCU 1.0)會(huì)把引腳9和11分離出來(lái)。如果flash芯片工作在DIO模式下(而不是默認(rèn)的QIO模式)麻诀,就可以作為IO使用痕寓。
可以通過(guò)attachInterrupt
,detachInterrupt
提供引腳中斷功能。除GPIO16外蝇闭,中斷可以附加到任何GPIO引腳上呻率。支持標(biāo)準(zhǔn)Arduino中斷類(lèi)型:CHANGE
, RISING
, FALLING
。
Analog input(模擬輸入)
ESP8266提供一個(gè)ADC通道丁眼。它既可用于讀取ADC引腳的電壓筷凤,也可用于讀取模塊供電電壓(VCC)。
若要讀取附加在ADC上的外部電壓,可以使用analogRead(A0)
藐守。ESP8266輸入電壓范圍是0-1.0V挪丢,有些開(kāi)發(fā)板可能會(huì)使用分壓。安全起見(jiàn)最好<1.0V卢厂。例如0.5V在512附近取值乾蓬,則最大電壓為1.0V,但是在150附近取值,則最大電壓是3.3V慎恒, 3.3V可能會(huì)損壞ESP8266任内。
使用ESP.getVcc()
讀取VCC電壓,ADC引腳必須斷開(kāi)并在程序中添加如下代碼:
ADC_MODE(ADC_VCC);
這行必須在所有函數(shù)體外融柬,比如放在#include
行后面死嗦。
Analog output(模擬輸出)
analogWrite(pin, value)
在指定的引腳上啟用PWM功能。PWM可以在0-16引腳上使用粒氧。使用analogWrite(pin, 0)
來(lái)禁用引腳的PWM功能越除。value
取值范圍在0 - PWMRANGE
,默認(rèn)是1023,PWM取值范圍可以使用analogWriteRange(new_range)
來(lái)設(shè)定外盯。
PWM默認(rèn)頻率為1kHz摘盆。可以用analogWriteFreq(new_frequency)
來(lái)改變頻率饱苟。
Timing and delays(定時(shí)和延遲)
millis()
和 micros()
分別返回重置后經(jīng)過(guò)的毫秒數(shù)和微妙數(shù)孩擂。
delay(ms)
程序暫停(毫秒)并允許運(yùn)行WiFi和TCP/IP任務(wù)。delayMicroseconds(us)
程序暫停(微妙)箱熬。
當(dāng)連接WiFi時(shí),除了主程序外還需要在芯片上運(yùn)行很多代碼类垦。每次loop()
函數(shù)完成或者調(diào)用延時(shí)函數(shù),WiFi 和 TCP/IP庫(kù)都有機(jī)會(huì)處理掛起的任務(wù)坦弟。如果你的程序某處有一個(gè)循環(huán)需要花費(fèi)很多時(shí)間(>50ms)而沒(méi)有調(diào)用延時(shí)函數(shù)护锤,你可以考慮添加一個(gè)延時(shí)函數(shù)調(diào)用來(lái)保存WiFi堆棧穩(wěn)定運(yùn)行。
還有一個(gè)yield()
函數(shù)酿傍,它相當(dāng)于delay(0)
烙懦。另一個(gè)要注意的是delayMicroseconds函數(shù)排斥其他任務(wù),因此不推薦使用延遲超過(guò)20ms赤炒。
Serial(串行)
Serial
對(duì)象的工作方式與常規(guī)Arduino的工作方式大致相同氯析。 除硬件FIFO(TX和RX為128字節(jié))外,Serial
還有256字節(jié)的TX和RX緩沖區(qū)莺褒。 發(fā)送和接收都是中斷驅(qū)動(dòng)的掩缓。 當(dāng)相應(yīng)的FIFO緩沖區(qū)滿(mǎn)/空時(shí),寫(xiě)和讀功能僅打斷主程序的運(yùn)行遵岩。 請(qǐng)注意你辣,可以自定義額外的256位緩沖區(qū)的長(zhǎng)度巡通。
Serial
使用UART0,映射到引腳GPIO1(TX)和GPIO3(RX)舍哄。 通過(guò)在Serial.begin
之后調(diào)用Serial.swap()
宴凉,可以將串行重新映射到GPIO15(TX)和GPIO13(RX)。 再次調(diào)用Serial.swap()
將UART0映射回GPIO1和GPIO3表悬。
Serial1
使用UART1,TX引腳是GPIO2.UART1不能用于接收數(shù)據(jù)弥锄,因?yàn)橥ǔK挥脕?lái)連接閃存芯片。要使用Serial1
可以調(diào)用Serial1.begin(baudrate)
蟆沫。
如果未使用Serial1
且未交換Serial
籽暇,則可以通過(guò)在Serial.begin
之后調(diào)用Serial.set_tx(2)
或直接使用Serial.begin(baud,config饭庞,mode戒悠,2)
將UART0的TX映射到GPIO2。
默認(rèn)情況下舟山,調(diào)用Serial.begin
時(shí)救崔,將禁用WiFi庫(kù)的診斷輸出。 要再次啟用調(diào)試輸出捏顺,請(qǐng)調(diào)用 Serial.setDebugOutput(true)
。 要將調(diào)試輸出重定向到Serial1
纬黎,請(qǐng)調(diào)用Serial1.setDebugOutput(true)
幅骄。
你也需要使用Serial.setDebugOutput(true)
來(lái)啟用printf()
函數(shù)的輸出功能。
Serial.setRxBufferSize(size_t size)
方法允許定義接收緩沖區(qū)深度本今。 默認(rèn)值為256拆座。
Serial
和Serial1
對(duì)象都支持5,6,7,8位數(shù)據(jù),奇(O),偶(E),無(wú)奇偶(N)校驗(yàn),以及1或2個(gè)停止位冠息。 要設(shè)置所需模式挪凑,請(qǐng)調(diào)用Serial.baudRate()
,Serial1.baudRate()
.返回一個(gè)表示當(dāng)前波特率的int
值。例如
Serial.begin(57600); //將波特率設(shè)置為57600
int br = Serial.baudRate(); //獲取當(dāng)前波特率
Serial.printf("串口速率是 %d bps", br); //輸出 "串口速率是 57600 bps"
Serial
和Serial1
對(duì)象都是HardwareSerial
類(lèi)的實(shí)例逛艰。
原作者做過(guò)ESP8266官方的Software Serial庫(kù)躏碳,具體請(qǐng)查看pull request.
請(qǐng)注意,此實(shí)現(xiàn)僅適用于基于ESP8266的模塊散怖,不適用于其他Arduino模塊菇绵。
要檢測(cè)串行口上未知波特率數(shù)據(jù),請(qǐng)使用Serial.detectBaudrate(time_t timeoutMillis)
镇眷。 此方法嘗試檢測(cè)波特率最大超時(shí)毫秒數(shù)咬最。 如果未檢測(cè)到波特率,則返回零欠动,否則返回檢測(cè)到的波特率永乌。 可以在調(diào)用Serial.begin()
之前調(diào)用detectBaudrate()
函數(shù),因?yàn)樗恍枰邮站彌_區(qū)和串行配置參數(shù)。
UART無(wú)法檢測(cè)其他參數(shù)翅雏,如啟動(dòng)或停止位數(shù)圈驼,數(shù)據(jù)位數(shù)或奇偶校驗(yàn)。
檢測(cè)本身不會(huì)改變波特率枚荣,檢測(cè)后應(yīng)使用Serial.begin(detectedBaudrate)
設(shè)置碗脊。
檢測(cè)速度非常快橄妆,只需幾個(gè)輸入字節(jié)衙伶。
SerialDetectBaudrate.ino是一個(gè)完整的用法示例。
Progmem(程序)
程序存儲(chǔ)器功能與常規(guī)Arduino的工作方式大致相同; 將只讀數(shù)據(jù)和字符串放在只讀存儲(chǔ)器中并為應(yīng)用程序釋放堆棧害碾。 重要的區(qū)別在于矢劲,在ESP8266上,文字字符串不是合并的慌随。 這意味著在F(“”)
和/或PSTR(“”)
內(nèi)定義的相同文字字符串將占用代碼中每個(gè)實(shí)例的空間芬沉。 因此,你需要自己管理重復(fù)的字符串阁猜。
有一個(gè)輔助宏FPSTR()
可以很方便的將const PROGMEM
字符串傳遞給__FlashStringHelper
丸逸。
String response1;
response1 += F("http:");
...
String response2;
response2 += F("http:");
使用FPSTR...
const char HTTP[] PROGMEM = "http:";
...
{
String response1;
response1 += FPSTR(HTTP);
...
String response2;
response2 += FPSTR(HTTP);
}