Kuidas skannida I2C-aadressi ESP32-s Arduino IDE abil

Kuidas Skannida I2c Aadressi Esp32 S Arduino Ide Abil



ESP32 on mikrokontrolleripõhine platvorm, mis suudab liidestada mitme seadmega, et juhtida erinevaid väljundeid vastavalt sisendile. Kõik sideprotokollid nagu UART, SPI ja I2C mängivad ESP32 suhtluses olulist rolli. Selles juhendis käsitleme interintegraallülituste või I2C sideprotokolli ja seadme aadressi skannimist.

Sissejuhatus I2C suhtlusse

I2C, tuntud ka kui I2C või IIC, on sünkroonne ülem-alluv sideprotokoll, kus signaali ülemseade saab juhtida mitut alluvat seadet ühe juhtme (SDA-liini) kaudu.

I2C ühendab UART ja SPI protokollide töö, näiteks SPI toetab mitme alamseadme juhtimist ühe ülemseadme üle, I2C toetab ka seda, teisest küljest kasutab UART suhtluseks kaherealist TX ja Rx. I2C kasutab ka kaherealist SDA ja SCL suhtlemine.









Siin näeme, et oleme kasutanud tõmbetakisteid nii SDA kui ka SCL liinidega. Selle põhjuseks on asjaolu, et vaikimisi väljastab I2C ainult kaks taset kas LOW või avatud vooluringi. Vaikimisi on kõigi kiipide I2C avatud vooluahela režiimis, nii et nende KÕRGEKS tõmbamiseks kasutasime tõmbetakistit.



Järgmised on kaks rida, mida I2C kasutab:





  • SDA (jadaandmed) : liin andmete edastamiseks ja vastuvõtmiseks ülemseadmelt alamseadmele ja vastupidi
  • SCL (jadakell) : kella signaaliliin konkreetse alamseadme valimiseks

ESP32 I2C siini liidesed

ESP32-l on kaks I2C siiniliidest, mille abil toimub I2C-suhtlus olenevalt ESP32-ga liidestavast seadmest kas ülem- või alamühendusena. ESP32 andmelehe kohaselt toetab ESP32 plaadi I2C liides järgmist konfiguratsiooni:

  • Standardrežiimis I2C side kiirusega 100 Kbit/s
  • Kiire või täiustatud režiimis I2C side kiirusega 400 Kbit/s
  • Kahekordne adresseerimisrežiim 7-bitine ja 10-bitine
  • Kasutajad saavad juhtida I2C liidest, programmeerides käsuregistreid
  • ESP32 I2C siini liides on juhtimisel paindlikum

I2C-seadmete ühendamine ESP32-ga

Seadmete liidestamine ESP32-ga I2C-protokolli kasutades on väga lihtne, nagu ka UART-iga, vajame SDA ja SCL-kella ühendamiseks ainult kahte rida.



ESP32 saab konfigureerida nii ülem- kui ka alamrežiimis.

ESP32 I2C põhirežiim

Selles režiimis genereerib ESP32 kellasignaali, mis algatab side ühendatud alamseadmetega.

ESP32 kaks GPIO tihvti, mis on I2C-suhtluseks eelmääratletud:

  • SDA : GPIO PIN 21
  • SCL : GPIO PIN 22

ESP32 I2C alluv režiim

Alamrežiimis genereerib kella ülemseade. Master on ainus seade, mis juhib I2C-suhtluses SCL-liini. Orjad on seadmed, mis reageerivad ülemale, kuid ei saa andmeedastust algatada. ESP32 I2C siinis saab andmeedastust seadmete vahel algatada ainult juht.

Pildil on kaks ESP32 plaati ülem-alluv konfiguratsioonis.

Praeguse seisuga oleme aru saanud I2C-režiimi toimimisest ESP32-s, nüüd leiame antud koodi üles laadides hõlpsalt iga seadme I2C-aadressi.

Kuidas skannida I2C-aadressi ESP32-s Arduino IDE abil

ESP32-ga ühendatud seadmete I2C-aadressi leidmine on oluline, sest kui kasutame sama I2C-aadressiga seadmeid, ei saa me nendega suhelda ühe siiniliini kaudu.

Iga I2C-seade peab sisaldama unikaalset aadressi ja aadressivahemikku 0 kuni 127 või (0 kuni 0X7F) HEX-is. Näiteks kui kasutame kahte sama mudelinumbri või tootega OLED-kuvarit, on mõlemal sama I2C-aadress, nii et me ei saa kasutada mõlemat ESP32 samal I2C-real.

IC-aadressi leidmiseks võtame näite.

Skemaatiline

Alloleval pildil on skemaatiline diagramm OLED-ekraani liidesest ESP32-plaadiga, kasutades I2C-sideprotokolli.

ESP32 ühendus OLED-iga sisaldab:

OLED ekraan ESP32 pin
VCC 3V3/VIN
GND GND
SCL GPIO 22
SDA GPIO 21

Kood
Avage Arduino redaktor ja laadige antud I2C skannimiskood ESP32 plaadile. Veenduge, et ESP32 on ühendatud ja COM-port on valitud.

/****************
****************
linuxhint.com
****************
****************/

#include  /*Kaasas juhtmeteek*/

tühine seadistus ( ) {
Wire.begin ( ) ; /* I2C suhtlus algab */
Serial.begin ( 115 200 ) ; /* Määratletud edastuskiirus jaoks jadaside */
Serial.println ( ' \n I2C skanner' ) ; /* prindiskanner jadamonitoril */
}

tühi silmus ( ) {
baidi viga, aadress;
int nSeadmed;
Serial.println ( 'Skannimine...' ) ; /* ESP32 alustab saadaolevate I2C-seadmete skannimist */
nSeadmed = 0 ;
jaoks ( aadress = 1 ; aadress < 127 ; aadress++ ) { /* jaoks silmus sisselülitatud seadmete arvu kontrollimiseks 127 aadress */
Wire.beginTransmission ( aadress ) ;
error = Wire.endTransmission ( ) ;
kui ( viga == 0 ) { /* kui Leiti I2C seade */
Serial.print ( 'I2C seade leitud aadressilt 0x' ) ; /* printige see rida kui Leiti I2C seade */
kui ( aadress < 16 ) {
Serial.print ( '0' ) ;
}
Serial.println ( aadress, HEX ) ; /* prindib I2C aadressi HEX väärtuse */
nSeadmed++;
}
muidu kui ( viga == 4 ) {
Serial.print ( 'Tundmatu viga aadressil 0x' ) ;
kui ( aadress < 16 ) {
Serial.print ( '0' ) ;
}
Serial.println ( aadress, HEX ) ;
}
}
kui ( nSeadmed == 0 ) {
Serial.println ( 'I2C-seadmeid ei leitud \n ' ) ; /* Kui I2C-seadet pole ühendatud, printige see teade */
}
muidu {
Serial.println ( 'tehtud \n ' ) ;
}
viivitus ( 5000 ) ; /* Viivitus antud jaoks I2C siini kontrollimine iga kord 5 sek */
}

Ülaltoodud kood otsib saadaolevaid I2C-seadmeid. Kood algas I2C suhtluse juhtmeteeki helistamisega. Järgmine jadaside käivitatakse edastuskiiruse abil.

I2C skannimiskoodi tsükliosas on kaks muutuja nime, viga ja aadress on määratletud. Need kaks muutujat salvestavad seadmete I2C-aadressi. Järgmisena lähtestatakse for-silmus, mis otsib I2C-aadressi vahemikus 0 kuni 127 seadet.

Pärast I2C-aadressi lugemist prinditakse väljund jadamonitorile HEX-vormingus.

Riistvara

Siin näeme, et OLED 0,96-tolline I2C ekraan on ühendatud ESP32 plaadiga GPIO klemmidega 21 ja 22. Ekraani Vcc ja GND on ühendatud ESP32 3V3 ja GND viiguga.

Väljund
Väljundis näeme ESP32 plaadiga ühendatud OLED-ekraani I2C aadressi. Siin on I2C-aadress 0X3C, nii et me ei saa kasutada ühtegi teist sama aadressiga I2C-seadet, selleks peame esmalt muutma selle seadme I2C-aadressi.

Oleme edukalt saanud ESP32 plaadiga ühendatud OLED-ekraani I2C-aadressi.

Järeldus

I2C-aadressi leidmine mitme seadme ühendamisel ESP32-ga on oluline, kuna sama I2C-aadressi jagavaid seadmeid ei saa ühendada ühe I2C siini kaudu. Ülaltoodud koodi abil saab tuvastada I2C-aadressi ja kui kahe seadme aadressid kattuvad, saab seda vastavalt seadme spetsifikatsioonidele vastavalt muuta.