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:
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:
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).
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
Basado en la respuesta anterior.
Mueva la resistencia de la posición R3 a R1.
Conectar R8.
Resultado:
Ejemplo de uso:
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)
{
}
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!
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:
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
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 :)
Rogelio Rowland
cristiano