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.
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
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