Hallo en welkom bij onze blogpost vandaag.
De I²C-bus (Duitse "I-Quadrat-C" of Engelse "I-Squared-C") is een seriële gegevensbus. Dit wordt ook wel TWI (tweedraadsinterface) genoemd.
Het maakt communicatie mogelijk tussen een Mickrocontroller en verschillende modules via slechts 2 lijnen, en maakt het mogelijk om sensoren en modules eenvoudig aan te sluiten en te programmeren.
Elk apparaat dat geschikt is voor I²C heeft een adres dat is opgegeven door de fabrikant. Voor sommige modules kunnen de laagste 3 bits worden ingesteld met behulp van 3 besturingspinnen. In dit geval kunnen maximaal acht vergelijkbare IC's op één I²C-bus worden gebruikt.
Om het I²C-adres van een module te achterhalen, gebruiken hobbyisten graag een kleine schets zoals i2cdetect, die de verschillende adressen van de I²C-bus doorzoekt en dit in de seriële monitor vermeldt.
Als u echter veel I²C-modules hebt of vaak grote hoeveelheden moet testen, is een i²C-scanner met display ideaal.
De volgende componenten werden voor dit project gebruikt:
- een ESP32 NodeMCU-module (omdat deze 2 afzonderlijke I²C-bussen heeft)
- de HD44780 1602 display-bundel met I²C-interface
- 2x broodplank
- 8x startkabels m2f
- 2x jumper kabel m2m
- Micro-USB-kabel voor de ESP32
Het circuit is bedraad zoals in de volgende tabel.
Als we onze schets nu uploaden naar de ESP32, verschijnt het volgende bericht afwisselend:
Zodra we een I²C-module aansluiten op onze testlijnen voor SDA en SCL / SCK en deze van stroom voorzien, verschijnt het gevonden adres op het display:
Het is raadzaam om de testverbindingen te labelen en het geheel in een behuizing te installeren.
We hebben een eenvoudig testapparaat gemaakt waarmee we het I²C-adres van onze modules in de toekomst snel en betrouwbaar kunnen bepalen, zonder computer.
We voorzien u graag van de bijbehorende schets:
/ * I2C slave adresscanner Kutscher07: gemodificeerd voor TTGO TQ-kaart met ingebouwde OLED Bron: https://github.com/espressif/arduino-esp32/issues/977 AZ-levering: gemodificeerd voor ESP32 met 1602 LCD */ # opnemen <Draad.h> # opnemen <LiquidCrystal_I2C.h> #define SDA1 21 #define SCL1 22 #define SDA2 17 #define SCL2 16 TwoWire I2Cone = TwoWire(0); TwoWire I2Ctwo = TwoWire(1); uint8_t lcdKolommen = 16; uint8_t lcdRows = 2; dwaas gedetecteerd=fout; // Pas het adres van de hier gebruikte displaya aan. LiquidCrystal_I2C lcd(0x3F, lcdKolommen, lcdRows); nietig scan2(){ gedetecteerd=fout; lcd.setCursor(0,0); lcd.duidelijk(); lcd.afdrukken("I2C gevonden op:"); lcd.setCursor(0,1); uint8_t cnt=0; voor(uint8_t ik=0;ik<128;ik++){ I2Ctwo.beginVerzending(ik); uint8_t ec=I2Ctwo.endTransmission(waar); als(ec==0){ gedetecteerd=waar; als(ik<16) lcd.afdrukken("0"); lcd.afdrukken("0x"); lcd.afdrukken(ik,HEX); lcd.afdrukken(" "); cnt++; } } als (gedetecteerd==fout){ lcd.duidelijk(); lcd.setCursor(0,0); lcd.afdrukken("Geen I2C-apparaten"); lcd.setCursor(0,1); lcd.afdrukken("gevonden ..."); } } nietig instellen(){ I2Cone.beginnen(SDA1,SCL1,400000); // SDA-pen 21, SCL-pen 22 TTGO TQ I2Ctwo.beginnen(SDA2,SCL2,400000); // SDA2-pen 17, SCL2-pen 16 lcd.init(); lcd.achtergrondverlichting(); } nietig lus(){ lcd.setCursor(0, 0); lcd.duidelijk(); lcd.afdrukken("Scannen I2C bus ..."); vertraging(2000); scan2(); vertraging(4000); }
We hopen dat je genoten hebt van het project van vandaag. Misschien heb je ideeën en suggesties om het hele ding uit te breiden? We kijken uit naar je feedback en nemen tot ziens afscheid tot het volgende bericht.
3 Reacties
ad
/* I2C slave Address Scanner
Kutscher07: Modified for TTGO TQ board with builtin OLED
Quelle: https://github.com/espressif/arduino-esp32/issues/977
AZ-Delivery: Modified for ESP32 with 1602 LCD
*/
#include
#include
#define SDA1 21
#define SCL1 22
#define SDA2 17
#define SCL2 16
TwoWire I2Cone = TwoWire(0);
TwoWire I2Ctwo = TwoWire(1);
uint8_t lcdColumns = 16;
uint8_t lcdRows = 2;
bool detected=false;
//Hier die Adresse des verwendeten Displaya anpassen.
LiquidCrystal_I2C lcd(0×3F, lcdColumns, lcdRows);
void scan2(){
detected=false;
lcd.setCursor(0,0);
lcd.clear();
lcd.print(“I2C found at: ”);
lcd.setCursor(0,1);
uint8_t cnt=0;
for(uint8_t i=0;i<128;i++){
I2Ctwo.beginTransmission(i);
uint8_t ec=I2Ctwo.endTransmission(true);
if(ec==0){
detected=true;
if(i<16) lcd.print(“0”);
lcd.print(“0x”);
lcd.print(i,HEX);
lcd.print(" “);
cnt++;
}
}
if (detected==false){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(”No I2C devices");
lcd.setCursor(0,1);
lcd.print(“found …”);
}
}
void setup(){
I2Cone.begin(SDA1,SCL1,400000); // SDA pin 21, SCL pin 22 TTGO TQ
I2Ctwo.begin(SDA2,SCL2,400000); // SDA2 pin 17, SCL2 pin 16
lcd.init();
lcd.backlight();
}
void loop(){
lcd.setCursor(0, 0);
lcd.clear();
lcd.print(“Scanning I2C Bus…”);
delay(2000);
scan2();
delay(4000);
}
Armin Walter
In der Prozedur setup() fehlt die Initialisierung von IIC.
Einfügen Wire.begin(); vor “I2Cone.begin………”
Michael Reichelt
Hallo, beim Compilieren erhalte ich den Fehler
no matching function for call to ‘TwoWire::TwoWire(int)’
Ich habe es dann mit dem oben erwähnten Script i2cdetect versucht, der produziert den gleichen Fehler – was mache ich falsch?