Escaner I2C no detecta dispositvo pero funciona

Buenas, pues llevo una semana peleándome con una pantalla OLED de 2’42 pulgadas y no tengo manera de que el Escáner I2C me diga que dirección tiene, aunque en la serigrafía pone que está en 0x7B y que se puede cambiar a 0x7A yo quería comprobarlo.

Después de reclamar al vendedor por varias ocasiones este me insistía que la pantalla estaba bien y que la dirección era 0x3C y ya dispuesto a tirar la toalla y tirar dos pantallas me decidí a probarla.

Y funciona, lo que no entiendo es como no me dice que dirección tiene y sin embargo funciona, paso el código de prueba y foto de la pantalla, porque es que no lo entiendo para nada.

Y ya de paso si alguien me dice donde encontrar en donde aparecen todas las funciones que trae la librería U8g2lib.h

Libreria: GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2

#include<Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

  /*
  Resumen de Funciones:
    El primer numero indica columna de inicio
    El segundo numero indica linea de inicio
    El tercer numero de pixeles que pinta
    drawHLine: pinta lineas Horizontales
    drawVLine: pinta lineas Verticales
    drawStr: pinta caracteres
    u8g2.drawCircle: pinta circulos
    u8g2.drawBox: pinta un rectangulo relleno
    clearBuffer: borra la memoria interna
    setFont: elige una fuente adecuada
    sendBuffer: transferir la memoria interna a la pantalla
    
*/

  U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/SCL, /* data=*/SDA, /* reset=*/U8X8_PIN_NONE);  // Todas las placas sin reinicio de la pantalla

void setup(void) {

  u8g2.begin();
}

void loop(void) {

  u8g2.firstPage();
  do {

    u8g2.drawHLine(0, 0, 128);
    u8g2.drawHLine(10, 2, 107);
    u8g2.drawHLine(20, 4, 85);
    u8g2.drawHLine(20, 59, 85);
    u8g2.drawHLine(10, 61, 107);
    u8g2.drawHLine(0, 63, 128);

    u8g2.drawVLine(0, 1, 62);
    u8g2.drawVLine(127, 1, 62);

    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.drawStr(4, 27, "Hola Mundo!");

    //    u8g2.drawStr(4,48,"Hola Nacho!");

    u8g2.drawCircle(110, 31, 10);
    u8g2.drawBox(30, 40, 15, 15);

  } while (u8g2.nextPage());

  //   u8g2.sendBuffer();
  //   u8g2.clearBuffer();

  // delay(3000);
}

No tengo esa pantalla OLED, pero creo que la tuya tiene la serigrafía incorrecta; debería ser 0x78, no 0x7B.
La U8g2lib.h requiere la dirección I2C de 8 bits, que es la dirección de 7 bits multiplicada por 2. Por lo tanto, una pantalla con una dirección de 7 bits de 0x3C tiene una dirección de 8 bits de 0x78, mientras que la otra dirección, 0x3A, corresponde a 0x3D. Compruébalo y avísame.

Como ocurre con casi todas las bibliotecas, las funciones incluidas están disponibles en GitHub. En este caso, puedes visitar su wiki:

El caso es que no puedo ponerle ninguna dirección al
u8g2.begin();
si le pongo una dirección me da el siguiente error

Compilation error: no matching function for call to 'U8G2_SSD1306_128X64_NONAME_1_SW_I2C::begin(int)'

Se me olvida, ya estuve revisando GitHub y no he sido capaz de encontrar donde están las diferentes funciones.

Vuelvo a rectificar y a morderme la lengua, acabo de encontrar la guía de referencia

Sí, porque en esa library, la función begin() no requiere parámetros, como deberías poder ver en Github. El constructor solo requiere Layout, SDA, SCL y Reset.

Pero si hubieras leído la wiki que te recomendé, habrías encontrado la respuesta aquí:

  • Description: By default, U8g2 assumes the lowest possible I2C address of the display. This procedure will assign the I2C address to u8g2, if the display is configured to a different address. Call this procedure before begin().

Como estás usando la dirección más baja, la visualización funciona.
Si alguna vez quieres cambiarla, debes llamar a esa función setI2CAddress() antes de begin().

Leer (y comprender) la documentación de la biblioteca es importante; es importante hacerlo siempre, ya que nos ahorra tiempo...

Me resulta muy dificil

Leer (y comprender)

No tengo ni idea de ingles y me defiendo como puedo.

Dicho esto sigo sin entender porque el I2C Escaner no encuentra la dirección de la pantalla

Espero que puedas y sepas cómo usar el Traductor de Google para traducir una página (o usar Chrome, que lo hace automáticamente).

En fin, esta es la traducción de ese párrafo:

Descripción: Por defecto, U8g2 asume la dirección I2C más baja posible de la pantalla. Este procedimiento asignará la dirección I2C a u8g2 si la pantalla está configurada con una dirección diferente. Llame a este procedimiento antes de begin().

Entonces la respuesta a tu pregunta o duda es la que escribí arriba, usa esa pantalla sin preocuparte por su dirección I2C.

PD: No sé por qué el I2C Scanner no lo detecta, ya que teóricamente la dirección de 7 bits debería llegar hasta 127, es decir 0x7F, pero quizá tenga algo que ver con que ese dispositivo interpreta la dirección de 8 bits, no tengo idea pero lo importante es que te funcione :wink:

Eso no es excusa amigo, Edge (y Chrome como te dice @docdoc) traducen automáticamente o con una opción del menú contextual. No hay excusas.

De hecho yo manejo más o menos lo que llaman "inglés técnico" (a fuerza de tener que leer manuales de equipos y hojas de datos) así que entiendo como lo haría Tarzán, no me pongas un verbo que no sea en infinitivo porque... Así que para mí, ambos navegadores son la 8va maravilla. :grin:

Y si ves alguna respuesta mía en inglés es gracias a los traductores, Jajaja. Hasta busco la ayuda de Copilot para que verifique si lo que escribo es correcto.

No hay excusas solo hay que poner ganas y hacer trabajar "el coco" antes que se atrofie. :zany_face:

Agrego:

Sobre por qué I2Cscanner no detecta la pantalla no tengo idea y no tengo ninguna pantalla I2C (las 3 o 4 que tengo son SPI) como para probar.
Aunque es raro que I2Cscanner no la detecte pero si lo haga la librería. :thinking:

No, no es así.

Una pantalla con dirección 0x78 tiene dirección 0x78, que por cierto es de 7 bits no de 8, y en el rango 0x00 a 0x7F (con algunas direcciones reservadas).

Lo que parece una multiplicación por 2 es el desplazamiento que se hace a la dirección porque se envía en los 7 bits más significativos del byte de dirección (o sea bits 7 a 1), el bit 0 es el comando R/W.
Pero no es algo que habitualmente maneje el usuario.

Hi,
Si miran la imagen del displays los pines que selecciona la direccion del display veran que la direccion de los pines indican leyendolos de arriba hacia abajo es de 1011 que indican que la direccion es 7B . Los pines de seleccion estan en el medio del cable de oro del display y los pines del I2c.

A @MaximoEsfuerzo:
No estaba poniendo como escusa mi falta total de desconocimiento del Ingles, claro que uso el traductor pero en estos temas técnicos el traductor traduce como traduce y se me escapan muchos matices y realmente algunas veces me quedo igual que si lo leo en Ingles.

Por eso preguntaba como el IC2 Scaner no lo detecta y la librería U8g2Lib sean capaz de direccionar correctamente la pantalla y además en este caso me acabo de dar cuenta de que la libreria Wire es totalmente innecesaria en este código.

A @tauro0221:
He estado remirando la pantalla con el tema

No veo a que pines te refieres ¿podiras señalarmelos en la foto que puse de la pantalla? por favor

!
Hi,
Adjunto foto donde aparecen los de selecion de direccion del display.

imagen_mod|658x448

Solo intentaba darte ánimos. :wink:

Saludos

Gracias @tauro0221, ya los tenia localizados pero como decías

estaba buscando en la serigráfia donde ponía 1011 :smiley:

Los ánimos van y vienen :rofl:

Lo que ya se me escapa es como hace la librería U8g2Lib para localizar a la pantalla cuando la puñetera pantalla no es encontrada por el I2C Scaner.

Por eso en el hilo Escaneo de direcciones I2C obtuve dos direcciones del mismo dispositivo porque en mi afán de localizar la dirección de la pantalla aumente el rango de búsqueda a 255 pero ya me quedo claro que solo se usan 7 primeros bits para direccionar dispositivos I2C.

Así que ese hilo y este están relacionados, y seguramente abriré otro para centrarme en la programación de la pantalla.

Aunque si algún moderador considera que es mejor fusionar ese hilo con este y continuar con el tema de la pantalla en los hilos fusionados pues que así sea.

¿Pero no la había encontrado cuando hiciste el otro posteo?

Podría ser que la serigrafía sea incorrecta, que no solo no sea 0x7B sino que tampoco sea 0x78 ni tampoco 0x7A

Que va, nunca las ha encontrado el I2C Scaner, es que no me expliqué bien con ese mensaje.

Como amplié el rango de búsqueda a 255 y para probar que el código estaba bien primero probé con otro dispositivo ya conocido y que el Scaner ya me reconocía y fue cuando me dio dos direcciones, que como ya me explicasteis era por el tema de que solo toma los 7 primeros bits

Así que realmente no se que dirección tienen las dos pantallas, lo que no acierto a comprender es como la librería U8g2Lib es capaz de levantar la pantalla, llegué a pensar que como en el código del post #1 llevaba incluida la librería Wire.h pues eso va a ser que la librería U8g2Lib se apoya en librería Wire.h, pero probé a quitar la librería Wire.h del código y la U8g2Lib sigue levantando la pantalla.

Con este código:

#include<Arduino.h>
#include <U8g2lib.h>
// #include <Wire.h>

  /*
  Resumen del ejemplo de U8g2lib:
    Ejemplos de búfer de pantalla: clearBuffer/sendBuffer. Rápido, pero puede que no funcione con todas las placas Arduino debido al consumo de RAM
    Ejemplos de búfer de página: firstPage/nextPage. Menor uso de RAM, debería funcionar con todas las placas Arduino.
    Ejemplo de Texto Solo U8x8: Sin uso de RAM, comunicación directa con el controlador de pantalla. Sin gráficos, solo texto 8x8.
    
  Este es un ejemplo de búfer de página.    
*/

  // Lista de constructores de U8g2 (Bucle de imágenes en búfer de página)
  // La lista completa está disponible aquí: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
  // Por favor, actualice los números de pin según su configuración. Utilice U8X8_PIN_NONE si el pin de reinicio no está conectado

  /*
  Resumen de Funciones:
    El primer numero indica columna de inicio
    El segundo numero indica linea de inicio
    El tercer numero de pixeles que pinta
    drawHLine: pinta lineas Horizontales
    drawVLine: pinta lineas Verticales
    drawStr: pinta caracteres
    u8g2.drawCircle: pinta circulos
    u8g2.drawBox: pinta un rectangulo relleno
    clearBuffer: borra la memoria interna
    setFont: elige una fuente adecuada
    sendBuffer: transferir la memoria interna a la pantalla
    
*/

  U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/SCL, /* data=*/SDA, /* reset=*/U8X8_PIN_NONE);  // Todas las placas sin reinicio de la pantalla

void setup(void) {

  Serial.begin(9600);
  Serial.println("Sketch: OLED 128x64 I2C SSD1309");

  u8g2.begin();
}

void loop(void) {

  u8g2.firstPage();
  do {

    u8g2.drawHLine(0, 0, 128);
    u8g2.drawHLine(10, 2, 107);
    u8g2.drawHLine(20, 4, 85);
    u8g2.drawHLine(20, 59, 85);
    u8g2.drawHLine(10, 61, 107);
    u8g2.drawHLine(0, 63, 128);

    u8g2.drawVLine(0, 1, 62);
    u8g2.drawVLine(127, 1, 62);

    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.drawStr(4, 27, "Hola Mundo!");

    //    u8g2.drawStr(4,48,"Hola Nacho!");

    u8g2.drawCircle(110, 31, 10);
    u8g2.drawBox(30, 40, 15, 15);

  } while (u8g2.nextPage());

  //   u8g2.sendBuffer();
  //   u8g2.clearBuffer();

  // delay(3000);
}

El resultado es:

U8g2Lib debe tener cargada la dirección por defecto para ese controlador de pantalla.

He estado buscando dentro de la librería a ver si encontraba algo que hiciese referencia a direcciones y no he sido capaz de encontrar nada :sleepy_face:

Modifica el escáner de direcciones. El típico escáner solo tiene en cuenta dos sucesos: 0=exito y 4=error e ignora las otras posibles respuestas

  • 0: success.

  • 1: data too long to fit in transmit buffer.

  • 2: received NACK on transmit of address.

  • 3: received NACK on transmit of data.

  • 4: other error.

  • 5: timeout

Gracias @PeterKantTropus, lo probaré y comentare los resultados