I²C Scanner mit LC Display - AZ-Delivery

Hallo und willkommen bei unserem heutigen Blog-Beitrag.

Der I²C Bus (Deutsch “I-Quadrat-C” oder Englisch “I-Squared-C”) ist ein Serieller Datenbus. Dieser ist auch unter der Bezeichnung TWI (Two-Wire-Interface) bekannt.
Er ermöglicht die Kommunikation zwischen einem Mickrocontroller und verschiedenen Modulen über lediglich 2 Leitungen, und ermöglicht es sehr einfach Sensoren und Module zu verschalten und zu programmieren.

Jedes I²C-fähige Gerät hat eine vom Hersteller festgelegte Adresse. Bei manchen Modulen können die untersten 3 Bits über 3 Steuerpins festgelegt werden. In diesem Fall können bis zu acht gleichartige ICs an einem I²C Bus betrieben werden.

Um die I²C Adresse eines Moduls in Erfahrung zu bringen, greifen Bastler gerne auf einen kleinen Sketch wie i2cdetect zurück, der die verschiedenen Adressen des I²C Bus durchsucht, und dies im Seriellen Monitor auflistet.
Wer jedoch viele I²C Module hat, oder öfters große Mengen testen muss, für den bietet sich ein i²C Scanner mit Display an.

Für dieses Projekt wurden folgende Bauteile verwendet:

- ein ESP32 NodeMCU Modul (da dieser 2 getrennte I²C Busse hat)
- das HD44780 1602 Display Bundle mit I²C Schnittstelle
- 2x Breadboard
- 8x Jumper Kabel m2f
- 2x Jumper Kabel m2m
- Micro USB Kabel für den ESP32

Die Schaltung wird wie in der folgenden Tabelle verdrahtet.

 

Tabelle

Wenn wir nun unseren Sketch auf den ESP32 hochladen erscheint im Display abwechselnd folgende Meldung:

LC Display 1

Sobald wir nun ein I²C Modul an unseren Testleitungen für SDA und SCL/SCK anschliessen und mit Strom versorgen, erscheint die gefunden Adresse im Display:

LC Display 2
Es empfiehlt sich die Test-Anschlüsse zu beschriften, und das ganze in ein Gehäuse einzubauen.

Beschriftung

Damit haben wir ein einfaches Testgerät erstellt mit dem wir in Zukunft schnell und zuverlässig, und ohne Computer, die I²C Adresse unserer Module ermitteln können.

Den dazugehörigen Sketch stellen wir Ihnen gerne zur Verfügung:

 

/* 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 <Wire.h>
#include <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 lcdColumns = 16;
uint8_t lcdRows = 2;
bool detected=false;
//Hier die Adresse des verwendeten Displaya anpassen.
LiquidCrystal_I2C lcd(0x3F, 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);
}

 


Wir hoffen das heutige Projekt hat Ihnen gefallen. Vielleicht haben Sie ja Ideeen und Anregungen wie man das ganze noch erweitern könnte? Wir freuen uns auf Ihr Feedback, und verabschieden uns bis zum nächsten Beitrag.

DisplaysEsp-32Projekte für anfänger

3 comments

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?

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery