/*========================================================= 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); }