從今天開始,我們一點(diǎn)點(diǎn)的學(xué)習(xí)ESP12系列的使用。從基礎(chǔ)開始,到提高,到網(wǎng)絡(luò)應(yīng)用,到實(shí)例。過程可能有些枯燥,但是耐下性子學(xué),肯定會(huì)有收獲。而且有了arduino的基礎(chǔ),學(xué)習(xí)這些都不難。限于篇幅,我們只講與arduino不同的地方。 今天我們先來(lái)學(xué)習(xí)ESP12系列的基礎(chǔ)功能和應(yīng)用。 中斷功能 基于ESP8266的NodeMcu的數(shù)字IO的中斷功能是通過attachInterrupt,detachInterrupt函數(shù)所支持的。除了D0/GPIO16,中斷可以綁定到任意GPIO的引腳上。所支持的標(biāo)準(zhǔn)中斷類型有:CHANGE(改變沿,電平從低到高或者從高到低)、RISING(上升沿,電平從低到高)、FALLING(下降沿,電平從高到低)。 1.attachInterrupt() 該功能用于在將指定引腳設(shè)置為響應(yīng)中斷。 函數(shù): attachInterrupt(pin, function, mode); 參數(shù): pin:要設(shè)置中斷的端口編號(hào),注意,這里不是引腳編號(hào)。 function:中斷發(fā)生時(shí)運(yùn)行的函數(shù), 這個(gè)函數(shù)不帶任何參數(shù),不返回任何內(nèi)容。 Interrupt type/mode:它定義中斷被觸發(fā)的條件方式。 CHANGE:改變沿,引腳電平從低變?yōu)楦呋蛘邚母咦優(yōu)榈蜁r(shí)觸發(fā)中斷。 RISING:上升沿,引腳電平從低變?yōu)楦邥r(shí)觸發(fā)中斷。 FALLING:下降沿,引腳電平從高變?yōu)榈蜁r(shí)觸發(fā)中斷。 返回值: 無(wú); 2.detachInterrupt() 該功能用于禁用指定GPIO引腳上的中斷。 函數(shù): detachInterrupt(pin) 參數(shù): pin:要禁用的中斷的GPIO引腳。 返回值: 無(wú); 3.digitalPinToInterrupt() 該功能用于獲取指定GPIO引腳的中斷號(hào)。 函數(shù): digitalPinToInterrupt(pin) 參數(shù): pin:要獲取中斷號(hào)的GPIO引腳。 void setup() { Serial.begin(115200);//設(shè)置串口波特率 attachInterrupt(digitalPinToInterrupt(D2), InterruptFunc, RISING);//設(shè)置中斷號(hào)、響應(yīng)函數(shù)、觸發(fā)方式 } void loop() { } /** * 中斷響應(yīng)函數(shù) */ void InterruptFunc(){ Serial.println('Hello ESP8266'); } 模擬輸入(ADC) 1.測(cè)量外部電壓:analogRead(A0),用于讀取施加在模塊的ADC引腳上的外部電壓; 輸入電壓范圍:0 - 1.0V之間; 測(cè)量精度:由于ADC具有10位分辨率,因此會(huì)給出0-1023的值范圍; 注意點(diǎn): 為了支持外部電壓范圍(0-3.3v),NodeMcu做了一個(gè)電阻分壓器,如圖所示: 編寫一個(gè)讀取NodeMcu的ADC引腳上的模擬電壓。我們這里使用電位器在ADC引腳上提供0-3.3V的可變電壓。如下圖連接線: void setup() { Serial.begin(115200);//配置波特率}void loop() { Serial.print('ADC Value: '); Serial.println(analogRead(A0));//輸出0-1023 對(duì)應(yīng) 外部輸入電壓 0-1.0v //延時(shí)1s delay(1000);} 2 測(cè)量系統(tǒng)電壓 ESP.getVcc(),讀取NodeMCU模塊的VCC電壓,單位是mV; 注意點(diǎn) ADC引腳必須保持懸空;在讀取VCC電源電壓之前,應(yīng)更改ADC模式以讀取系統(tǒng)電壓。 在#include行后面使用ADC_MODE(mode) 模式是ADC_TOUT(對(duì)于外部電壓),ADC_VCC(對(duì)于系統(tǒng)電壓)。默認(rèn)情況下,它讀取外部電壓。 例程 編寫ESP8266讀取系統(tǒng)電壓,代碼如下: ADC_MODE(ADC_VCC);//設(shè)置ADC模式為讀取系統(tǒng)電壓void setup() { Serial.begin(115200);}void loop() { Serial.print('ESP8266當(dāng)前系統(tǒng)電壓(mV): '); Serial.println(ESP.getVcc()); delay(1000);} 模擬輸出(PWM) NodeMcu PWM引腳:基本上數(shù)字IO都可以作為PWM復(fù)用引腳,除了D0。不過需要注意的是,D3盡量不用,它內(nèi)部連接ESP8266 GPIO0。 NodeMcu PWM有關(guān)Arduino函數(shù) 1.analogWrite()不解釋 2.analogWriteRange() 該功能用于改變PWMRANGE數(shù)值??梢岳斫鉃镻WM精度范圍。同樣的PWM頻率下,默認(rèn)占空數(shù)值0-123。如果你改變PWMRANGE為2047,那么占空數(shù)值就變成0-2047。精度高了一倍。 函數(shù): analogWriteRange(new_range) analogWriteFreq()該功能用于改變PWM頻率。默認(rèn)是1kHZ??煽豍WM頻率范圍應(yīng)該是100Hz-40KHz。 函數(shù): analogWriteFreq(new_frequency) 串口通信(Serial) NodeMcu上有兩組串口,Serial和Serial1。Serial使用UART0,默認(rèn)對(duì)應(yīng)引腳是GPIO1(TX)和GPIO3(RX)。在Serial.begin執(zhí)行之后,調(diào)用Serial.swap()可以將Serial重新映射到GPIO15(TX)和GPIO13(RX)。再次調(diào)用Serial.swap()將Serial重新映射回GPIO1和GPIO3。不過,一般情況下,默認(rèn)就好。 void setup() { // 這里開始寫初始化代碼,只會(huì)執(zhí)行一次 Serial.begin(115200); Serial.println('GPIO1(TX),GPIO3(RX)'); //調(diào)用映射方法 Serial.swap(); Serial.println('GPIO15(TX),GPIO13(RX)'); //重新映射回來(lái) Serial.swap(); Serial.println('GPIO1(TX),GPIO3(RX)');}void loop() { //這里寫運(yùn)行代碼,重復(fù)執(zhí)行} Serial1使用UART1,默認(rèn)對(duì)應(yīng)引腳是GPIO2(TX)。Serial1不能用于接收數(shù)據(jù),因?yàn)樗腞X引腳被用于flash芯片連接。要使用Serial1,請(qǐng)調(diào)用Serial.begin(baudrate)。代碼如下: void setup() { // 這里開始寫初始化代碼,只會(huì)執(zhí)行一次 Serial.begin(115200); Serial.println('Hello Serial'); Serial1.begin(115200); Serial1.println('Hello Serial1');}void loop() { //這里寫運(yùn)行代碼,重復(fù)執(zhí)行} 如果不使用Serial1并且不映射串口,可以將UART0的TX映射到GPIO2,具體操作是:在Serial.begin()之后調(diào)用Serial.set_tx(2)或者直接調(diào)用Serial.begin(baud,config,mode,2)。 默認(rèn)情況下,當(dāng)調(diào)用Serial.begin后,將禁用WiFi庫(kù)的診斷輸出。要想再次啟動(dòng)調(diào)試輸出,請(qǐng)調(diào)用Serial.setDebugOutput(true)。要將調(diào)試輸出映射到Serial1時(shí),需要調(diào)用Serial1.setDebugOutput(true)。 調(diào)用Serial.setRxBufferSize(size_t size)允許定義接收緩沖區(qū)的大小,默認(rèn)值是256(緩沖區(qū)也是使用內(nèi)存,意味著不能一味地去增大這個(gè)值)。 Serial和Serial1對(duì)象都支持5,6,7,8個(gè)數(shù)據(jù)位,奇數(shù)(O)、偶數(shù)(E)和無(wú)(N)奇偶校驗(yàn),以及1或者2個(gè)停止位。要設(shè)置所需的模式,請(qǐng)調(diào)用Serial.begin(baudrate, SERIAL_8N1), Serial.begin(baudrate, SERIAL_6E2)等。 Serial和Serial1都實(shí)現(xiàn)了一種新方法用來(lái)獲取當(dāng)前的波特率設(shè)置。要獲取當(dāng)前的波特率,請(qǐng)調(diào)用Serial.baudRate(),Serial1.baudRate()。代碼如下: void setup() { // 這里開始寫初始化代碼,只會(huì)執(zhí)行一次 // 設(shè)置當(dāng)前波特率為57600 Serial.begin(57600); // 獲取當(dāng)前波特率 int br = Serial.baudRate(); // 將打印 'Serial is 57600 bps' Serial.printf('Serial is %d bps', br);}void loop() { //這里寫運(yùn)行代碼,重復(fù)執(zhí)行} Serial和Serial1都屬于硬件串口(HardwareSerial)的實(shí)例,如果讀者需要使用ESP8266 軟件串口的功能,請(qǐng)參考以下庫(kù):https://github.com/plerup/espsoftwareserial。 |
|