summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorvlapa <vlapa@ya.ru>2026-07-09 16:05:56 +0300
committervlapa <vlapa@ya.ru>2026-07-09 16:05:56 +0300
commitd6e70f7fcefded671735d2c9a2af6e2dc5e157c9 (patch)
tree4ca52357b93dd679a9609a52f44042ab13896ab8 /include
полностью переработано для esp32c3
Diffstat (limited to 'include')
-rw-r--r--include/tablo_ws2812.h277
1 files changed, 277 insertions, 0 deletions
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 <Arduino.h>
+#include <NeoPixelBus.h>
+#include "config.h"
+
+#define RAZR_PIXEL 42
+const uint8_t digit = 5;
+#define PIXEL_COUNT (RAZR_PIXEL * digit)
+
+// Используем обычный NeoPixelBus
+NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> 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