2025-07-13 15:44:13 +03:00

67 lines
1.8 KiB
C++

#include <SevenSegmentNeoPixel.h>
#define DIGITS 1
#define PIXELS_PER_SEGMENT 7
#define PIN 0
SevenSegmentNeoPixel display(DIGITS, PIXELS_PER_SEGMENT, PIN);
uint32_t colorWheel(byte pos) {
pos = 255 - pos;
if (pos < 85) {
return display.getStrip().Color(255 - pos * 3, 0, pos * 3);
}
if (pos < 170) {
pos -= 85;
return display.getStrip().Color(0, pos * 3, 255 - pos * 3);
}
pos -= 170;
return display.getStrip().Color(pos * 3, 255 - pos * 3, 0);
}
void setup() {
display.begin();
display.setBrightness(50);
}
void loop() {
static unsigned long lastAnim = 0;
static unsigned long lastCount = 0;
static unsigned long counter = 0;
static uint16_t rainbowOffset = 0;
unsigned long now = millis();
// Animate rainbow every 50ms
if (now - lastAnim >= 50) {
lastAnim = now;
display.clear();
unsigned long value = counter;
for (int d = DIGITS - 1; d >= 0; d--) {
uint8_t digit = value % 10;
value /= 10;
const uint8_t* segPattern = SevenSegmentNeoPixel::getSegmentPattern(digit);
for (uint8_t seg = 0; seg < 7; seg++) {
if (segPattern && segPattern[seg]) {
for (uint8_t px = 0; px < PIXELS_PER_SEGMENT; px++) {
uint16_t globalPixel = d * 7 * PIXELS_PER_SEGMENT + seg * PIXELS_PER_SEGMENT + px;
uint8_t colorPos = (globalPixel * 256 / (DIGITS * 7 * PIXELS_PER_SEGMENT) + rainbowOffset) & 0xFF;
uint32_t color = colorWheel(colorPos);
display.getStrip().setPixelColor(globalPixel, color);
}
}
}
}
display.show();
rainbowOffset += 4; // Wave speed
}
// Increment counter every 1000ms (1 second)
if (now - lastCount >= 1000) {
lastCount = now;
counter++;
if (counter >= pow(10, DIGITS)) counter = 0;
}
}