SSD1306 Display Conexión SPI o I2C (Según resistencias)

Compré una de esas pantallas OLED baratas de 0.96 "de China, eBay. En la descripción del producto dice que es una pantalla I2C, Ebay Link . Quiero usarla con un ATmega8.

Lo conecté de acuerdo con los tutoriales que encontré en línea:

  • Pin1, TIERRA: TIERRA
  • Pin2, VCC: VCC (3,3 V)
  • Pin3, D0: Pin28, SCL (Pullup a 5V)
  • Pin4, D1: Pin27, SDA (Pullup a 5V)
  • Pin5, PRIMERA, PORTB.0
  • Pin6, CC: PORTB.2
  • Pin7, CS: PORTB.1

y este es mi código (99% igual que en la página de github de la biblioteca):

#define F_CPU 1000000
#include <util/delay.h>
#include <stdint.h>
#include "libs/SSD1306.h"

int main(void){

    DDRB=0xFF;
    DDRC=0xFF;


    PORTB = PORTB & ~(1<<PB0);
    PORTB = PORTB & ~(1<<PB1);
    PORTB = PORTB | (1 << PB0);
    _delay_ms(100);

    // This is our buffer
    // Each byte = 8 pixels on the screen
    uint8_t buffer[1024];

    // Only two lines of code to initiate the driver
    // and to send our framebuffer
    SSD1306 myDisplay;
    PORTB = PORTB | (1 << PB2);
    myDisplay.sendFramebuffer(buffer);

    PORTB = PORTB & ~(1<<PB2);
    // Hardware function to reverse the pixels
    // (swap black and white pixel)
    myDisplay.invert(1);
    // Revert back to normal display
    myDisplay.invert(0);

    return 0;
}

Uso (o quiero usar) esta biblioteca: Github Solo porque la encontré y pensé que se veía bien, podría usar otra también.

Lo que comprobé hasta ahora es:

  • Las conexiones de cable están bien y como se describe arriba
  • El reloj del sistema es de 1 MHz
  • Probé otra pantalla

En todos los casos, la pantalla permanece oscura y negra, ni siquiera un parpadeo.

Cuando miré la parte trasera de la pantalla, pensé que la descripción era extraña (ver la imagen adjunta).Parte trasera de la pantalla

Está escrito que para la conexión IIC se necesitaría conectar las resistencias R1, R4, R6, R7 y R8, mientras que en realidad solo se conectan R3, R4, lo que correspondería a la conexión SPI. ¿Estoy malinterpretando algo o la descripción de eBay era incorrecta?

¿Alguien puede ayudarme? Saludos amables

Me parece que está configurado para SPI de 4 hilos, y la descripción de eBay dice tanto I2C como serial, pero en la descripción describe el pinout como SPI (D0: CLK, D1: MOSI).
Gracias. ¡Al confirmar mi sospecha, me guiaste por el camino correcto! Agregué una respuesta solo para todos los que me siguen con el mismo problema;)

Respuestas (4)

Basado en la respuesta anterior.

  1. Mueva la resistencia de la posición R3 a R1.

  2. Conectar R8.

Resultado:

ingrese la descripción de la imagen aquí

Ejemplo de uso:

ingrese la descripción de la imagen aquí

Código (boceto):

#include <Arduino.h>
#include <U8x8lib.h>     //Using u8g2 library

U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(  /* clock=*/ 12,   /* data=*/ 11, /* reset=*/ U8X8_PIN_NONE);   // OLEDs without Reset of the Display

void setup(void)
{
  u8x8.begin();
  u8x8.setPowerSave(0);

  u8x8.setFont(u8x8_font_pxplusibmcgathin_f);
  u8x8.drawString(0,0,"Hello World 209!");
  u8x8.drawString(0,3,"1234567890123456");
  u8x8.drawString(0,7,"Hello World 209!");
}

void loop(void)
{
}
Gracias. También tengo uno de estos OLED y pude convertirlo a I2C siguiendo sus instrucciones. ¡Un montón más de pines liberados!

Ha pasado un tiempo, pero aquí está mi respuesta:

Como ya se dio cuenta, esta pantalla está configurada para SPI de 4 hilos. ¡Pero si necesita guardar algunos pines, puede volver a soldarlos a I2C! Para hacerlo, debe volver a soldar la resistencia de la posición R3 a R1. Luego, debe acortar R8 con un poco de estaño de soldadura (resistencia de 0 ohmios). R6 y R7 (pullups) ya están soldados, no hay nada que hacer aquí.

¡Ahora su pantalla es compatible con I2C! El CS Pin no es necesario, sugiero conectarlo a GND. El pin DC selecciona la dirección. Para una dirección estándar, conéctelo a GND. Cuidado con el pin RES. Necesita un pulso bajo en el arranque y alto voltaje durante la operación (como en el modo SPI). Sugiero un límite de 100nF para GND y una resolución de 10k para VCC, ¡funciona de maravilla!

y r8? También está desaparecido.

Entonces, gracias a Roger Rowland, lo descubrí. La pantalla es una pantalla SPI, aunque la página de eBay dice otra, y logré que funcionara así:

Conexiones:

  • Pin1: TIERRA -> TIERRA
  • Pin2: VCC -> VCC
  • Pin3: D0 -> PORTB.5 (Reloj, SCK)
  • Pin4: D1 -> PORTB.3 (Datos, MOSI)
  • Pin5: Res -> PB0
  • Pin6: CC -> PB1
  • Pin7: CS -> PB2

Luego usé la biblioteca u8glib con el siguiente código:

#define F_CPU 1000000

#include "lib/u8g.h"
#include <avr/interrupt.h>
#include <avr/io.h>

u8g_t u8g;

void draw(void){
    u8g_SetFont(&u8g, u8g_font_6x10);
    u8g_DrawStr(&u8g, 0, 15, "Hello World!");
}

void u8g_setup(){
    u8g_InitHWSPI(&u8g, &u8g_dev_ssd1306_128x64_hw_spi, PN(1, 2), PN(1, 1), PN(1, 0)); 
}


int main(void)
{
    DDRB=0xFF;

    u8g_setup();

    for(;;){
        u8g_FirstPage(&u8g);
        do{
            draw();
        } while ( u8g_NextPage(&u8g) );
        u8g_Delay(100);
    }       
}

Y ahora la pantalla funciona a las mil maravillas =) Gracias y saludos

cristiano

ingrese la descripción de la imagen aquí

SPI es más rápido

Reloj D0-----------10 SCL, CLK, SCK

D1-----------9 SDA, Datos MOSI

RES----------13 RST,RESET Resto

DC------------11 A0 Datos/Comando

CS-----------12 Selección de chips

VCC----------5V

TIERRA----------TIERRA

Adafruit Library utiliza esta conexión, no se necesita ningún componente adicional. Si obtiene "Altura incorrecta, corrija Adafruit_SSD1306.h!" error. agregue esta línea justo encima del código de advertencia #define SSD1306_LCDHEIGHT 64

La biblioteca u8glib es incluso mejor para este dispositivo y más rápida. Use los mismos pines SPI que Adafruit. En el código, no seleccione ningún dispositivo de la lista, pero agregue esta línea para este dispositivo y pines. U8GLIB_SSD1306_128X64 u8g(10, 9, 12, 11, 13);

Trabaja bien y rápido :)

ingrese la descripción de la imagen aquí