Новогодний светильник (ночник)

Пора собрать что-то полезное. На базе созданных нами классов мы соберем светильник, имеющий три канала управляемых по случайному закону.

Скорость изменения яркости задается в программе. Можно устанавливать на своё усмотрение.

Данная система может управлять светодиодными лентами или мощными светодиодами в режиме ШИМ. Для управления нагрузкой требующей напряжения более 5 вольт и высоких токов, в схеме, необходимо использовать ключи. Пример.

Обычно, для подключения силового ключа необходимо подключить «+5», «–», и управляющий сигнал со стороны Arduino к контактам ключа «V», «G» и «S» соответственно. Номера контактов контроллера мы выбрали и указали в программе. В нашем случае, это 9, 10, 11 ( int arPins[] = {9, 10, 11}; ).

Давайте дополним класс softLed, с которым мы уже познакомились. Напомню, при инициализации класса softLed, мы передаём ему номер пина (порта) для подключения светодиода, число шагов для изменения яркости и длительность каждого шага. После вызова функции класса softLed ledOn() происходит плавное включение / выключение светодиода. По завершению цикла включения / выключения, вызывается виртуальная функция action(). Именно эта функция позволит изменить работу класса softLed.

Всё, что нам нужно, это добавить производный, от класса softLed, новый класс, который возьмет на себя изменение значений длительности и числа шагов включения каждого светодиода. Назовём его randLed.

#ifndef RANDLED_H
#define RANDLED_H

#include "softLed.h"

class randLed : public softLed {
  protected:
    bool action() override;
  public:
    randLed(int pin);
};
#endif

Этот класс расширяет возможности класса softLed, перегружая виртуальную функцию action. Обратите внимание на то, как объявлен класс class randLed : public softLed. Двоеточие указывает на то, что класс randLed является производным классом от класса softLed и наследует его переменные и функции, кроме тех, которые скрыты модификатором доступа private.

В классе softLed, мы объявили функцию action() виртуальной (слово virtual при объявлении функции). Класс randLed тоже содержит функцию action(), имеющую такое же возвращаемое значение и параметры. Модификатор override указывает компилятору то, что мы перегружаем функцию базового класса.

#include "Arduino.h"
#include "softLed.h"
#include "randLed.h"
//***********************************************************************
randLed::randLed(int pin):softLed(pin){
}
//********************************************
bool randLed::action(){
  steps = random(30, 50);
  dt = random(10, 70);
  ledOn();
  return true;
}

В классе всего две функции: конструктор и active(). Конструктор нужен для передачи номера порта (пина) в базовый класс. Функция актив, при каждом вызове, изменяет число шагов и длительность шага, данного экземпляра класса, по случайному закону используя функцию arduino random().

Код основной программы становится ещё проще:

#include "timer.h"
#include "softLed.h"
#include "randLed.h"

int arPins[] = {9, 10, 11};
int nLeds = 0; //число подключаемых светодиодов
randLed **arLeds;
//***********************
void setup() {
  nLeds = sizeof(arPins)/sizeof(int);  //вычисление числа подключенных светодиодов по числу объявленных портов
  arLeds = new randLed*[nLeds];
  for(int i= 0; i < nLeds; ++i){
    arLeds[i] = new randLed((int)arPins[i]);  
    arLeds[i]-> ledOn();
  }
}

//***********************
void loop() {
  for(int i= 0; i < nLeds; ++i){
    arLeds[i] -> cycle();
  }
}