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.
Quando carichiamo il nostro schizzo su ESP32, il seguente messaggio appare alternativamente sul display:
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:
Si consiglia di etichettare le connessioni di prova e installare il tutto in un alloggiamento.
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.
3 commenti
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?