Часы на светодиодах WS2812: матрица 16×16, автояркость, разные цвета

Часы на WS2812 — эффектный проект на Arduino: светодиодная матрица 16×16 (256 диодов) или лента/гирлянда в форме змейки. Крупные цифры времени, бегущая строка по центру, автоматическая регулировка яркости от фоторезистора (днём ярко, ночью тускло), разные цвета для каждой цифры. Шрифт настраивается массивом. Точное время от DS3231. Простая сборка, минимум деталей. Идеально для декора комнаты, подарка, умного дома. Уроки Arduino, WS2812, FastLED, RTC.

Часы на светодиодах WS2812 матрица 16x16 Arduino DS3231

Зачем нужны часы на WS2812

Обычные часы — это просто цифры. WS2812 позволяют сделать их живыми: крупные цифры 5×7, плавная анимация, бегущая строка, автояркость, разные цвета для каждой цифры. Матрица 16×16 — 256 диодов — даёт чёткое изображение. Лента или гирлянда, сложенная змейкой, позволяет сделать часы любой формы и размера: гирлянда-часы, шторы-часы, часы-змейка на стене. Фоторезистор регулирует яркость: днём ярко и заметно, ночью тускло — не мешает спать. DS3231 обеспечивает точное время даже при отключении питания. Проект не только декоративный — он может быть частью умного дома: показывать температуру, уведомления, состояние датчиков. Красиво, функционально, недорого. Отличный подарок или декор для Нового года.

Компоненты проекта

  • Arduino Uno или Nano
  • Светодиодная матрица WS2812 16×16 (или лента/гирлянда 256 диодов)
  • Модуль RTC DS3231 (часы реального времени)
  • Фоторезистор + резистор 10 кОм
  • Конденсатор 1000 мкФ на питание WS2812
  • Резистор 330–470 Ом на DIN
  • Провода, макетная плата или пайка
  • Блок питания 5В 2–3 А (обязательно отдельный для ленты)

Подключение WS2812 к Arduino

Схема подключения матрицы или ленты:

  • DIN WS2812 → D6 (или любой цифровой)
  • VCC WS2812 → 5В от отдельного блока питания
  • GND WS2812 → общий GND с Arduino
  • Резистор 330–470 Ом между D6 и DIN
  • Конденсатор 1000 мкФ между 5В и GND рядом с лентой

Фоторезистор:

  • Один вывод → A0
  • Другой вывод → GND через резистор 10 кОм к 5В

DS3231:

  • VCC → 5В
  • GND → GND
  • SDA → A4
  • SCL → A5

Важно: WS2812 чувствительны к питанию. Отдельный БП 5В обязателен для 256 диодов. Общий GND между Arduino и БП.

Библиотеки

Для работы нужны две библиотеки:

  • FastLED — управление WS2812, эффекты, яркость, цвета
  • RTClib — работа с DS3231, получение точного времени

Установка: Arduino IDE → Скетч → Подключить библиотеку → Управление библиотеками. Найти и установить обе.

Шрифт и отображение цифр

Цифры рисуются массивом 5×7. Каждая цифра — 5 столбцов, 7 строк. 1 — светится, 0 — выключен. Пример массива для цифры 0:


const uint8_t font[10][5][7] = {
  { {1,1,1,1,1}, {1,0,0,0,1}, {1,0,0,0,1}, {1,0,0,0,1}, {1,0,0,0,1}, {1,0,0,0,1}, {1,1,1,1,1} }, // 0
  // ... остальные цифры 1–9
};

Функция drawDigit рисует цифру в заданной позиции (x,y) с выбранным цветом.

Автоматическая яркость

Фоторезистор → analogRead(A0) → 0–1023. map(значение, 0, 1023, 20, 255) → яркость. Днём 255 (максимум), ночью 20–50 — комфортно для сна. FastLED.setBrightness(brightness).

Скетч часов WS2812


#include <FastLED.h>
#include <RTClib.h>

#define MATRIX_WIDTH 16
#define MATRIX_HEIGHT 16
#define NUM_LEDS (MATRIX_WIDTH * MATRIX_HEIGHT)
#define DATA_PIN 6

CRGB leds[NUM_LEDS];
RTC_DS3231 rtc;

// Простой шрифт 5x7 для цифр 0–9
const uint8_t font[10][5][7] = {
  { {1,1,1,1,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,1} }, // 0
  { {0,0,1,0,0},{0,1,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,1,1,1,0} }, // 1
  { {1,1,1,1,1},{0,0,0,0,1},{1,1,1,1,1},{1,0,0,0,0},{1,1,1,1,1} }, // 2
  { {1,1,1,1,1},{0,0,0,0,1},{0,1,1,1,1},{0,0,0,0,1},{1,1,1,1,1} }, // 3
  { {1,0,0,1,0},{1,0,0,1,0},{1,1,1,1,1},{0,0,0,1,0},{0,0,0,1,0} }, // 4
  { {1,1,1,1,1},{1,0,0,0,0},{1,1,1,1,1},{0,0,0,0,1},{1,1,1,1,1} }, // 5
  { {1,1,1,1,1},{1,0,0,0,0},{1,1,1,1,1},{1,0,0,0,1},{1,1,1,1,1} }, // 6
  { {1,1,1,1,1},{0,0,0,0,1},{0,0,0,1,0},{0,0,1,0,0},{0,1,0,0,0} }, // 7
  { {1,1,1,1,1},{1,0,0,0,1},{1,1,1,1,1},{1,0,0,0,1},{1,1,1,1,1} }, // 8
  { {1,1,1,1,1},{1,0,0,0,1},{1,1,1,1,1},{0,0,0,0,1},{1,1,1,1,1} }  // 9
};

// Преобразование координат X,Y в номер светодиода (змейка)
uint16_t xy(uint8_t x, uint8_t y) {
  if (y % 2 == 0) {
    return y * MATRIX_WIDTH + x;
  } else {
    return y * MATRIX_WIDTH + (MATRIX_WIDTH - 1 - x);
  }
}

void setup() {
  FastLED.addLeds(leds, NUM_LEDS);
  FastLED.clear();
  FastLED.show();

  rtc.begin();
  pinMode(A0, INPUT);
}

void loop() {
  DateTime now = rtc.now();

  int light = analogRead(A0);
  int brightness = map(light, 0, 1023, 30, 255);
  FastLED.setBrightness(brightness);

  fill_solid(leds, NUM_LEDS, CRGB::Black);

  int hour = now.hour();
  int minute = now.minute();

  drawDigit(hour / 10, 0, 0, CRGB::Red);
  drawDigit(hour % 10, 6, 0, CRGB::Red);
  drawDigit(minute / 10, 0, 8, CRGB::Blue);
  drawDigit(minute % 10, 6, 8, CRGB::Blue);

  FastLED.show();
  delay(1000);
}

void drawDigit(int num, int x, int y, CRGB color) {
  for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 7; j++) {
      if (font[num][i][j]) {
        leds[xy(x + i, y + j)] = color;
      }
    }
  }
}

Код отображает текущее время (часы и минуты) на светодиодной матрице 16×16 WS2812B.
Время берётся с модуля RTC DS3231.
Яркость матрицы автоматически регулируется по уровню освещённости с фоторезистора.
Обновление индикации происходит один раз в секунду.

Заключение

Часы на WS2812 — яркий и функциональный проект. Матрица 16×16, автояркость, разные цвета, DS3231. Простая сборка, эффектный результат. Умный дом, декор, подарок.

FAQ — Часы на WS2812

WS2812 не загораются?

Проверьте DIN → D6, резистор 330–470 Ом, конденсатор 1000 мкФ. FastLED.addLeds(leds, NUM_LEDS). Питание 5В 2А+.

Яркость не меняется?

Фоторезистор → A0 + 10 кОм. map(light, 0, 1023, 20, 255). FastLED.setBrightness.

Время неверное?

DS3231 RTC.begin(). SDA → A4, SCL → A5. RTClib библиотека.

Цвета цифр?

drawDigit(..., CRGB::Red). Меняйте цвет в коде.

Бегущая строка?

FastLED.shift() или массив. Привяжите к секундам.

OpenHAB интеграция?

ESP8266 + MQTT. Топики /time. Items String. Графики, уведомления.

Лента вместо матрицы?

Змейка 256 диодов. Массив координат. drawDigit адаптировать.

📁 Скачать примеры