I2C-Scanner mit LC-Display

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.

 

Tafel

Als we onze schets nu uploaden naar de ESP32, verschijnt het volgende bericht afwisselend:

LC-display 1

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:

LC-display 2
Het is raadzaam om de testverbindingen te labelen en het geheel in een behuizing te installeren.

Belettering

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.

DisplaysEsp-32Projekte für anfänger

3 Kommentare

ad

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

Armin Walter

In der Prozedur setup() fehlt die Initialisierung von IIC.

Einfügen Wire.begin(); vor “I2Cone.begin………”

Michael Reichelt

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?

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert