ESP8266-01是最小的ESP8266模塊,只有8個管腳。在這些VCC中,GND,RST(復位)和CH_PD(片選)不是I/O引腳,但需要模塊操作。這樣就可以將GPIO0,GPIO2,TX和RX用作可能的I/O引腳,但即使這些引腳都具有預先分配的功能。 GPIO0和GPIO2確定模塊以哪種模式啟動,并且TX/RX引腳用于對模塊進行編程以及用于串行I/O(通常用于調試)。 GPIO0和GPIO2需要連接上拉電阻,以確保模塊正確啟動。
步驟2:ESP8266編程技巧(espcomm失敗)
使用Arduino IDE編程ESP8266時(請參閱ESP8266-01 Wifi Shield),有時(通常)會在Arduino IDE中收到錯誤消息,例如:-
esp_com打開失敗
錯誤:失敗打開COM33錯誤:espcomm_open失敗
錯誤:espcomm_upload_mem失敗
在這種情況下,請按照以下步驟操作:-
檢查是否已在Arduino工具菜單中選擇了ESP8266板
檢查是否已在Arduino工具菜單中選擇了COM端口
將GPIO0接地的ESP8266重新通電(干凈)電源應用程序,請參閱下文)
如果3)不能解決問題,請從計算機上拔下USB電纜,等待幾秒鐘,然后再將其重新插入
如果4)不能解決問題,從PC上拔掉USB電纜,關閉Arduino IDE,打開Arduino IDE,重新插入USB電纜。
在給ESP8266供電時,將GPIO0接地后,請確保干凈地供電。不要搖晃連接。 ESP8266 led應該亮起并保持不閃爍。
步驟3:最佳技巧–使用I2C
使ESP8266-01額外輸入的最好技巧是使用I2C接口。
一種選擇是使用GPIO0和GPIO2作為I2C總線。
使模塊正確啟動所需的上拉電阻可以加倍,因為I2C總線上拉電阻和總線上的其他從器件均是集電極開路,因此不應下拉總線通電時。但是,在某些情況下,從站(尤其是具有備用電池的從站)可能會卡住并壓低總線。在這種情況下,您需要隔離總線,直到ESP8266進入引導階段為止。
通過為I2C總線使用TX和RX可以避免此問題
注意:
GPIO1(TX)用作數據線,因為在加電時,您總是會在GPIO1上獲得一些調試輸出。沒有辦法抑制此輸出,但時鐘線(RX)會保持高電平,因此這些數據都不會被時鐘傳給從機
在對ESP8266進行編程時,RX線會連接到ESP8266。程序員的輸出。編程結束時,ESP8266會重新啟動,并且330保護電阻可防止RX短路編程器的輸出驅動器。
I2C串聯電阻可為TX,RX提供防止I2C總線短路的保護
ESP8266是3.3V器件,因此最好使用3.3V I2C從器件。如今,許多(但不是全部)I2C器件均為3.3V。 “通常,在一個設備的電壓高于另一個設備的電壓的系統中,有可能通過I2C連接兩個設備,而它們之間沒有任何電平轉換電路。技巧是將上拉電阻器連接到兩個電壓中的較低者。”(SparkFun I2C教程)對于5V和3.3V器件的混合,將上拉電阻器連接到3.3V線,如上所示。
使用I2C是向ESP8266-01添加多通道A-to-D轉換器的好方法,該轉換器不會暴露底層模塊的單個ADC輸入。例如,使用Adafruit 12位I2C 4通道ADC或模擬輸出SparkFun的I2C DAC Breakout – MCP4725板。 I2C總線還提供許多其他類型的傳感器。
有關克服I2C問題的更多信息,請參見http://www.i2c-bus.org/i2c-primer/common-problems.。.。另請參閱I2C電池后備RTC可靠啟動的簡短方法,以幫助清除總線
第4步:將GPIO0/GPIO2用于OUTPUT,將RX用于INPUT
雖然可以通過WiFi連接發送調試消息,但是使用TX連接通常很方便。下一個示例顯示如何將GPIO0和GPIO2用作輸出,將RX用作輸入。
使用
Serial.begin(115200,SERIAL_8N1,SERIAL_TX_ONLY);
允許您將RX用作通用輸入(或其他輸出),同時仍將調試消息寫入串行。 RX引線中的330歐姆電阻再次連接到Flash編程器,可以防止編程器的驅動器短路。注意:必須先打開S1才能對ESP8266進行編程。
可以從草圖訪問TX引腳,因為GPIO1和RX為GPIO3
使用GPIO0作為輸出時如何重新編程
注意:需要將GPIO0接地才能進入編程模式。如果您將其拉高,則將其接地可能會損壞ESP8266芯片。當代碼驅動GPIO0輸出時,對ESP8266進行重新編程的安全方法是:-
a)關閉開發板電源 b)短GPIO0到gnd c)打開開發板電源,使其進入編程模式由于GPIO0短路
d)消除了GPIO0的短路,因此在程序運行時您不會短路輸出
e)重新編程開發板 f)必要時重啟開發板。
步驟5:另一個技巧-使用GPIO0/GPIO2驅動繼電器并讀取按鈕
這里是另一種配置方式別針。注意:僅當您的繼電器模塊具有隔離的輸入(N1和N1-com)時,此技巧才有效。由于此限制和支持代碼的復雜性,上一個示例以RX作為輸入為佳。
使用ESP8266 GPIO0/GPIO2/GPIO15引腳已經介紹了如何一起使用GPIO0/GPIO2獲得額外的輸入。在這里,該示例將擴展為使用GPIO0作為繼電器驅動器輸出,并使用GPIO0/GPIO2作為輸入。
此處是pdf格式的原理圖。
此處GPIO0被用作輸出以驅動繼電器,GPIO0/GPIO2用作輸入來讀取瞬時按鈕,該按鈕除了可以通過WiFi連接進行遠程控制之外,還可以用作手動操作來打開和關閉繼電器。如果在通電時按下瞬時按鈕,則也可用于啟用配置模式。
這里的訣竅是在ESP8266模塊初始化時仍保持GPIO0和GPIO2為高電平的同時進行所有操作。
上拉電阻R1和R3為這兩個引腳提供了必要的高電平,但是必須確保連接到GPIO0和GPIO2的任何額外電路都不能將引腳拉低。光電隔離繼電器連接在+ 3.3V和GPIO0之間。這樣可在啟動時使GPIO0保持高電平,但在啟動后允許GPIO0作為輸出,并使繼電器輸入接地以操作繼電器。模塊初始化時是否操作瞬時按鈕都沒有關系,因為只需將GPIO0連接到GPIO2并將這兩個都連接到其上拉電阻即可。
檢測配置模式
使用ESP8266作為一個臨時訪問點,您可以按此處所述通過網頁進行配置。該過程的一部分是在加電時使用按鈕或短路鏈接來指示要進入配置模式的軟件。
ESP8266模塊初始化后,將運行 setup()代碼。在該代碼中,要檢測瞬時按鈕是否被按下,您無需使GPIO0為低電平即可為按鈕提供GND,然后檢查GPIO2輸入是否為低。該檢查的副作用是,當設備進入配置模式時,繼電器將始終處于運行狀態。一旦看到繼電器操作,就可以釋放按鈕,因為屆時將已檢測到其輸入。這是一些示例代碼,可在 setup()
boolean configMode = false; // not in config mode normally
void setup() {
pinMode(0, OUTPUT);
digitalWrite(0, LOW); // make GPIO0 output low
// check GPIO2 input to see if push button pressed connecting it to GPIO0
configMode = (digitalRead(2) == LOW);
if (configMode) {
// start AP and get ready to serve config web page
// leave relay on to indicate in config mode
//。..。..
} else {
// normal usage
// make GPIO0 HIGH to turn off the relay
digitalWrite(0, HIGH);
//。..。.
}
// rest of setup()
}
檢測手動覆蓋按鈕
中進行此操作。開機時按下按鈕以啟用配置模式。除了能夠通過WiFi鏈接控制繼電器之外,我們還希望使用該按鈕作為手動替代來打開和關閉繼電器。
此處不介紹繼電器的WiFi控制,但可以使用pfodApp輕松完成。有關如何使用pfodDesigner為ESP8266模塊生成Arduino代碼的信息,請參見OLIMEX菜單生成器。
本節將介紹如何檢測何時按下按鈕,指示用戶想要切換繼電器,即打開它。如果是OFF,則將其打開;如果關閉,則將其打開。原理圖與上面相同,所有技巧都在代碼中。有兩種情況需要考慮:-
繼電器已關閉,用戶希望使用按鈕將其打開,
繼電器已打開,用戶希望
繼電器關閉,用戶希望使用按鈕將其打開。
在這種情況下, GPIO0為高電平。在這種情況下,實際上GPIO0可以作為輸入,因為上拉電阻R1將確保繼電器不會打開。那是訣竅。在這種情況下,將GPIO0設為輸入,將GPIO2輸出設為LOW,然后當用戶按下按鈕時,將發生兩件事:-a)由于GPIO2通過按鈕提供的接地,繼電器將打開,并且b)輸入GPIO0將變為低電平。該代碼檢查輸入GPIO0的狀態,并在輸入GPIO0變為低電平時知道使用已按下按鈕并希望繼電器打開。然后,該代碼使GPIO0變為Output LOW,以在釋放按鈕時使繼電器保持打開狀態。
繼電器打開,用戶希望使用按鈕將其關閉。
在這種情況下,從上述情況開始,GPIO0為輸出低電平,繼電器保持打開狀態。現在,在這種情況下,將GPIO2設為輸入(由R3上拉),然后當用戶按下按鈕時,輸入GPIO2被GPIO0上的LOW輸出拉低。當用戶釋放按鈕時,代碼將檢測到低電平到高電平的過渡,然后將GPIO0設為輸入,由于上拉電阻R1而釋放繼電器,并使GPIO2變為輸出LOW,以針對上述情況i)進行設置。
還有另一個竅門。對于情況ii),我們需要GPIO2作為輸入,該輸入可檢測到從低電平到高電平的轉換以關閉繼電器。但是,如果我們在情況i)的末尾制作GPIO2并輸入,那么當用戶釋放他們剛剛按下以打開繼電器的按鈕時,我們將獲得從低到高的轉換。為避免立即再次關閉繼電器,將忽略繼電器打開后的第一個從低到高的過渡,因為這只是用戶釋放他們按下的按鈕來打開繼電器。
示例循環( )繼電器手動超越控制代碼
在此代碼中,為簡單起見,我忽略了開關的反跳。輸入應在任何實際應用中進行去抖動。
示例代碼在此處,ESP8266_01pinMagic_1.ino
再次使TX/RX引腳可用進行串行調試或用作其他I/O
結論
此頁顯示了如何充分利用ESP8266-01上可用的有限引腳。將GPIO0/GPIO2用作I2C總線可提供最大的擴展,但是如果您的項目不使用I2C,您仍可以使用GPIO0/GPIO2來驅動繼電器并檢測按鈕輸入。無論哪種情況,TX/RX都可用于串行調試,或者如果您通過WiFi鏈接發送調試打印語句,則這些引腳也可用于常規I/O。
責任編輯:wv
-
指示燈
+關注
關注
3文章
415瀏覽量
28256 -
ESP8266
+關注
關注
50文章
962瀏覽量
44852
發布評論請先 登錄
相關推薦
評論