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