Опубликовано на hackster.io!
Эта библиотека обеспечивает неблокирующие шаблоны мигания и плавные эффекты затухания для светодиодов, буззеров или любых других индикаторов состояния.
Achtung Alles Lookenskeepers! Das computermachine ist nicht fuer gefingerpoken und mittengrabben. Ist easy schnappen der springenwerk, blowenfusen und poppencorken mit spitzensparken. Ist nicht fuer gewerken bei das dumpkopfen. Das rubbernecken sichtseeren keepen das cotten-pickenen hans in das pockets muss; relaxen und watchen das blinkenlichten.
- Вкл / выкл / переключение
- Бесконечное мигание
- Шаблоны мигания (например, для вывода кодов ошибок)
- Однократные вспышки и паузы с продолжением предыдущего режима
Другие плюшки:
- Полностью неблокирующая (без
delay()) - Красивая плавная анимация (опционально) с логарифмической компенсацией яркости для светодиодов
- Лёгкая и быстрая
- Все параметры можно изменять "на лету" без визуальных рывков
- Легко расширяется для управления компонентами через SPI / CAN / I2C / UART …
- С приятными настройками по умолчанию (ну, я старался 😅)
- Дружелюбна к пользователю — например, вызов
blink()во время мигания не перезапускает цикл - Поддерживает активную низкую (инвертированную) логику
- Может использоваться и для буззеров
Особенности этого форка:
- Виртуальный пин (
-1)
Этот пример мигает встроенным светодиодом на пине 13 по следующему шаблону:
#include <Blinkenlight.h>
#include "Fadinglight.h"
const int BUZZER_PIN = 33; // ESP32
const int REAL_LED_PIN = 22; // ESP32
Blinkenlight led(13); // реальный пин
Blinkenlight vLed1(-1); // виртуальный пин
Fadinglight vLed2(-1, false, 10); // виртуальный пин
void setup()
{
Serial.begin(115200);
led.pattern(2, 3); // мигает 2 раза, затем 3 раза
vLed1.pattern(3, SPEED_FAST, false);
vLed2.blink();
vLed2.setSpeed(1000);
}
void loop()
{
led.update();
if (vLed1.update()) {
tone(BUZZER_PIN, 1000);
} else {
noTone(BUZZER_PIN);
}
int level = vLed2.update(); // 0–255
analogWrite(REAL_LED_PIN, level);
static unsigned long lastReport = 0;
if (millis() - lastReport >= 10) {
lastReport = millis();
Serial.println(level);
}
}Примечание: Если хотите более плавный эффект — просто используйте класс
FadinglightвместоBlinkenlight.Fadinglightсоздаёт мягкие переходы яркости с логарифмической компенсацией. Ваши платы будут выглядеть по-настоящему профессионально! /s
Blinkenlight доступна в реестре Platform.io
pio lib install "tfeldmann/Blinkenlight"
Blinkenlight доступна через стандартный менеджер библиотек Arduino.
// Без эффекта затухания:
#include <Blinkenlight.h>
Blinkenlight myLed(13); // Blinkenlight(int pin, bool invert = false);
// С эффектом затухания:
#include <Fadinglight.h>
Fadinglight myLed(13); // Fadinglight(int pin, bool logarithmic = true, int fade_speed = 30);
// теперь в коде можно:
myLed.off();
myLed.blink();
myLed.pattern(3, 5, SPEED_FAST);
// ... и т. д. (см. ниже)// Постоянно ВКЛ
void on();
// Постоянно ВЫКЛ
void off();
// Переключить состояние
void toggle();
// Включить/выключить навсегда
void permanent(bool enable);
// Бесконечное мигание
void blink();
void blink(SpeedSetting speed);
// Мигнуть `num` раз, затем длинная пауза
// Повторяется, если `repeat` установлен, иначе выключается
void pattern(int num, bool repeat = true);
void pattern(int num, SpeedSetting speed, bool repeat = true);
// Мигнуть `num1` раз, короткая пауза, затем `num2` раз, длинная пауза
// Повторяется, если `repeat` установлен, иначе выключается
void pattern(int num1, int num2, bool repeat = true);
void pattern(int num1, int num2, SpeedSetting speed, bool repeat = true);
// Включить на указанное время (мс), затем вернуть предыдущий режим
void flash(uint16_t duration_ms);
// Выключить на указанное время (мс), затем вернуть предыдущий режим
void pause(uint16_t duration_ms);
// Возвращает `true`, если Blinkenlight сейчас мигает, показывает шаблон, вспышку или паузу
bool isOn();
// Вызывать обязательно в loop()!
// Возвращает текущее состояние (LOW / HIGH)
// — Можно игнорировать, если не нужно
int update();// Настройка временных параметров
void setSpeed(SpeedSetting setting);
// Доступны по умолчанию: SPEED_RAPID, SPEED_FAST, SPEED_SLOW
myLed.setSpeed(SPEED_RAPID);
myLed.setSpeed(SPEED_FAST);
myLed.setSpeed(SPEED_SLOW);
// Или используйте свои настройки. SpeedSetting — это структура:
typedef struct
{
uint16_t on_ms; // время ВКЛ (мс)
uint16_t off_ms; // время ВЫКЛ (мс)
uint16_t pause_ms; // пауза между num1 и num2 в pattern()
uint16_t ending_ms; // пауза после полного шаблона
} SpeedSetting;
// Пример задания своих значений:
SpeedSetting mySettings = {
.on_ms = 100,
.off_ms = 100,
.pause_ms = 2000,
.ending_ms = 2000,
};
// ... или настройка напрямую через метод
void setSpeed(
uint16_t on_ms,
uint16_t off_ms,
uint16_t pause_ms,
uint16_t ending_ms);
// ... или указав только одно значение — остальные вычислятся автоматически
void setSpeed(uint16_t on_ms);
// Подсказка: можно изменять параметры прямо во время работы
myLed.settings.on_ms = 250;
myLed.settings.pause_ms = 2000;Яркость светодиода нелинейна относительно PWM-значения. Эта библиотека использует логарифмическую кривую, чтобы сделать затухание естественным.
Без проблем! Есть два варианта:
-
Используйте базовый класс
BaseBlinkerиз<BaseBlinker.h>. Метод.update()возвращаетtrue, если текущее состояниеHIGH, иначеLOW. Можно отправить это значение по нужному интерфейсу (см. примерexamples/GenericBlink). Для эффектов затухания используйтеBaseFader— у негоupdate()возвращает0..255. -
Унаследуйте свой класс от
BaseBlinkerс кастомной логикой. Именно так реализованBlinkenlight(см.src/Blinkenlight.h). Пример:SerialBlink.
Я создал библиотеку, потому что люблю выводить коды ошибок миганием. Например, 2 мигания, пауза, 3 мигания — ошибка 23. Вы поняли идею.
Со временем библиотека оказалась полезной и для буззеров, и для лампочек, и для любых индикаторов. В некоторых проектах я использую её для управления светодиодами состояния по CAN.


