Перейти к содержимому

← Конфигурация Tasmota | Содержание

Библиотека Arduino IDE



Версия 1.0 — 2019

Создаёте проект для Arduino? Библиотека Arduino: ESP32/8266, STM32, платы Arduino. Примеры кода.

Info
Скачать библиотеку диммера: RBDDimmer



Подключение I/O

Диммер подключается к контроллерам Arduino через два цифровых пина:

  • Первый (Zero) — для контроля прохождения нулевой фазы AC, используется для формирования сигнала прерывания
  • Второй (DIM/PSM) — для управления (диммирования) током

Пин Zero должен быть подключён к специально выделенным пинам микроконтроллера (различающимся в зависимости от модели: Uno, Nano, Leonardo и Mega), поскольку он связан с прерываниями микроконтроллера.

Напряжение питания VCC диммера должно соответствовать логическому уровню микроконтроллера:

  • для Uno, Nano, Leonardo и Mega
  • 3,3В для STM32, ESP32, ESP8266


Таблица подключения

Плата Пин входа перехода через ноль Выходной пин
Leonardo D7 (НЕ ИЗМЕНЯЕТСЯ) D0-D6, D8-D13
Mega D2 (НЕ ИЗМЕНЯЕТСЯ) D0-D1, D3-D70
UNO / NANO D2 (НЕ ИЗМЕНЯЕТСЯ) D0-D1, D3-D20
ESP8266 D1(GPIO5), D5(GPIO14), D7(GPIO13), D2(GPIO4), D6(GPIO12), D8(GPIO15) D0(GPIO16), D2(GPIO4), D6(GPIO12), D8(GPIO15), D1(GPIO5), D5(GPIO14), D7(GPIO13)
ESP32 GPIO: 36, 39, 32, 25, 27, 12, 7, 2, 4, 17, 18, 21, 22, 34, 35, 33, 26, 14, 13, 15, 0, 16, 5, 19, 1, 23 GPIO: 32, 25, 27, 12, 15, 0, 16, 5, 19, 3, 22, 33, 26, 14, 13, 2, 4, 17, 18, 21, 1, 23
Arduino M0 / Arduino Zero D7 (НЕ ИЗМЕНЯЕТСЯ) D0-D6, D8-D13
Arduino Due D0-D53 D0-D53
STM32, Blue Pill (STM32F1) PA0-PA15, PB0-PB15, PC13-PC15 PA0-PA15, PB0-PB15, PC13-PC15



Библиотека и функции

В Arduino диммер управляется с помощью библиотеки RBDdimmer.h, которая использует внешние прерывания и прерывания таймера. Это упрощает написание кода и освобождает больше процессорного времени для основного кода. Именно поэтому одним микроконтроллером можно управлять несколькими диммерами.

Info
Скачать библиотеку диммера: RBDDimmer

В библиотеке доступно несколько примеров. Мы постоянно обновляем библиотеку, поэтому рекомендуем следить за обновлениями на сайте или подписаться на нашу рассылку.

Данная библиотека упрощает код пользователя благодаря следующим функциям:


1. Функция dimmerLamp

Функция инициализирует номер рабочего пина и определяется пользователем:

а. Для плат БЕЗ изменяемого пина входа перехода через ноль (AVR, Arduino M0/Zero):

cpp
dimmerLamp dimmer(4); // dimmer output DIM/PSM is initialized on the pin 4

б. Для плат с изменяемым пином перехода через ноль (ESP32, ESP8266, Arduino Due):

cpp
dimmerLamp dimmer(4, 2); // dimmer output DIM/PSM on pin 4, zero-cross on pin 2


2. Функция begin

Инициализация порта, таймера и внешнего прерывания от перехода через ноль:

cpp
dimmer.begin(NORMAL_MODE, ON/OFF);

Параметр 1: Режимы работы диммера:

  • NORMAL_MODE — диммер работает с заданным значением от 0 до 100 (%)
  • Пример: \RBDdimmer\examples\SimpleDimmer
  • TOGGLE_MODE — плавное изменение значения диммирования вверх или вниз в заданном диапазоне
  • Пример: \RBDdimmer\examples\SimpleToggleDimmer

Параметр 2: ON/OFF:

  • ON — включает таймер, разрешает использование диммера
  • OFF — выключает параметры таймера, запрещает использование диммера


3. Функция setPower

Устанавливает значение диммирования от 0 до 100%:

cpp
dimmer.setPower(90);


4. Функция getPower

Отображает текущее значение диммирования:

cpp
Serial.print(dimmer.getPower()); // Result 0~100 int


5. Функция setMode

Устанавливает и изменяет режим работы:

cpp
dimmer.setMode(NORMAL_MODE/TOGGLE_MODE);


6. Функция getMode

Отображает значение текущего режима работы:

cpp
Serial.print(dimmer.getMode()); // Result 0 (NORMAL_MODE) or 1 (TOGGLE_MODE)


7. Функция setState

Устанавливает состояние диммирования ON/OFF:

cpp
dimmer.setState(ON);
delay(100);
dimmer.setState(OFF);


8. Функция getState

Отображает текущее состояние диммера:

cpp
Serial.print(dimmer.getState()); // Result 0 (OFF) or 1 (ON)


9. Функция changeState

Изменяет состояние диммера на противоположное:

cpp
dimmer.setState(ON);
delay(100);
dimmer.changeState();
delay(100);


10. Функция toggleSettings

Плавное изменение значения диммирования вверх или вниз в заданном диапазоне:

Пример: \RBDdimmer\examples\SimpleToggleDimmer



Примеры


Пример: Управление значением диммирования через последовательный порт

Следующий скетч предназначен для задания значения диммирования через последовательный порт контроллера:

  • Используется USE_SERIAL.begin
  • Функция void printSpace() добавляет пробел после функциональных данных
  • void loop() — обработчик последовательного порта, используется для регистрации и задания значений в dimmer.setPower(outVal)
cpp
#include 

#define outputPin  12
#define zerocross  5 // for boards with CHANGEABLE input pins

// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);

// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);

int buttonRed = 0;

void setup() {
  dimmer.begin(NORMAL_MODE, ON); // dimmer initialisation: name.begin(MODE, STATE)
  dimmer.setPower(50);
  pinMode(14, INPUT);
}

void loop() {
  button = digitalRead(14);
  if (button == 1)
  {
    delay(50);
    dimmer.setState(ON); // .setState(ON/OFF);
  }
  if (button == 0)
  {
    delay(50);
    dimmer.setState(OFF); // .setState(ON/OFF);
  }
}


Пример: Включение/выключение питания

Следующий скетч предназначен для включения/выключения лампы кнопкой:

  • pinMode(14, INPUT) — кнопка подключена к пину 14
  • void loop() — обработчик кнопки ON/OFF диммера в dimmer.setState(ON/OFF)
cpp
#include 

#define outputPin  12
#define zerocross  5 // for boards with CHANGEABLE input pins

// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);

// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);

int buttonRed = 0;

void setup() {
  dimmer.begin(NORMAL_MODE, ON); // dimmer initialisation: name.begin(MODE, STATE)
  dimmer.setPower(50);
  pinMode(14, INPUT);
}

void loop() {
  button = digitalRead(14);
  if (button == 1)
  {
    delay(50);
    dimmer.setState(ON); // .setState(ON/OFF);
  }
  if (button == 0)
  {
    delay(50);
    dimmer.setState(OFF); // .setState(ON/OFF);
  }
}


Пример: Диммирование с помощью потенциометра

Следующий скетч предназначен для задания значения диммирования с помощью потенциометра:

  • Значения потенциометра изменяются в диапазоне от 0 до 1023
  • Значения потенциометра преобразуются через функцию map в диапазон 0–100% и сохраняются в dimmer.setPower(outVal)
cpp
#include 

#define outputPin  12
#define zerocross  5 // for boards with CHANGEABLE input pins

// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);

// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);

int outVal = 0;

void setup()
{
  dimmer.begin(NORMAL_MODE, ON); // dimmer initialisation: name.begin(MODE, STATE)
}

void loop()
{
  outVal = map(analogRead(0), 1, 1024, 100, 0); // analogRead(analog_pin), min, max, 100%, 0%
  dimmer.setPower(outVal); // name.setPower(0%-100%)
}


Пример: Переключение значений диммирования

Следующий скетч реализует плавное изменение значений диммирования в заданном диапазоне с помощью функции.

Значения задаются в диапазоне от 0 до 100%:

cpp
#include 

#define outputPin  12
#define zerocross  5 // for boards with CHANGEABLE input pins

// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);

// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);

void setup() {
  dimmer.begin(TOGGLE_MODE, OFF); // dimmer initialisation: name.begin(MODE, STATE)
  dimmer.toggleSettings(0, 70); // Name.toggleSettings(MIN, MAX);
  dimmer.setState(ON); // state: dimmer1.setState(ON/OFF);
}

void loop() {
  // ...
  dimmer.setState(ON); // set power to MAX value
  // ...
  dimmer.setState(OFF); // set power to MIN value
}


Пример: Плавное диммирование с кнопками

Следующий скетч реализует плавное включение диммера при нажатии первой кнопки и плавное выключение при нажатии второй:

cpp
#include 

#define outputPin  12
#define zerocross  5 // for boards with CHANGEABLE input pins

#define LAMPMAXVALUE 100

// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);

// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);

int stateL = 0, valLamp;
int mainLamp = 0;
int buttonRed = 0;
int buttonBlue = 0;
bool setLamp = true;

void setup() {
  dimmer.begin(NORMAL_MODE, ON); // dimmer initialisation: name.begin(MODE, STATE)
  // ...
}

void RiseFallLamp(bool RiseFallInt)
{
  if ((RiseFallInt == true) && (mainLamp < LAMPMAXVALUE)) mainLamp++;
  else if ((RiseFallInt != true) && (mainLamp > 0)) mainLamp--;
}

bool setLampState(int val)
{
  bool ret;
  if (val >= 1) ret = true;
  else ret = false;
  return ret;
}

void readButtonState()
{
  buttonRed = digitalRead(13);
  buttonBlue = digitalRead(15);

  if (buttonRed < 1) stateL++;
  if (buttonBlue < 1) stateL--;
  if (stateL < 0) stateL = 0;
  if (stateL > 1) stateL = 1;
}

void loop() {
  readButtonState();
  dimmer.setPower(mainLamp); // setPower(0-100%);
  RiseFallLamp(setLampState(stateL));
  delay(25);
}



Подключение двух и более диммеров

Z-C (ZeroCross): ZC pin needs only for 1st dimmer. For the next dimmers don't need to connect Z-C.

Для каждого диммера необходимо подключить пин Dim.


Код

cpp
#define outputPin1  12  // Dim pin for dimmer 1
#define outputPin2  11  // Dim pin for dimmer 2
#define outputPin3  10  // Dim pin for dimmer 3
#define zerocross  5    // for boards with CHANGEABLE input pin

// For ESP8266, ESP32, STM32, Arduino due boards
// dimmerLamp dimmer1(outputPin1, zerocross);
// dimmerLamp dimmer2(outputPin2, zerocross);

// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer1(outputPin1); // initialise port for dimmer 1
dimmerLamp dimmer2(outputPin2); // initialise port for dimmer 2
dimmerLamp dimmer3(outputPin3); // initialise port for dimmer 3

void setup() {
  dimmer1.begin(NORMAL_MODE, ON);
  dimmer2.begin(NORMAL_MODE, ON);
  dimmer3.begin(NORMAL_MODE, ON);
}

void loop() {
  // ...
  dimmer1.setPower(outVal1);
  dimmer2.setPower(outVal2);
  dimmer3.setPower(outVal3);
  // ...
}



2- и 4-канальные диммеры для однофазной сети AC

2- и 4-канальные диммеры имеют 1 выход ZC и 2–4 пина Dim.


Пример многоканального кода

cpp
#define outputPin1  12  // Dim pin for dimmer 1
#define outputPin2  11  // Dim pin for dimmer 2
#define outputPin3  10  // Dim pin for dimmer 3
#define outputPin4  9   // Dim pin for dimmer 4
#define zerocross  5    // for boards with CHANGEABLE input pin

// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer1(outputPin1, zerocross);
// dimmerLamp dimmer2(outputPin2, zerocross);

// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer1(outputPin1); // initialise port for dimmer 1
dimmerLamp dimmer2(outputPin2); // initialise port for dimmer 2
dimmerLamp dimmer3(outputPin3); // initialise port for dimmer 3
dimmerLamp dimmer4(outputPin4); // initialise port for dimmer 4

void setup() {
  dimmer1.begin(NORMAL_MODE, ON);
  dimmer2.begin(NORMAL_MODE, ON);
  dimmer3.begin(NORMAL_MODE, ON);
  dimmer4.begin(NORMAL_MODE, ON);
}

void loop() {
  // ...
  dimmer1.setPower(outVal1);
  dimmer2.setPower(outVal2);
  dimmer3.setPower(outVal3);
  dimmer4.setPower(outVal4);
  // ...
}

← Конфигурация Tasmota | Содержание