I²C Scanner mit LC Display

Ciao e benvenuto al nostro post sul blog di oggi.

Il bus I2C (inglese:I-Squared-C) è un bus dati seriale. Questo è noto anche come TWI (Two-Wire-Interface).
Permette la comunicazione tra un controller Mickro e diversi moduli su solo 2 linee, e lo rende molto facile da collegare e programmare sensori e moduli.

Ogni dispositivo abilitato per I2C ha un indirizzo specificato dal produttore. Per alcuni moduli, i 3 bit più bassi possono essere impostati su 3 pin di controllo. In questo caso, fino a otto IC simili possono essere azionati su un bus I2C.

Per scoprire l'indirizzo I2C di un modulo, gli hobbisti amano utilizzare un piccolo schizzo come i2cdetect, che cerca i diversi indirizzi del bus I2C e lo elenca nel monitor seriale.
Tuttavia, se si dispone di molti moduli I2C, o spesso è necessario testare grandi quantità, si consiglia uno scanner i2C con display.

Per questo progetto sono state utilizzate le seguenti parti:

- un modulo NodeMCU ESP32 (perché ha 2 bus I2C separati)
- il pacchetto display HD44780 1602 con interfaccia I2C
- 2x Breadboard
- 8x Cavo Jumper m2f
- 2x cavo ponticello m2m
- Cavo Micro USB per ESP32

Il circuito è cablato come nella tabella seguente.

 

tavolo

Quando carichiamo il nostro schizzo su ESP32, il seguente messaggio appare alternativamente sul display:

Display LC 1

Non appena colleghiamo un modulo I2C alle nostre linee di prova per SDA e SCL/SCK e lo forniamo con alimentazione, l'indirizzo trovato appare sul display:

Display LC 2
Si consiglia di etichettare le connessioni di prova e installare il tutto in un alloggiamento.

Etichetta

Ciò significa che abbiamo creato un semplice dispositivo di test con il quale possiamo determinare in modo rapido e affidabile l'indirizzo I2C dei nostri moduli in futuro e senza un computer.

Siamo lieti di fornirvi lo schizzo corrispondente:

 

Scanner di indirizzi slave I2C
Kutscher07: Modificato per la scheda TTGO TQ con OLED integrato
fonte: https://github.com/espressif/arduino-esp32/issues/977
Consegna a A: modificato per ESP32 con 1602 LCD
*/
#include <Filo.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 (Colonne di lcd) = 16;
uint8_t lcdRows (informazioni in base ai colori in = 2;
Bool Rilevato=False;
Regolare l'indirizzo del display utilizzato qui.
LiquidCrystal_I2C Lcd(0x3F (in modo di, lcdColumns (Colonne di lcd), lcdRows (informazioni in base ai colori in);   Vuoto scansione2(){   Rilevato=False;   Lcd.Setcursor(0,0);   Lcd.Chiaro();   Lcd.Stampare("I2C trovato a: ");   Lcd.Setcursor(0,1);   uint8_t Cnt=0;   Per(uint8_t Ho.=0;Ho.<128;Ho.++){     I2Ctwo.beginTransmission(Ho.);     uint8_t Ce=I2Ctwo.endTransmission(Vero);     Se(Ce==0){       Rilevato=Vero;       Se(Ho.<16) Lcd.Stampare("0");       Lcd.Stampare("0x");       Lcd.Stampare(Ho.,Hex);       Lcd.Stampare(" ");       Cnt++;     }   }   Se (Rilevato==False){     Lcd.Chiaro();     Lcd.Setcursor(0,0);     Lcd.Stampare("Nessun dispositivo I2C");     Lcd.Setcursor(0,1);     Lcd.Stampare("trovato ...");   }
}   Vuoto Installazione(){
I2Cone.Iniziare(SDA1,SCL1,400000); SDA pin 21, SCL pin 22 TTGO TQ
I2Ctwo.Iniziare(SDA2,SCL2,400000); SDA2 pin 17, sCL2 pin 16    Lcd.Init();   Lcd.Retroilluminazione();
}

Vuoto Ciclo(){   Lcd.Setcursor(0, 0);   Lcd.Chiaro();   Lcd.Stampare("Scansione bus I2C...");   Ritardo(2000);   scansione2();   Ritardo(4000);
}

 


Speriamo che ti sia piaciuto il progetto di oggi. Forse avete idee e suggerimenti su come espandere il tutto? Attendiamo con ansia il tuo feedback e ti salutiamo fino al prossimo post.

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