From d6e70f7fcefded671735d2c9a2af6e2dc5e157c9 Mon Sep 17 00:00:00 2001 From: vlapa Date: Thu, 9 Jul 2026 16:05:56 +0300 Subject: полностью переработано для esp32c3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/tablo_ws2812.h | 277 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 include/tablo_ws2812.h (limited to 'include/tablo_ws2812.h') diff --git a/include/tablo_ws2812.h b/include/tablo_ws2812.h new file mode 100644 index 0000000..139960e --- /dev/null +++ b/include/tablo_ws2812.h @@ -0,0 +1,277 @@ +/*========================================================= + Tablo ws2812 + = vlapa = v.509 + Ported to ESP32-C3 with NeoPixelBus +=========================================================*/ +#pragma once + +#include +#include +#include "config.h" + +#define RAZR_PIXEL 42 +const uint8_t digit = 5; +#define PIXEL_COUNT (RAZR_PIXEL * digit) + +// Используем обычный NeoPixelBus +NeoPixelBus strip(PIXEL_COUNT, LED_PIN); + +// Буфер для хранения цветов +RgbColor pixelBuffer[PIXEL_COUNT]; + +// Текущая яркость +uint8_t currentBrightness = 5; + +// Преобразование символа в номер сегмента +uint8_t charToDigit(char c) +{ + switch (c) + { + case 'A': + return 10; // градус + case 'B': + return 11; // минус + case 'C': + return 12; // двоеточие + case 'D': + return 13; // пусто + case 'E': + return 14; // точка + case 'p': + return 15; // давление + case 'h': + return 16; // влажность + default: + return c - '0'; // цифра + } +} + +// Применение яркости ко всем пикселям +void applyBrightness(uint8_t brightness) +{ + currentBrightness = brightness; + for (uint16_t i = 0; i < PIXEL_COUNT; i++) + { + RgbColor dimmed = RgbColor( + (pixelBuffer[i].R * brightness) / 255, + (pixelBuffer[i].G * brightness) / 255, + (pixelBuffer[i].B * brightness) / 255); + strip.SetPixelColor(i, dimmed); + } + strip.Show(); +} + +// Установка пикселя в буфер +void setPixelBuffer(uint16_t index, RgbColor color) +{ + pixelBuffer[index] = color; +} + +// Отрисовка одного разряда +void drawDigit(uint8_t razr, uint8_t x, uint32_t color) +{ + uint32_t offset = razr * RAZR_PIXEL; + + // Сброс всех пикселей в разряде + for (int i = 0; i < RAZR_PIXEL; ++i) + { + setPixelBuffer(i + offset, RgbColor(0, 0, 0)); + } + + // Извлекаем RGB из 32-битного цвета + uint8_t r = (color >> 16) & 0xFF; + uint8_t g = (color >> 8) & 0xFF; + uint8_t b = color & 0xFF; + RgbColor rgbColor(r, g, b); + + // Маски для каждого символа + switch (x) + { + case 0: // 0 + for (int i = 0; i < 36; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 1: // 1 + for (int i = 12; i < 24; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 2: // 2 + for (int i = 6; i < 18; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 24; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 3: // 3 + for (int i = 6; i < 30; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 37; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 4: // 4 + for (int i = 0; i < 6; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 12; i < 24; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 36; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 5: // 5 + for (int i = 0; i < 12; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 18; i < 30; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 36; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 6: // 6 + for (int i = 0; i < 12; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 18; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 7: // 7 + for (int i = 6; i < 24; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 8: // 8 + for (int i = 0; i < RAZR_PIXEL; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 9: // 9 + for (int i = 0; i < 30; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 36; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 10: // градус (A) + for (int i = 0; i < 18; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 36; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 11: // минус (B) + for (int i = 36; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 12: // двоеточие (C) + setPixelBuffer(36 + offset, rgbColor); + setPixelBuffer(37 + offset, rgbColor); + setPixelBuffer(40 + offset, rgbColor); + setPixelBuffer(41 + offset, rgbColor); + break; + + case 13: // пусто (D) + // Все уже сброшены + break; + + case 14: // точка (E) + setPixelBuffer(26 + offset, rgbColor); + setPixelBuffer(27 + offset, rgbColor); + break; + + case 15: // давление (p) + for (int i = 0; i < 18; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 30; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + + case 16: // влажность (h) + for (int i = 0; i < 6; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 18; i < 24; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + for (int i = 30; i < 42; ++i) + { + setPixelBuffer(i + offset, rgbColor); + } + break; + } +} + +// Основная функция отображения +void visibleWork(const String &visData, uint32_t color, uint8_t bright) +{ + // Записываем данные в буфер + for (uint8_t razr = 0; razr < digit && razr < visData.length(); ++razr) + { + uint8_t x = charToDigit(visData.charAt(razr)); + drawDigit(razr, x, color); + } + + // Применяем яркость и выводим на ленту + uint8_t brightness = bright; // map(bright, 0, 10, 0, 20); + applyBrightness(brightness); +} + +// Очистка табло +void clearDisplay() +{ + for (int i = 0; i < PIXEL_COUNT; ++i) + { + setPixelBuffer(i, RgbColor(0, 0, 0)); + } + applyBrightness(currentBrightness); +} \ No newline at end of file -- cgit v1.2.3