Display OLED I2C SH1106, Pic C Compiler

En esta sección aprenderás a programar una pantalla OLED SH1106 conectada al microcontrolador PIC mediante la comunicación I2C. El objetivo es mostrar texto y variables en la pantalla OLED enviando los datos por medio de la comunicación I2C.

Display oled SH1106

SH1106 es un controlador CMOS OLED/PLED de un solo chip con controlador para sistema de visualización gráfica de matriz de puntos de diodo emisor de luz orgánico/polimérico. SH1106 consta de 132 segmentos, 64 comunes que pueden admitir una resolución de pantalla máxima de 132 X 64. Está diseñado para panel OLED de tipo cátodo común.

SH1106 incorpora control de contraste, oscilador RAM de pantalla y convertidor DC-DC eficiente, lo que reduce la cantidad de componentes externos y el consumo de energía. SH1106 es adecuado para una amplia gama de aplicaciones portátiles compactas, como pantallas secundarias de teléfonos móviles, calculadoras y reproductores de MP3, etc.

  • Tipo: Display Oled.
  • Voltaje de Operación: 3V – 5.5V DC.
  • Resolución: 132×64 píxeles – 1.3 “.
  • Monocromo: Píxeles Blancos.
  • Driver: SH1106.
  • Interfaz: I2C, rápido 400KHz.
  • Pines:  VDD, GND, SCK y SDA.
  • Dimensiones: 35mm x 33mm x 4mm.
  • Ángulo de visión: >160º.
  • Ultra bajo consumo de energía: 0.04W Cuando están encendidos todos los píxeles.
  • Temperatura de trabajo: -40ºC ~ 85ºC.

Circuito de Conexión 

Procedimiento

Inicialmente se colocan los parámetros I2C para establecer el PIC como maestro, los pines de conexión y el identificador (STREAM) de la pantalla oled.

#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1, force_sw, stream=OLED_stream)//parametros I2C

Con la función «force_sw» se puede usar cualquier pin digital para los pines SCL y SDA.

Por ejemplo:


#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1, force_sw, stream=OLED_stream)

#use i2c(Master, Fast, sda=PIN_D0, scl=PIN_D1, force_sw, stream=OLED_stream)

#use i2c(Master, Fast, sda=PIN_A0, scl=PIN_A1, force_sw, stream=OLED_stream)
.
.
.

Se define la pantalla oled SH1106 para que la librería muestre los datos correctamente.

#define SH1106_128_64 //define el modelo de la pantalla OLED

Se coloca la librería para la pantalla oled.

#include #include "OLED_I2C.c"//Librería oled I2C

La librería se coloca en la carpeta del proyecto que se este realizando o en la carpeta de los drivers del PIC C Compiler.

Se utiliza una variable de caracteres para el texto que se mostrara en la pantalla.

char texto[128]; //variable que contendrá el texto

Se coloca la función para inicializar la pantalla.

OLED_Begin();

Se limpia la pantalla inicialmente.

OLED_ClearDisplay();

Para colocar texto en la pantalla se coloca en una función que convierte el texto en cadena para posteriormente guardar el texto en la variable creada anteriormente (texto).

sprintf(texto,"HOLA MUNDO"); 

Se utiliza la siguiente función que define la posición donde se colocara el texto (30,1), se coloca la variable que contiene la información (texto) y se coloca el tamaño letra deseada (1).

 OLED_DrawText(30,1,texto,1);

La librería de la pantalla contiene diferentes funciones para colocar diferentes formas geométricas, lineas y puntos en la pantalla. 

Una de las funciones permite colocar un rectángulo, se coloca la coordenada del punto de inicio (10,9), el ancho (105) y la altura (21).

OLED_DrawRect(10,9,105,21);

Para colocar el valor de una variable en la pantalla se coloca el tipo de variable (%Lu) dentro del texto, en este caso el valor del ADC es de 10 bits por lo que el valor máximo es de 1023, se puede definir el numero máximo de dígitos que se mostraran, evitando borrar la pantalla para actualizar el valor de la variable, por lo que se coloca (%04lu), finalmente se coloca el nombre de la variable (potenciometro).

Se coloca la posición donde se mostrara la información (14,12), se coloca la variable que contiene la información (texto) y finalmente el tamaño de letra (2).

sprintf(texto,"POT:%04lu",potenciometro); 
OLED_DrawText(14,12,texto,2);

Finalmente se coloca la función para mostrar la información en pantalla.

OLED_Display();

Código completo


#FUSES NOMCLR

#use i2c(Master,Fast, sda=PIN_B0, scl=PIN_B1, force_sw, stream=OLED_stream)//parametros I2C

#define SH1106_128_64 //DEFINE EL MODELO DE LA PANTALLA OLED

#include "OLED_I2C.c" //libreria oled I2C

void main()
{
   OLED_Begin();
   OLED_ClearDisplay();
   
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel (0);
   
   int16 potenciometro;
   char texto[128];
   while(TRUE)
   {
      sprintf(texto,"HOLA MUNDO");
      OLED_DrawText(30,1,texto,1);
      
      OLED_DrawRect(10,9,105,21);
      
      potenciometro=read_adc();
      sprintf(texto,"POT:%04lu",potenciometro);
      OLED_DrawText(14,12,texto,2);
          
      OLED_Display();//Mustra la información en pantalla;
      //TODO: User Code
   }

}
Scroll al inicio