Das dreiundzwanzigste Türchen

Hoy es el turno de una variante especial del ESP32, llamada ESP32-Mini. Esta placa se caracteriza por ser compatible con los pines con la D1-Mini. Eso significa que se pueden usar shields para el D1-Mini sin ningún problema.

 


Los pines con el borde blanco son los que son idénticos con el D1-Mini. Si los equipa con las tiras combinadas de pines y resorte que se incluyen, también puede usar el ESP32-Mini en el Escudo de doble base utilizar.

La placa tiene dos filas adicionales de pines para que se puedan usar tantos GPIO del ESP32 como sea posible. Aquí está el pinout completo.

 

En el proyecto de hoy queremos trabajar con el ESP32-Mini y uno Protector de pantalla OLED de 0,66 pulgadas Realice un escáner I2C pequeño y compacto.El cableado es muy simple porque la pantalla solo tiene que conectarse al ESP32-Mini. Equipamos la placa ESP32 con las cuatro regletas de enchufes de diez pines. Conectamos la pantalla en las dos regletas de enchufes internos, dejando libres los dos pines en la dirección del conector USB.

Para examinar el bus I2C, sería bueno que los pines requeridos estuvieran uno al lado del otro de tal manera que el módulo I2C simplemente se pueda enchufar. Esto se puede hacer fácilmente si el módulo I2C se suministra a través de pines GPIO. La única restricción con este método es que el módulo no debe requerir más de 30 mA, que ciertamente es el caso de todos los módulos de sensor.

Para ello, utilizaremos los pines GPIO27, GPIO25, GPIO32 y GPIO12 a la derecha, la regleta de enchufe exterior.

  • GPIO27 = Vcc 3.3V
  • GPIO25 = TIERRA 0V
  • GPIO32 = SCL
  • GPIO12 = SDA

Esta es la asignación de pines típica de la mayoría de los módulos con un bus I2C.

La imagen muestra el ESP32-Mini con pantalla adjunta y un módulo de sensor BMP180.

 


Sin embargo, esta estructura todavía tiene una pequeña desventaja. También hay módulos de sensores con la misma asignación de pines, pero con pines adicionales. Estos pines no deben conectarse a los pines vecinos del conector hembra ESP32. Además, el módulo de prueba ya no se puede enchufar simplemente cuando el escáner se va a montar en una carcasa. La solución es una extensión de cuatro polos para los pines de prueba.


Fabricamos esta extensión a partir de una de las dos tiras de pines y resorte combinadas incluidas. Los cortamos para que queden cuatro alfileres. Ponemos esta extensión en los pines de prueba. Ahora los pines adicionales de los módulos de sensor están simplemente fuera del enchufe. Cuando se instala en una carcasa, los pines de prueba sobresalen fácilmente accesibles de la carcasa.

El programa es muy sencillo. Se intenta establecer una conexión una tras otra con las 127 direcciones I2C para escanear. Si la conexión se realiza correctamente, la dirección correspondiente se muestra en la pantalla. La medición se realiza para diferentes velocidades de bus.

  • I2C estándar de 100 kHz
  • I2C rápido de 400 kHz
  • 1 MHz Fast Plus I2C
  • I2C de alta velocidad de 4 MHz

Para la compilación, necesitamos el paquete ESP32 y las bibliotecas Adafruit_GFX.h y Adafruit_SSD1306.h para la pantalla.

#include<Wire.h> //I2C Bibliothek im Package enthalten
#include <Adafruit_GFX.h> //Allgemeine Grafik Bibliothek
#include <Adafruit_SSD1306.h> //Bibliothek für den verwendeten Display Treiber

#define SDA1 21 //Daten Pin für den ersten I2C Bus für das Display
#define SCL1 22 //Takt Pin für den ersten I2C Bus für das Display

#define SDA2 12 //Daten Pin für den zweiten I2C Bus verwendet als Testbus
#define SCL2 32 //Takt Pin für den zweiten I2C Bus verwendet als Testbus
#define MVIN 27 //Pin für die Stromversorgubg immer auf HIGH
#define MGND 25 //Pin für GND immer auf LOW

#define X0 32 //Das Display hat nur 64 Pixel in der Breite, der SSD1306 kann aber nur mindestens
//96 Pixel richtig verarbeiten, wobei sich die übrigen 32 Pixel am linken Rand
//befinden. Alle Ausgaben auf das Display haben daher einen Offset von 32 Pixeln

//Instanzen für die beiden I2C Busse
TwoWire I2Ca = TwoWire(0);
TwoWire I2Cb = TwoWire(1);

//Instanz für das Display die Parameter sind
//Display-Breite, Display-Höhe und Adresse der I2C Bus Instanz
Adafruit_SSD1306 display(96,48,&I2Ca);

//Bufferspeicher für die gefundenen Adressen
//"--" bedeutet keine Adresse gefunden
char adresse[4][3] = {"--","--","--","--"};

//Ein Scan mit einer bestimmten Frequenz wird durchgeführt
//Der Parameter step gibt die Nummer der Messung an
void scan(uint32_t frequency, uint8_t step) {
bool error = false;
bool found = false;
I2Cb.setClock(frequency); //I2C Busfrequenz setzen
for(int i=1; i<128; i++){
I2Cb.beginTransmission(i); //I2C Übertragung starten
error = I2Cb.endTransmission(); //Beim Beenden prüfen wir auf Fehler
if(error == 0){ //War kein Fehler aufgetreten, merken wir uns die Adresse
sprintf(adresse[step],"%02x",i);//Adresse als zweistellige HEX Zahl speichern
found=true;
    }
  }
if (!found) {
strcpy(adresse[step],"--"); //es wurde keine funktionierende Adresse gefunden
  }
}

//Die gefundenen Adressen in der zweiten Spalte des Displays anzeigen
void displayResult(){
for (uint8_t i = 0;i<4; i++){
display.fillRect(X0+45,8*i+16,12,8,BLACK); //Zuerst einen alten Wert löschen
display.setCursor(X0+45,16+i*8); //Cursor setzen X=45 und Y ab Zeile 3 daher + 16
display.print(adresse[i]); //Daten aus dem Bufferspeicher ausgeben
}
display.display(); //Display aktualisieren
}



void setup() {
Serial.begin(115200);
//Pins für die Stromversorgung des Testmodul
pinMode(MVIN,OUTPUT);
pinMode(MGND,OUTPUT);
digitalWrite(MVIN,1);
digitalWrite(MGND,0);
//Beide i2C Busse initialisieren
I2Ca.begin(SDA1,SCL1,400000);
I2Cb.begin(SDA2,SCL2,400000);
//Display initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//Leeres Formular anzeigen
display.clearDisplay();
display.setFont(NULL);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setTextWrap(0);
display.setCursor(X0+8,2);
display.print("I2C-Scan");
display.setCursor(X0,16);
display.print("100kHz");
display.setCursor(X0,24);
display.print("400kHz");
display.setCursor(X0,32);
display.print("1.0MHz");
display.setCursor(X0,40);
display.print("3.4MHz");
display.display();
}

void loop() {
//Scans für die verschiedenen Frequenzen durchführen
scan(100000,0);
scan(400000,1);
scan(1000000,2);
scan(3400000,3);
//Ergebnis anzeigen
displayResult();
//1s warten
delay(1000);
}

Y así es como se ve nuestro escáner I2C en una carcasa:

 


Diviértete construyéndolo.


Aquí están los enlaces a eso bosquejo y los archivos de impresión 3D Parte inferior / Parte superior.

Specials

Deja un comentario

Todos los comentarios son moderados antes de ser publicados