Reloj con WS2812B LEDs direccionable Arduino

Reloj en tira de LED direccionable WS2812B 5v y Arduino Nano con control y posibilidad de configuración desde un smartphone a través del módulo Bluethoot HC-05. Hemos presentado en esta página un proyecto de reloj sobre matriz direccionable con módulo de reloj en tiempo real RTC S1302, sensor de temperatura y humedad DHT11 (DHT22), así como un esquema del dispositivo, un programa para placa Arduino y una aplicación para smartphone.

Para esta actividad necesitaremos:

En este proyecto se muestran la hora actual, la fecha, la temperatura del aire y un teletipo con un mensaje en la matriz de LED direccionable ws2812b. Por defecto, el reloj muestra la inscripción «HELLO WORLD» , la inscripción se puede cambiar o desactivar completamente en el programa o a través de la aplicación para smartphone. También puede ajustar la hora, la fecha y calibrar el sensor de temperatura DHT11 en la aplicación Android para smartphone.

Reloj en la tira LED WS2812B y Arduino Nano

Reloj en tira de LED direccionable WS2812B Arduino
Reloj en tira de LED direccionable ws2812b Arduino

Para montar el proyecto es necesario hacer una carcasa para la matriz de LEDs, instalar la tira direccionable ws2812b 5v y soldarla como se muestra en el diagrama anterior. Si usted ya tiene una matriz adecuada (al menos 7 filas y 30 columnas) en LEDs ws2812b, pero el esquema de su montaje es diferente, también puede utilizarlo para el proyecto. Basta con cambiar en el programa los parámetros de conexión de la matriz al microcontrolador Arduino.

Esquema de montaje del reloj en la LED WS2812B

Esquema de montaje del reloj en la tira de LED direccionable ws2812
Esquema de montaje del reloj en la tira de LED direccionable ws2812

Se puede utilizar una única fuente de alimentación de 5V con corriente suficiente para alimentar la tira de LEDs, así como el microcontrolador con todos los sensores y módulos. La tira de direcciones se conecta al puerto 9 del Arduino a través de una resistencia de 200-400 ohmios para proteger la salida de la quema. El módulo de tiempo real RTC DS1302 y el bluetooth HC-05 están conectados de acuerdo con el diagrama publicado anteriormente.

Programme Arduino para reloj en tira de LED WS2812B

#include "SoftwareSerial.h"
SoftwareSerial hc05Serial(3, 2);

// biblioteca para sensor de temperatura
#include "DHT.h"
DHT dht(A3, DHT11);

// biblioteca para módulos de reloj
#include "iarduino_RTC.h"
iarduino_RTC time (RTC_DS1302, 5, 7, 6); // DS1302
// iarduino_RTC time (RTC_DS1307);       // DS1307 i2C
// iarduino_RTC time (RTC_DS3231);       // DS3231 i2C

// biblioteca para matriz de LED
#include "Adafruit_GFX.h"
#include "Adafruit_NeoMatrix.h"
#include "Adafruit_NeoPixel.h"

#define WIDTH 30   // anchura de la matriz en píxeles
#define ROWS 7     // altura de la matriz en píxeles
#define LED_PIN 9 // pin para conectar la cinta de direcciones

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(WIDTH, ROWS, 1, 1, LED_PIN,
                            NEO_MATRIX_RIGHT     + NEO_MATRIX_BOTTOM +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

bool showingdata = 1; // mostrar fecha - sí (1) / no (0)
bool showingtemp = 1; // mostrar temperatura - sí (1) / no (0)
bool showingtext = 1; // mostrar mensaje - sí (1) / no (0)

int delta = 0; // coeficiente para calibrar el sensor de temperatura
int brightness = 250; // brillo de los LED (máximo 250)
int demo = 30; // cuántos segundos para dar la hora

// configuración por defecto de fecha y hora
int hour = 20;
int minute = 42;
int day = 26;
int month = 10;
int year = 23;
int week = 4;

String text = "HELLO WORLD!";
int extent = text.length();

byte w, v, m;
int x, t, line;
char val;
String str, message;

unsigned long currentMillis;

void setup() {
  matrix.begin();
  // configuración de la paleta de colores de la cinta de direcciones
  matrix.setTextColor(matrix.Color(0, 50, 255));
  matrix.setTextWrap(false);
  matrix.setBrightness(brightness);
  matrix.fillScreen(0);
  matrix.show();

  hc05Serial.begin(9600);
  hc05Serial.flush();

  dht.begin();
  time.begin();
  currentMillis = millis();
}

void clocksetting() {
  line = message.length();

  message = str;
  message.remove(2, 8);
  hour = message.toInt();

  message = str;
  message.remove(0, 2);
  message.remove(2, 6);
  minute = message.toInt();

  message = str;
  message.remove(0, 4);
  message.remove(2, 4);
  day = message.toInt();

  message = str;
  message.remove(0, 6);
  message.remove(2, 2);
  month = message.toInt();

  message = str;
  message.remove(0, 8);
  year = message.toInt();

  time.settime(0, minute, hour, day, month, year, 4);

  matrix.fillScreen(0);
  matrix.setCursor(0, 0);
  matrix.print(time.gettime("H:i"));
  matrix.show();
  delay(2000);

  matrix.fillScreen(0);
  matrix.setCursor(0, 0);
  matrix.print(time.gettime("d.m"));
  matrix.show();
  delay(2000);

  str = "";
  message = "";
  hc05Serial.flush();
  w = 1;
}

void sensorsetting() {
  message = str;
  delta = message.toInt();

  matrix.fillScreen(0);
  matrix.setCursor(0, 0);
  matrix.print("d=");
  matrix.print(delta);
  matrix.show();
  delay(2000);

  str = "";
  message = "";
  hc05Serial.flush();
  w = 1;
}

void textsetting() {
  text = str;
  extent = text.length();

  if (extent == 0) { showingtext = 0; }
  if (extent > 0) { showingtext = 1; }

  matrix.fillScreen(0);
  matrix.setCursor(0, 0);
  matrix.print(text);
  matrix.show();
  delay(2000);

  str = "";
  message = "";
  hc05Serial.flush();
  w = 1;
}

void stopsetting() {
  matrix.fillScreen(0);
  matrix.setCursor(0, 0);
  matrix.print("Save");
  matrix.show();

  delay(2000);
  w = 0;
}

// visualizar fecha, temperatura y mensaje
void demonstration() {
  for (byte i = brightness; i > 0; i = i - 2) {
    matrix.setBrightness(i);
    matrix.fillScreen(0);
    matrix.setCursor(0, 0);
    matrix.print(time.gettime("H:i"));
    matrix.show();
    delay(5);
  }

  while (showingdata == 1) {
    for (byte i = 0; i < brightness; i = i + 2) {
      matrix.setBrightness(i);
      matrix.fillScreen(0);
      matrix.setCursor(0, 0);
      matrix.print(time.gettime("d.m"));
      matrix.show();
      delay(5);
    }

    delay(200);

    for (byte i = brightness; i > 0; i = i - 2) {
      matrix.setBrightness(i);
      matrix.fillScreen(0);
      matrix.setCursor(0, 0);
      matrix.print(time.gettime("d.m"));
      matrix.show();
      delay(5);
    }
    break;
  }

  while (showingtemp == 1) {
    for (byte i = 0; i < brightness; i = i + 2) {
      matrix.setBrightness(i);
      matrix.fillScreen(0);
      matrix.setCursor(4, 0);
      matrix.print(t);
      matrix.print("'C");
      matrix.show();
      delay(5);
    }

    delay(200);

    for (byte i = brightness; i > 0; i = i - 2) {
      matrix.setBrightness(i);
      matrix.fillScreen(0);
      matrix.setCursor(4, 0);
      matrix.print(t);
      matrix.print("'C");
      matrix.show();
      delay(5);
    }
    break;
  }

  while (showingtext == 1) {
    matrix.setBrightness(brightness);
    for (int i = WIDTH; i > (0 - extent * 6); i--) {
      matrix.fillScreen(0);
      matrix.setCursor(i, 0);
      matrix.print(text);
      matrix.show();
      delay(100);
    }
    break;
  }

  for (byte i = 0; i < brightness; i = i + 2) {
    matrix.setBrightness(i);
    matrix.fillScreen(0);
    matrix.setCursor(0, 0);
    matrix.print(time.gettime("H:i"));
    matrix.show();
    delay(5);
  }
}

void loop() {
// si bluetooth está conectado - espere el comando
  if (hc05Serial.available()) {
    val = hc05Serial.read();
    if (val == '@') { hc05Serial.flush(); w = 1; }
  }

// según el mando - ir a los ajustes deseados
  while (w == 1) {
    matrix.fillScreen(0);
    matrix.setCursor(0, 0);
    matrix.print("Setup");
    matrix.show();

    if (hc05Serial.available()) {
      val = hc05Serial.read();
      if (val == '&') { clocksetting(); break; }
      if (val == '%') { sensorsetting(); break; }
      if (val == '$') { textsetting(); break; }
      if (val == '*') { stopsetting(); break; }
      str = str + val;
    }
  }

// si ha transcurrido 1 segundo - actualiza la hora
  if (millis() - currentMillis > 900) {
    matrix.fillScreen(0);
    matrix.setCursor(0, 0);
    matrix.print(time.gettime("H:i"));
    matrix.show();
    currentMillis = millis();
    m++;
  }

// si han transcurrido segundos - mostrar fecha y temperatura
  if (m > demo) {
    m = 0;
    t = dht.readTemperature() + delta;
    demonstration();
  }
}

Explicación del código para reloj Arduino en WS2812B y Bluetooth módulo:

  1. Ajustes del reloj: la fecha y la hora actual, la calibración del sensor de temperatura y las letras del teletipo se pueden cambiar en el boceto o a través de la aplicación si no se te da bien programar;
  2. los ajustes de fecha y hora se realizan a través de la aplicación.

Aplicación para ajustar el reloj de la matriz WS2812

Aplicación para Reloj con WS2812B LEDs direccionable
Aplicación para Reloj con WS2812B LEDs direccionable

Después de montar el circuito y descargar el programa en el microcontrolador, instala la aplicación en tu smartphone Android (el enlace de descarga aparece al principio del artículo). Una vez emparejado con el módulo Bluetooth, abre la aplicación Matrix_Clock.apk y conéctate al Arduino. Si la conexión se ha realizado correctamente, Matrix mostrará «Setup» – esto significa que has entrado automáticamente en el modo de configuración del reloj ws2812b.

Ahora puedes, sin necesidad de conocer el lenguaje de programación de la placa Arduino, ajustar la hora y la fecha deseadas en el reloj, así como escribir un mensaje de texto que aparecerá como ticker. El brillo de los LEDs, así como el tono de color de la tira de direcciones, sólo se pueden cambiar en el sketch a través del ordenador. También puede especificar en el programa qué información debe aparecer y cuál no (fecha, temperatura, mensaje).

Conclusión. El proyecto de reloj con tira de LED direccionable WS2812 se puede desarrollar sin fin, por ejemplo, añadir la función de ajuste de brillo y color mediante botones conectados a la microcontrolador Arduino Nano o con la ayuda de la aplicación Android. Si se desconecta la alimentación del microcontrolador, la hora del reloj no se perderá, ya que el módulo de tiempo real RTC DS1302 con fuente de alimentación autónoma se encarga de ello.


Deja una respuesta

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