Autor Tema: Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )  (Leído 8294 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jaio21

  • PIC10
  • *
  • Mensajes: 33
Saludos a todos.. y espero la comunidad pueda ayudarme con esto

tengo esta pantalla


En cierto modo o nose si es por mi poca experiencia pero encuentro la libreria "u8g" algo limitada... y me gustaria usar esta pantalla con la libreria Adafruit.

He estado intentando usar la libreria Adafruit con mi pantalla SSD1306 de 128x64 (i2c) obviamente de 4 pines GND-VCC-SCL-SDA como se ve en la imagen.... y usando el Codigo de ejemplo de la libreria llamado ssd1306_128x64_i2c.ino ya configure el Ancho de pantalla como solicita el codigo:

#define SSD1306_I2C_ADDRESS   0x3D  //<<< Seleccion de 128x64
// Address for 128x32 is 0x3C
// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)

   #define SSD1306_128_64  //<<< Seleccion de 128x64
//   #define SSD1306_128_32
//   #define SSD1306_96_16

Compilo el codigo y no arroja errores ni nada parecido pero igual en la pantalla no muestra nada y con la libreria "u8g" si trabaja sin problema..

entonces me pregunto q estoy haciendo mal...

Podrian ayudarme con esto?

Gracias de antemano...
El Ingenio humano no tiene limites, se obtiene a través del tiempo y aprendiendo de nuestros propios errores....

Javier Iriarte

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #1 en: 02 de Abril de 2016, 20:49:58 »
entonces me pregunto q estoy haciendo mal...

Con una honestidad brutal y que espero que no te ofendas..

Lo que estas haciendo mal es probar librerias y no ver que hay dentro, tranquilamente podrias ver el codigo de ambos y ver en que se diferencian, Asi tambien como hacen las cosas.

Casi siempre existe una funcion de inicio, de envio de comando, de envio de instrucion, recepcion. Eso lo tenes en ambos y todo lo demas del codigo termina siendo un agregado a la libreria, como escribir texto, lineas, etc. Lo cual si por ejemplo te funciona lo de u8g, podrias tomar el codigo de adafruit de lo que necesites y adaptarlo al de u8g cambiando un par de nombre de funciones.

Desconectado jaio21

  • PIC10
  • *
  • Mensajes: 33
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #2 en: 02 de Abril de 2016, 21:56:57 »
Con una honestidad brutal y que espero que no te ofendas..

Para nada me ofende amigo pues soy novato en esto de arduino y apenas ando haciendo practicas y algunos proyectos de hobby... y gracias por el dato y ciertamente probare lo q dices.. tratar de migrar parte de un codico a otro pues solo e programado con Visualbasic y mikrobasic de PIC... y desconosco en gran parte el lenguaje C

algo q noto q no me gusta de la libreria u8g es q para escribir en pantalla tengo q abrir un "Void" para poder escribir en pantalla y note q con la libre dia de "Adafruit" puedo escribir en cualquier parte del codigo...

Como punto adicional entiendo q u8g y Adafruit son librerias hechas para trabajar con la la misma bases del lenguaje C pero de igual forma me gustaria me ayudaran para poder hacer arrancar la libreria adafruit y mi pantalla (SSD1306 128x64 i2c 4pines)
El Ingenio humano no tiene limites, se obtiene a través del tiempo y aprendiendo de nuestros propios errores....

Javier Iriarte

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #3 en: 02 de Abril de 2016, 23:28:25 »
.

Si ambas librerías son para el mismo controlador de pantalla, entonces caben dos posibilidades, no estás usando correctamente la librería de Adafruit o esa librería está usando otros pines para IC2.

No uso Arduino, pero un micro puede tener varios puertos I2C, SPI, Can bus, etc... si ese micro tiene por ejempo dos o tres puertos I2C, puede que la librería de Adafruit use un puerto I2C diferente al que usas en tu librería, y que estaría asignado a pines distintos del microcontrolador.

Para eso tendrías que leer el código fuente de ambas y ver que pines está usando cada una para gestionar I2C.

También tendrías que mirar que funciones tiene cada librería, probablemente haya una función inicial de configuración del puerto que debas de llamarla en tu main().


Desconectado jaio21

  • PIC10
  • *
  • Mensajes: 33
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #4 en: 02 de Abril de 2016, 23:38:33 »
.

Si ambas librerías son para el mismo controlador de pantalla, entonces caben dos posibilidades, no estás usando correctamente la librería de Adafruit o esa librería está usando otros pines para IC2.

No uso Arduino, pero un micro puede tener varios puertos I2C, SPI, Can bus, etc... si ese micro tiene por ejempo dos o tres puertos I2C, puede que la librería de Adafruit use un puerto I2C diferente al que usas en tu librería, y que estaría asignado a pines distintos del microcontrolador.

Para eso tendrías que leer el código fuente de ambas y ver que pines está usando cada una para gestionar I2C.

También tendrías que mirar que funciones tiene cada librería, probablemente haya una función inicial de configuración del puerto que debas de llamarla en tu main().

En arduino las librerias  vienen con ejemplos ya operativos el arduino q estoy usando es el Arduino UNO y NANO... el nano usa i2c por los pines A4(SDA) y A5(SCL) el UNO tiene los pines  SDA y SCL separados pero igual en ninguno de los 2 funciona la libreria ADAFRUIT y el mismo circuito funciona para ambas librerias...


Lo q si noto es q la libreria "u8g" es q si tiene para seleccionar el tipo de controlador en mi caso SSD1306 de 128x64 encambio la libreria "Adafruit" no como comento el compañero KILLERJC tengo q ver el codigo fuente de la libreria y ver como es esta libreria mas a profundida
El Ingenio humano no tiene limites, se obtiene a través del tiempo y aprendiendo de nuestros propios errores....

Javier Iriarte

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #5 en: 02 de Abril de 2016, 23:45:25 »
Ahora que decis que no tenes conocimientos en C, cualquier cosa podes poner el link a las librerias ( u8g y adafruit ) y asi indicarte masomenos que debes realizar para que la libreria "u8g" funcione como vos queres.

Desconectado jaio21

  • PIC10
  • *
  • Mensajes: 33
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #6 en: 02 de Abril de 2016, 23:55:41 »
Ahora que decis que no tenes conocimientos en C, cualquier cosa podes poner el link a las librerias ( u8g y adafruit ) y asi indicarte masomenos que debes realizar para que la libreria "u8g" funcione como vos queres.

Inicialmente baje la libreria "Adafruit_SSD1306" https://github.com/adafruit/Adafruit_SSD1306 pero al compitar me daba error decia q fataba la el archivo Adafruit_GFX.h luego descargue la libreria "Adafruit_GFX" pero por ser otra libreria no funcionaba  asi q a la primera libreria la Adafruit_SSD1306 le copie el archivo q faltaba y asi fue q empeso a compilar normalmente sin errores..  :?

pero como nunca me funciono descargue para trabajar mientras tanto con la libreria "u8g" https://code.google.com/archive/p/u8glib/

Con esta no tengo problemas ya q conozco todoas las referencias de su libreria..
El Ingenio humano no tiene limites, se obtiene a través del tiempo y aprendiendo de nuestros propios errores....

Javier Iriarte

Desconectado jaio21

  • PIC10
  • *
  • Mensajes: 33
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #7 en: 03 de Abril de 2016, 00:39:14 »
Amigos  :-/

Ya consegui cual fue el problema, ya pude hacer funcional la libreria...

era la direccion de la OLED;

en el codigo de ejemplo dice lo siguente....

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)

es decir iniciar el I2C con la direccion 0x3D para la OLDE de 128x64

y en la libreria "Adafruit_SSD1306.h" dice esto;

#define SSD1306_I2C_ADDRESS   0x3D  // 011110+SA0+RW - 0x3C or 0x3D
// Address for 128x32 is 0x3C
// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)

Osea:

para la pantalla de 128x32 usar la direccion 0x3C
y para la pantalla de 128x64 usar la direccion 0x3D (por defecto) o 0x3C (si SA0 esta a Tierra)

entonces me doy la solucion a mi mismo jeje pues simplemente use la direccion 0x3C, eso quiere decir q mi OLED de 128x64 usa el SA0 a tierra. aunq penosamente digo q no se q es el SA0 imagino q debe de ser un pin de la pantalla en el circuito interno.

asi q cambien el valor y listo ya la pantalla funciona normalmente...

De todos modos Graciasa todos por responder SALUDOS.  ;)  :mrgreen:
El Ingenio humano no tiene limites, se obtiene a través del tiempo y aprendiendo de nuestros propios errores....

Javier Iriarte

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #8 en: 03 de Abril de 2016, 01:02:09 »
Bueno me alegro que encontraras el problema.

Luego de buscar veo el por que no te funciona el de Adafruit, Si o Si necesitas la libreria Adafruit GFX, ya que todo lo que hace Adafruit usa esa libreria parece

https://github.com/adafruit/Adafruit-GFX-Library

Por que la clase tiene como base a esta libreria, y encima esta libreria tiene como base a Print, que es la que permite el uso de display.PrintIn(). En resumen, si quisieras ver como agregarle algo a u8g deberias tomarlo de la libreria GFX, bastante complejo, encima es algo posible en C++, que es el unico que tiene clases.

Creo que vos queres hacer eso con la otra libreria, es decir poner Escribir("djsaljdas"); y tenerlo escrito. Pero u8g esta escrito en C y no C++ asi que el traspaso no va a ser directo. Es posible tambien, pero tal ves necesites hacer si o si la funcion de escritura.

No lo veo nada facil de realizar cuando todo esta tan entrelazado asi. Y mas cuando son 2 lenguajes tan distintos.

PD. en u8g el texto es asi:

  u8g.print("Hello World!");

Citar
algo q noto q no me gusta de la libreria u8g es q para escribir en pantalla tengo q abrir un "Void" para poder escribir en pantalla y note q con la libre dia de "Adafruit" puedo escribir en cualquier parte del codigo...

Podrias marcar la diferencia con un pedazo de codigo de cada uno ?

Ya que lo unico que vi en los ejemplos lo que hicieron fue simplemente crear una funcion aparte, que tranquilamente no lo podrian haber realizado.

Desconectado jaio21

  • PIC10
  • *
  • Mensajes: 33
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #9 en: 03 de Abril de 2016, 01:20:00 »
PD. en u8g el texto es asi:

  u8g.print("Hello World!");

Citar
algo q noto q no me gusta de la libreria u8g es q para escribir en pantalla tengo q abrir un "Void" para poder escribir en pantalla y note q con la libre dia de "Adafruit" puedo escribir en cualquier parte del codigo...

Podrias marcar la diferencia con un pedazo de codigo de cada uno ?

Ya que lo unico que vi en los ejemplos lo que hicieron fue simplemente crear una funcion aparte, que tranquilamente no lo podrian haber realizado.


Claro debi explicarme mejor... en la libreria "u8g" para imprimir en pantalla no puedo hacerlo directamente dentro del Void Loop()

Ejmeplo de como quiciera q fuese pero no lo hace:

void loop (void){           //ciclo de (loop)

     u8g.setColorIndex(1);                                      //Definir Color de pantalla en mi caso 1 para la pantalla monocromatica
     u8g.setFont(u8g_font_timB08);                   // Definir tipo de letra
     u8g.drawStr( 40, 10, "Cargando...");             //Texto a imprimir en pantalla
     u8g.drawBitmapP( 0, 0, 16, 64, logo_bmp);  // Imagen BP de 128x64 a imprimir en pantalla

}

en cambio tengo q hacer esto para q funcione:

void loop (void){           //ciclo de (loop)

       u8g.firstPage();
        do {
                LOGO();        // llamado para el Void LOGO..
       } while( u8g.nextPage() );


}


    void LOGO(void){

     u8g.setColorIndex(1);                                      //Definir Color de pantalla en mi caso 1 para la pantalla monocromatica
     u8g.setFont(u8g_font_timB08);                   // Definir tipo de letra
     u8g.drawStr( 40, 10, "Cargando...");             //Texto a imprimir en pantalla
     u8g.drawBitmapP( 0, 0, 16, 64, logo_bmp);  // Imagen BP de 128x64 a imprimir en pantalla

    }

osea para escribir en la pantalla tengo q obligatoriamente agregar:

       u8g.firstPage();
                   //Escribir codigo de los datos antes de imprimir en pantalla para evitar una mala escritura de los caracteres
        do {
                   //Aqui escribir mas codigo o el llamado al Void q contendra los datos a escribir de la pantalla
       } while( u8g.nextPage() );

por eso no me gusta mucho esta libreria..
« Última modificación: 03 de Abril de 2016, 01:25:42 por jaio21 »
El Ingenio humano no tiene limites, se obtiene a través del tiempo y aprendiendo de nuestros propios errores....

Javier Iriarte

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #10 en: 03 de Abril de 2016, 02:05:55 »
Entiendo a que te referis ahora. Realmente no se por que habran realizado eso de firstPage y lo de los demas.  No mire el codigo exactamente para ver que hace pero lo que me puedo imaginar es que rellena un buffer y luego lo escribe.

Desconectado jaio21

  • PIC10
  • *
  • Mensajes: 33
Re:Libreria Adafruit para la pantalla SSD1306 128x64 de 4 pines ( i2c )
« Respuesta #11 en: 03 de Abril de 2016, 02:22:30 »
exactamente lo mismo imagine sobre los  u8g.firstPage(); a diferencia de Adafruit que es mas directo para imprimir en pantalla este es el codigo q acabo de probar y funiona para hacer lo mismo del codigo de ejemplo anterior;

void loop() { 

  display.setTextSize(1);                                             // tamaño del texto
  display.setTextColor(WHITE);                                  // Color del texto
  display.setCursor(42,0);                                           //Posicion del texto
  display.print("Cargando...");                                     //Texto a imprimir
  display.drawBitmap(0, 0,  logo_BMP, 128, 64, 1); //imprimir imagen BMP de 128x64
  display.display();                                                        //Actualizar imagen
  delay(1000);                                                               //Espero 1 segundo
  display.clearDisplay();                                               // limpio la pantalla "Borrar"
 
}
El Ingenio humano no tiene limites, se obtiene a través del tiempo y aprendiendo de nuestros propios errores....

Javier Iriarte


 

anything