Display OLED con sensor de Luz para Arduino

En esta entrada probamos como conectar dos elementos muy importantes, un display OLED muy pequeño y un sensor de luminosidad… En realidad por ahora podría ser cualquier sensor, la idea es desplegar los datos obtenidos en vivo del sensor y mostrarlos en el display.

Muestra de la pantalla con los datos en tiempo real
Muestra de la pantalla con los datos en tiempo real

 

El display OLED es monocromático y usa el protocolo SPI para comunicarse, el sensor TSL2561 usa I2C para connectar al Arduino Uno. La combinación de ambos es una muestra de las posibilidades que se tiene disponible para desplegar datos

 

A continuación veremos los materiales la conectividad y el programa ( o sketch en el caso de Arduino) que usamos para hacerlo posible

Materiales

  • Arduino Uno
  • Cables para conectar
  • Display OLED SSD1306 128×32 SPI
  • Sensor de luminosidad TSL2561
  • Cable USB
  • PC con Arduino IDE instalado

Conectando el Hardware

Se deben soldar los pines en el display OLED y el sensor de luminosidad

Primero conectamos el display, con el orden que se indica a continuación, se indican los pines del display y luego los del Arduino Uno

CS         12
RESET 13
DC         11
CLK      10
DATA  9
Vin       5V
GND     GND

Para el sensor de Luz, se indican los pines del sensor luego los pines del Arduino Uno

SCL   A5
SDA  A4
Vcc  3.3V
GND GND

Instalando las librerías

Las librerías que se instalan de deben bajar de los siguientes links

Para el sensor de luminosidad
https://github.com/adafruit/Adafruit_TSL2561/archive/master.zip
https://github.com/adafruit/Adafruit_Sensor/archive/master.zip

Para el display OLED
https://github.com/adafruit/Adafruit_SSD1306/archive/master.zip
https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip

Cada uno de estos archivos se descomprimen, y se dejan en la carpeta libraries, el resultado es el que se aprecia en la siguiente imagen

libraries

Se debe reiniciar el Arduino IDE para que los cambios surtan efecto.

Código para Arduino

El sketch que usamos es el siguiente y se basa en el ejemplo que aparece en Examples->Adafruit_SSD1306_master->ssd_1306_128x32_spi

/*********************************************************************
This is an example for our Monochrome OLEDs based on SSD1306 drivers

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/category/63_98

This example is for a 128x32 size display using SPI to communicate
4 or 5 pins are required to interface

Adafruit invests time and resources providing this open source code, 
please support Adafruit and open-source hardware by purchasing 
products from Adafruit!

Written by Limor Fried/Ladyada  for Adafruit Industries.  
BSD license, check license.txt for more information
All text above, and the splash screen must be included in any redistribution
*********************************************************************/

#include 
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// for luminosity sensor
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2561_U.h>
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

#define OLED_DC 11
#define OLED_CS 12
#define OLED_CLK 10
#define OLED_MOSI 9
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#define LOGO16_GLCD_HEIGHT 16 
#define LOGO16_GLCD_WIDTH  16 

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

void setup()   {                
  tsl.begin();

  // Measuring relatively bright light, so gain of 0 is reasonable
  //tsl.setGain(TSL2561_GAIN_1X);

  // Measuring relatively bright light, so short sampling time is reasonable
  //tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);

  // For low light level, comment out the above configuration and uncomment the below lines
   tsl.setGain(TSL2561_GAIN_16X);
   tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC);
  // init done

  display.display(); // show splashscreen
  delay(1000);
  display.clearDisplay();   // clears the screen and buffer

  // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("www.iot.cl");
  display.println("presenta");
  display.setTextColor(BLACK, WHITE); // 'inverted' text
  display.println("sensor de luz");
  display.display();
  delay(5000);
  display.clearDisplay();

}

void loop() {

display.setTextColor(WHITE);
display.setCursor(0,0);
display.setTextSize(2);
/* Get a new sensor event */ 
  sensors_event_t event;
  tsl.getEvent(&event);

  /* Display the results (light is measured in lux) */
  if (event.light)
  {
    display.print(event.light);
    display.setTextSize(1);
    display.println(" lux");
    display.println("");
    display.println("");
    display.println("WWW.IOT.CL");
  }
  else
  {
    /* If event.light = 0 lux the sensor is probably saturated
       and no reliable data could be generated! */
    display.setTextSize(2);   
    display.println("Sensor overload");
  }
  display.display();
  delay(250);  
  display.clearDisplay();

}

A continuacion se muestran dos pantallas con el resultado primero la pantalla inicial y luego el despliegue de los datos del sensor

displayOLED_lsensor
Pantalla inicial cuando se conecta la energía
Muestra de la pantalla con los datos en tiempo real
Muestra de la pantalla con los datos en tiempo real

Bibliografía

Tutorial OLED

Tutorial sensor de luz

Author: Manuel Carrasco

Ingeniero Eléctrico, Institutano, instructor certificado Cisco, en twitter @mcarrasco con comentarios y opiniones personales.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *