Código de búsqueda

Código de Arduino y vídeo para pantalla OLED SSD1306 128 x 32 con I2C

Código de Arduino y vídeo para pantalla OLED SSD1306 128 x 32 con I2C

En este tutorial exploraremos cómo usar la pantalla OLED SSD1306 128 x 32 con comunicación I2C en un Arduino. El objetivo es mostrar varios elementos como texto, rectángulos y valores dinámicos como voltaje y temperatura en la pantalla. Esta configuración es ideal para proyectos que requieren una solución de visualización compacta y eficiente.

SSD1306 OLED 128x32

Repasaremos los componentes de hardware necesarios, las instrucciones de cableado y el código de Arduino para poner todo en marcha. Para una guía visual, asegúrate de consultar el video que acompaña este tutorial (en el video a 00:00).

Hardware explicado

Los componentes clave para este proyecto incluyen la pantalla OLED SSD1306, que es una pantalla de bajo consumo que utiliza comunicación I2C para una conexión sencilla. La pantalla presenta una resolución de 128 x 32 píxeles, lo que la hace adecuada para mostrar texto y gráficos simples.

Para controlar la pantalla, utilizaremos la placa Arduino, que enviará comandos y datos a través de I2C. El Arduino se encarga de la lógica para mostrar la información mediante bibliotecas comoAdafruit_GFXyAdafruit_SSD1306Estas bibliotecas simplifican el proceso de comunicación y permiten dibujar fácilmente formas y texto.

Detalles de la ficha técnica

FabricanteAdafruit
Número de piezaSSD1306
Tensión lógica/E/S3.3 - 5 V
Tensión de alimentación3.3 - 5 V
Consumo actual~20 mA (típ.)
Resolución de pantalla128 x 32 píxeles
InterfazI2C
Dimensiones128 x 32 mm
Notas / variantesDisponible en varios tamaños y interfaces
  • Comprueba la dirección I2C; normalmente 0x3C para pantallas OLED.
  • Asegúrese de que la fuente de alimentación sea adecuada para evitar daños.
  • Utilice resistencias pull-up para las líneas SDA y SCL si es necesario.
  • Mantenga el cableado corto para reducir el ruido en la señal I2C.
  • Considere la disipación de calor si alimenta varios módulos.

Instrucciones de cableado

Arduino wiring for SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32

Para cablear la pantalla OLED SSD1306, primero conecte el pin VCC de la pantalla a la salida de 5V del Arduino. A continuación, conecte el pin GND a uno de los pines de tierra del Arduino. Para la comunicación I2C, conecte el pin SDA de la pantalla al pin SDA del Arduino, que es A4 en el UNO. Luego, conecte el pin SCL de la pantalla al pin SCL del Arduino, que es A5 en el UNO. Si está usando un modelo de Arduino diferente, consulte el mapeo de pines específico para SDA y SCL.

Para componentes adicionales, si tienes un LED que quieres controlar, conéctalo al pin 9 a través de una resistencia de 330 ohmios. Asegúrate de conectar el otro extremo de la resistencia al ánodo del LED, mientras que el cátodo debe ir a masa. Esta configuración permitirá que el LED se encienda cuando el pin 9 esté activado.

Ejemplos de código y guía paso a paso

En el código de Arduino, comenzamos incluyendo las bibliotecas necesarias para la pantalla OLED. Un identificador clave esdisplay, que es una instancia de laAdafruit_SSD1306clase. La pantalla se inicializa en elsetup()función, donde además limpiamos la pantalla para prepararla para el dibujo.

SSD1306 OLED 128x32
void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(2000);
  display.clearDisplay(); 
}

En elloop()función, definimos una variable de cadenavStringpara almacenar el valor del voltaje, que se actualiza dinámicamente. ElrobojaxText()La función se utiliza para mostrar texto en la pantalla en las coordenadas especificadas.

void loop() {
  String vString = String(count, 3);
  display.clearDisplay();
  robojaxText("Voltage:          ", 4, 3, 1, false);
  robojaxText(vString, 72, 3, 1, false);
  display.display();
  count += 0.173;
  delay(2000); 
}

ElrobojaxText()La función es crucial para posicionar y mostrar texto. Toma parámetros para la cadena de texto, las coordenadas x e y, el tamaño del texto y un booleano que determina si la pantalla debe actualizarse inmediatamente.

void robojaxText(String text, int x, int y, int size, boolean d) {
  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x, y);
  display.println(text);
  if(d) {
    display.display();
  }
}

Esta función establece el tamaño del texto, el color y la posición del cursor antes de imprimir el texto. Recuerda ver el video para un recorrido completo del código (en el video a las 10:00).

Demostración / Qué esperar

Cuando el código se cargue en el Arduino, la pantalla OLED debería mostrar los valores de voltaje, temperatura y capacidad, actualizándose dinámicamente cada dos segundos. También deberías ver un rectángulo dibujado alrededor de los elementos de texto. Si la pantalla no muestra nada, asegúrate de que las conexiones sean correctas y de que la dirección I2C coincida con la especificada en el código.

Marcas de tiempo del vídeo

  • 00:00- Introducción al proyecto
  • 02:00- Instrucciones de cableado
  • 05:00- Recorrido por el código
  • 10:00- Demostración del resultado

Imágenes

SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32
83-Arduino code and video for SSD1306 OLED 128 x 32 display with I2C
Idioma: C++
/*
 * Este es un ejemplo para nuestros OLEDs monocromáticos basados en controladores SSD1306.
 * 
 * Este ejemplo es para una pantalla de tamaño 128x32 utilizando I2C.
 * 
 * Si obtienes el error: Adafruit_GFX.h no encontrado, descarga la biblioteca Adafruit-GFX
 * https://github.com/adafruit/Adafruit-GFX-Library
 * 
 * Compra este módulo OLED en Amazon: https://amzn.to/36zFvTb
 * 
 * Escrito por Limor Fried/Ladyada para Adafruit Industries.
 * Licencia BSD, consulta license.txt para más información.
 * Todo el texto anterior y la pantalla de inicio deben incluirse en cualquier redistribución.
 * 
 * Mira el video para este código para aprenderlo completamente.
 * Mira el video aquí: https://youtu.be/RjyulqVsz2o
 * Este código se ofrece "tal cual" sin ninguna garantía.
 * Actualizado por Ahmad Shamshiri para el tutorial en video de Robojax.com
 * el 18 de marzo de 2018 a las 10:21 en Ajax, Ontario, Canadá.
 * Por favor, consulta otros códigos y videos de Robojax en http://robojax.com/learn/arduino
 * Si compartes este código, debes mantener esta nota de copyright.
 */
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
double count=0;

/*
 * Conexión de PIN:
 * Para ver la conexión de PIN, consulte: https://www.arduino.cc/en/Reference/Wire
 * para UNO: SDA a A4, SCL a A5
 * para Mega2560: SDA a 20, SCL a 21
 * para Leonardo: SDA a 2, SCL a 3
 * para Due: SDA a 20, SCL a 21
 * VCC a 5V
 * GND a GND :-)
 */


 // este es el Ancho y Alto del Pantalla que es 128 x 32
#define LOGO16_GLCD_HEIGHT 32
#define LOGO16_GLCD_WIDTH  128


#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()   {
  Serial.begin(9600);

 // por defecto, generaremos la alta tensión de la línea de 3.3v internamente! (¡genial!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializar con la dirección I2C 0x3C (para el 128x32)
  display.display();
  delay(2000);
 // Borra el búfer.
  display.clearDisplay();
}


void loop() {
  String vString =  String(count, 3); // usando un flotador y el
  display.clearDisplay();
  robojaxText("Voltage:          ", 4, 3, 1, false);
  robojaxText(vString, 72, 3, 1, false);
  robojaxText("V", 110, 3, 1, false);
  robojaxText("Temperature: 32C", 4, 11, 1, false);
  robojaxText("Capacity:   92.86L", 4, 21, 1, false);
 // display.dibujarLinea(1, 37, 100, 37, BLANCO);
 display.drawRect(1, 1, 126,31, WHITE);
 // display.dibujaCirculo(63,31, 31, BLANCO);
 // display.startscrollright(0x00, 0x0F);
  display.display();
  count +=0.173;
   delay(2000);
}


/*
 * robojaxText(String texto, int x, int y, int tamaño, boolean d)  
 * texto es la cadena de texto que se va a imprimir  
 * x es la posición entera x del texto  
 * y es la posición entera y del texto  
 * tamaño es el tamaño del texto, 1, 2, 3, etc.  
 * d es verdadero o falso. Si es verdadero, se actualiza la pantalla.
 */
void robojaxText(String text, int x, int y,int size, boolean d) {

  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x,y);
  display.println(text);
  if(d){
    display.display();
  }

 // delay(100);
}

Cosas que podrías necesitar

Recursos y referencias

Archivos📁

Hoja de datos (pdf)

  • SSD1306 display datasheet
    SSD1306 is a single-chip CMOS OLED/PLED driver with controller for organic / polymer light emitting diode dot-matrix graphic display system. It consists of 128 segments and 64commons. This IC is designed for Common Cathode type OLED panel. The SSD1306 embeds with contrast control, display RAM and oscillator, which reduces the number of external components and power consumption. It has 256-step brightness control. Data/Commands are sent from general MCU through the hardware selectable 6800/8000 series compatible Parallel Interface, I2C interface or Serial Peripheral Interface. It is suitable for many compact portable applications, such as mobile phone sub-display, MP3 player and calculator, etc.
    SSD1306_display_datasheet.pdf 1.79 MB

Archivo de Fritzing

  • SSD1306 128x32 OLED Wiring
    Fritzing wiring diagram for an SSD1306 128x32 OLED display, showing connections to a microcontroller (likely Arduino). Useful for breadboard prototyping and verifying I2C or SPI wiring.
    SSD1306_128x32_wiring.fzz

Wiring diagram

  • SSD1306 128x32 OLED Wiring
    Fritzing wiring diagram for an SSD1306 128x32 OLED display, showing connections to a microcontroller (likely Arduino). Useful for breadboard prototyping and verifying I2C or SPI wiring.
    SSD1306_128x32_wiring.fzz