Display OLED en Arduino

Para los que no sepáis que es Arduino, se trata de una placa electrónica programable, es decir, un circuito electrónico al que le conectaremos otros componentes (sensores, leds, pulsadores o lo que convenga) y que programaremos para hacer cosas de lo más interesantes: desde un sistema de riego automático, una alarma para casa, una impresora 3D, una fresadora CNC, un tracker GPS, una estación meteorológica, etc…

Hay muchos componentes para conectar a Arduino, sensores de proximidad, pantallas, relés, shields wifi y bluetooth, etc… así que las posibilidades son infinitas.

Hoy voy a enseñaros un pequeño programa en Arduino que sirve para capturar un valor analógico, mostrarlo por pantalla y construir una barra que varíe al subir o bajar el valor, tal y como se ve en el vídeo:

En esta practica he usado un potenciómetro para capturar el valor analógico, pero se podría conectar un sensor de luz, un medidor de humedad, de temperatura, un cuenta revoluciones, etc… y mostrarlo por pantalla.

(por cierto, en el vídeo no hagáis caso de los leds, pulsadores y resistencias que hay en la protoboard, son de otro montaje y están desconectados) Para este este montaje solo hace falta el display OLED, un potenciómetro de 10k y un arduino uno.

Aquí teneis el sketch (código para arduino):

Código
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);  // I2C / TWI
int analogPin = A0;// Pin que captura el voltaje (potenciómetro)
float voltaje;      //Variable que guarda el valor recibido del potenciómetro
int longitud;   //Variable que guarda la longitud de la barra indicadora, calculada a partir del voltaje de entrada en A0

void draw(void) {//Función dibujar
  u8g.setColorIndex(1);
  u8g.setFont(u8g_font_profont22);//Seteo el tipo de letra y tamaño
  u8g.setPrintPos(0, 20); //Defino el pixel donde escribiré, X=0 Y=20
  u8g.print(voltaje); //Escribo la variable voltaje
  u8g.setPrintPos(65, 20); //Defino el pixel donde escribiré X=65 Y=20
  u8g.print("Volts");//Escribo el texto Volts
  u8g.drawBox(0,32,longitud,25); //Mediante la función drawBox dibujo una barra horizontal en la posición X=0, Y=32, con una largada definida por el valor de la varible longitud y una altura de 25 pixeles
}
void loop(void) {
voltaje = analogRead(analogPin);   // Hago la lectura analógica y lo guardo en el variable voltaje
voltaje = map(voltaje,0.0,1023,0,500); //Mediante la función map calculo proporcionalmente el voltaje según el valor recibido. Más abajo lo explico con más detalle 
voltaje =voltaje /100.00;
longitud=map(voltaje,0,5,0,128); //vuelvo a usar map para calcular proporcionalmente la longitud en función del voltaje
//Loop para mostrar el display
u8g.firstPage(); 
do {
draw();//funcion que he definido antes
} while( u8g.nextPage() );
// recargo la imagen pasado 50 milisegundos
delay(50);
}

Explicación del código

Como veis en el programa, he ido explicando lo que hago en cada linea, pero hay un par de fragmentos que merecen un poco más de explicación:

Función map

Según la escueta documentación oficial la función map tiene esta sintaxis:

map(value, fromLow, fromHigh, toLow, toHigh)

Sirve para calcular proporcionalmente un valor en función de otro valor recibido. Por ejemplo si yo recibo una variable llamada voltaje que puede ir de 0 a 1023, y la quiero transformar proporcionalmente en otra que va de 0 a 5, seria así:

map(voltaje,0,1023,0,5);

¿Y por que va de 0 a 1023? Pues porque se corresponde a 10bits, es decir 2 elevado a 10 que son 1024 posiciones ya que Arduino usa un conversor analógico-digital de 10 bits.
Ah muy bien pero ¿porque en el código del programa en vez de poner 0  has puesto 0.0 y en vez de 5 pones 500?

map(voltaje,0.0,1023,0,500);
voltaje =voltaje /100.00;

La explicación es bien sencilla, la función map solo permite trabajar con valores enteros, entonces yo lo que hago es añadirle dos ceros a los cálculos y luego dividirlo entre cien, de esta manera consigo dos decimales para tener más exactitud.

Barra indicadora

Para usar el display OLED uso la biblioteca U8glib, y dibujo la barra indicadora con:

u8g.drawBox(0,32,longitud,25);

oled-barra-gauge-arduino

Esta función lo que hace es dibujar una barra la posición X=0 Y=32 con una longitud del valor de la variable longitud y una altura de 25pixeles. Para saber la longitud, antes he de calcularla proporcionalmente en función del voltaje con esta función:

longitud=map(voltaje,0,5,0,128);

También uso la función map, pero establezco como valor máximo 128, que son los pixeles horizontales que tiene mi display OLED:

Más información sobre el uso de la biblioteca U8glib.

Aquí tenéis el esquema de conexiones:

oled

Y como siempre el coste del montaje:

TOTAL14,50 €
Display OLED6,14
Arduino UNO6,55
Potenciómetro 10K (10 unidades)1,81
Etta
Marzo 29th, 2016 at 3:04 pm

I’m shekcod that I found this info so easily.

LEAVE A COMMENT

theme by teslathemes