Skip to content

vladikas/Arduino-Blinkenlight

 
 

Repository files navigation

Arduino-Blinkenlight

tests

Опубликовано на 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 по следующему шаблону:

pattern

#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


Установка

Platform.io

Blinkenlight доступна в реестре Platform.io

pio lib install "tfeldmann/Blinkenlight"

Менеджер библиотек Arduino

Blinkenlight доступна через стандартный менеджер библиотек Arduino.

Blinkenlight в менеджере библиотек Arduino


Полный API

Создание экземпляра

// Без эффекта затухания:
#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-значения. Эта библиотека использует логарифмическую кривую, чтобы сделать затухание естественным.

logarithmic fading


У меня индикатор на CAN / I2C / SPI / ... Что делать?

Без проблем! Есть два варианта:

  • Используйте базовый класс BaseBlinker из <BaseBlinker.h>. Метод .update() возвращает true, если текущее состояние HIGH, иначе LOW. Можно отправить это значение по нужному интерфейсу (см. пример examples/GenericBlink). Для эффектов затухания используйте BaseFader — у него update() возвращает 0..255.

  • Унаследуйте свой класс от BaseBlinker с кастомной логикой. Именно так реализован Blinkenlight (см. src/Blinkenlight.h). Пример: SerialBlink.


Зачем всё это

Я создал библиотеку, потому что люблю выводить коды ошибок миганием. Например, 2 мигания, пауза, 3 мигания — ошибка 23. Вы поняли идею.

Со временем библиотека оказалась полезной и для буззеров, и для лампочек, и для любых индикаторов. В некоторых проектах я использую её для управления светодиодами состояния по CAN.


About

Non-blocking fading patterns for single LEDs. Virtual pin added.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 99.1%
  • Shell 0.9%