ESP32上的兩個(gè)獨(dú)立I2C總線如何單獨(dú)連接兩個(gè)傳感器
您有兩個(gè)傳感器,具有相同的I2C地址,您希望通過為每個(gè)傳感器使用單獨(dú)的I2C總線連接到ESP32。
您有一個(gè)微控制器和兩個(gè)相同的傳感器,這意味著它們具有相同的I2C地址。如果沒有多路復(fù)用器或配置傳感器的I2C地址的可能性,則無法將它們連接到相同的I2C總線。但是,在提供配置任何GPIO引腳對(duì)作為I2C總線的能力的板上,您可以將兩個(gè)傳感器連接到它們自己的I2C總線。
在本例中,我們使用ESP32,它支持多個(gè)I2C總線和兩個(gè)盛思銳SCD41 CO2傳感器評(píng)估板。您可以使用任意兩個(gè)傳感器,無論它們是相同的產(chǎn)品還是具有相同I2C地址的不同傳感器。評(píng)估板很方便,因?yàn)槲覀兛梢詫⑺鼈兣c評(píng)估套件中的電纜連接起來。
一般工作原理
我們要連接的兩個(gè)SCD41傳感器的I2C地址為0x62,無法更改。因此,為了與來自微控制器的兩個(gè)傳感器通信,我們將為每個(gè)傳感器使用單獨(dú)的I2C總線。每個(gè)I2C總線需要一個(gè)引腳用于SDA線,一個(gè)引腳用于SCL線。第一個(gè)傳感器將連接到標(biāo)準(zhǔn)I2C引腳。對(duì)于第二個(gè)I2C總線,我們需要定義兩個(gè)要使用的GPIO引腳并將第二個(gè)傳感器連接到這些引腳。在軟件方面,我們使用標(biāo)準(zhǔn)的Wire庫。對(duì)于連接到默認(rèn)引腳的第一個(gè)傳感器,您可以使用預(yù)配置的“Wire”實(shí)例。對(duì)于第二個(gè)傳感器,我們需要配置第二個(gè)實(shí)例“Wire1”,以使用所選引腳。作為最后一步,我們將創(chuàng)建傳感器驅(qū)動(dòng)程序類的兩個(gè)實(shí)例,并使用標(biāo)準(zhǔn)I2C總線初始化一個(gè)實(shí)例,使用自定義I2C總線初始化另一個(gè)實(shí)例。
布線
首先,我們需要定義將用于兩個(gè)I2C總線的引腳。對(duì)于I2C總線A,我們可以使用板的默認(rèn)I2C引腳。對(duì)于ESP32 DevKitC,這些是引腳21 (SCL)和引腳22 (SDA)。對(duì)于I2C總線B,我們可以選擇任意兩個(gè)GPIO(通用輸入輸出)引腳。如果您使用的是不同的電路板,檢查規(guī)格以確定是否有任何引腳具有阻止它們用作GPIO引腳的特殊配置是很重要的。在我們的例子中,我們?yōu)镮2C總線B選擇了引腳17和16。
上拉電阻
在I2C數(shù)據(jù)(SDA)和時(shí)鐘(SCL)線上安裝上拉電阻對(duì)于良好的信號(hào)質(zhì)量和穩(wěn)健的通信非常重要。您可以在I2C上拉電阻介紹中了解更多信息。
ESP32 DevKitC單板保證GPIO線自動(dòng)拉到高電平。因此,不需要為您打算使用的引腳手動(dòng)連接或配置上拉電阻。
接線圖
由于SCD41傳感器兼容3.3V和5V,我們可以將一個(gè)傳感器連接到3.3V引腳,另一個(gè)連接到5V引腳。如果兩個(gè)傳感器需要相同的電壓,它們可以通過面包板連接。
對(duì)于本例,應(yīng)該按照下圖所示進(jìn)行布線:
?SEK - SCD41A -引腳1至ESP32引腳22 (SCL,黃色電纜)
?SEK - SCD41A -引腳2到ESP32 GND(接地,黑色電纜)
?SEK - SCD41A -引腳3到ESP32 3V3(傳感器電源電壓,紅色電纜)
?SEK - SCD41A -引腳4至ESP32引腳21 (SDA,綠色電纜)
?SEK - SCD41B -引腳1至ESP32引腳17 (SCL,黃色電纜)
?SEK - SCD41B -引腳2到ESP32 GND(接地,黑色電纜)
?SEK - SCD41B -引腳3到ESP32 5V(傳感器電源電壓,紅色電纜)
?SEK-SCD41 B -引腳4至ESP32引腳16 (SDA,綠色電纜)
在稍后配置軟件時(shí),重要的是要記住為第二個(gè)I2C總線分配的引腳。具體來說,我們使用引腳16用于I2C數(shù)據(jù)(SDA),引腳17用于I2C時(shí)鐘(SCL)和。
軟件設(shè)置
首先,您需要包含Wire庫:
我們正在使用Arduino ESP32平臺(tái),其中包括Wire庫。
我們可以使用Wire實(shí)例,而不需要對(duì)連接到“I2C總線A”(默認(rèn)的I2C總線)的傳感器進(jìn)行任何修改。我們只需要初始化總線:
對(duì)于“I2C總線B”,我們需要配置一個(gè)自定義TwoWire實(shí)例。有一個(gè)名為Wire1的預(yù)定義實(shí)例,我們可以配置它來使用我們?cè)趕etup()函數(shù)中使用以下代碼行定義的引腳:
然后,通過I2C總線向傳感器發(fā)送命令的代碼需要知道哪個(gè)傳感器使用哪個(gè)總線。因此,您需要相應(yīng)地配置傳感器實(shí)例。首先,為每個(gè)傳感器創(chuàng)建一個(gè)驅(qū)動(dòng)程序?qū)嵗?
它們的作用域應(yīng)該是全局的,這樣就可以在setup()和loop()中引用它們。
然后,在setup()函數(shù)中,為傳感器分配I2C總線:
確保您確實(shí)為傳感器b分配了Wire1,以便它使用自定義設(shè)置I2C總線。
現(xiàn)在可以向傳感器發(fā)送任何I2C命令,例如啟動(dòng)測(cè)量和檢索值。
您可以在ESP32 I2C教程中使用Arduino IDE找到如何在ESP32平臺(tái)上配置多個(gè)I2C總線的更多細(xì)節(jié)和選項(xiàng)。
本文編譯自hackster.io