← Конфигурация Tasmota | Содержание
Библиотека Arduino IDE
Версия 1.0 — 2019
Создаёте проект для Arduino? Библиотека Arduino: ESP32/8266, STM32, платы Arduino. Примеры кода.
Подключение I/O
Диммер подключается к контроллерам Arduino через два цифровых пина:
- Первый (Zero) — для контроля прохождения нулевой фазы AC, используется для формирования сигнала прерывания
- Второй (DIM/PSM) — для управления (диммирования) током
Пин Zero должен быть подключён к специально выделенным пинам микроконтроллера (различающимся в зависимости от модели: Uno, Nano, Leonardo и Mega), поскольку он связан с прерываниями микроконтроллера.
Напряжение питания VCC диммера должно соответствовать логическому уровню микроконтроллера:
- 5В для 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, которая использует внешние прерывания и прерывания таймера. Это упрощает написание кода и освобождает больше процессорного времени для основного кода. Именно поэтому одним микроконтроллером можно управлять несколькими диммерами.
В библиотеке доступно несколько примеров. Мы постоянно обновляем библиотеку, поэтому рекомендуем следить за обновлениями на сайте или подписаться на нашу рассылку.
Данная библиотека упрощает код пользователя благодаря следующим функциям:
1. Функция dimmerLamp
Функция инициализирует номер рабочего пина и определяется пользователем:
а. Для плат БЕЗ изменяемого пина входа перехода через ноль (AVR, Arduino M0/Zero):
dimmerLamp dimmer(4); // dimmer output DIM/PSM is initialized on the pin 4
б. Для плат с изменяемым пином перехода через ноль (ESP32, ESP8266, Arduino Due):
dimmerLamp dimmer(4, 2); // dimmer output DIM/PSM on pin 4, zero-cross on pin 2
2. Функция begin
Инициализация порта, таймера и внешнего прерывания от перехода через ноль:
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%:
dimmer.setPower(90);
4. Функция getPower
Отображает текущее значение диммирования:
Serial.print(dimmer.getPower()); // Result 0~100 int
5. Функция setMode
Устанавливает и изменяет режим работы:
dimmer.setMode(NORMAL_MODE/TOGGLE_MODE);
6. Функция getMode
Отображает значение текущего режима работы:
Serial.print(dimmer.getMode()); // Result 0 (NORMAL_MODE) or 1 (TOGGLE_MODE)
7. Функция setState
Устанавливает состояние диммирования ON/OFF:
dimmer.setState(ON);
delay(100);
dimmer.setState(OFF);
8. Функция getState
Отображает текущее состояние диммера:
Serial.print(dimmer.getState()); // Result 0 (OFF) or 1 (ON)
9. Функция changeState
Изменяет состояние диммера на противоположное:
dimmer.setState(ON);
delay(100);
dimmer.changeState();
delay(100);
10. Функция toggleSettings
Плавное изменение значения диммирования вверх или вниз в заданном диапазоне:
Пример: \RBDdimmer\examples\SimpleToggleDimmer
Примеры
Пример: Управление значением диммирования через последовательный порт
Следующий скетч предназначен для задания значения диммирования через последовательный порт контроллера:
- Используется
USE_SERIAL.begin - Функция
void printSpace()добавляет пробел после функциональных данных void loop()— обработчик последовательного порта, используется для регистрации и задания значений вdimmer.setPower(outVal)
#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)— кнопка подключена к пину 14void loop()— обработчик кнопки ON/OFF диммера вdimmer.setState(ON/OFF)
#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)
#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%:
#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
}
Пример: Плавное диммирование с кнопками
Следующий скетч реализует плавное включение диммера при нажатии первой кнопки и плавное выключение при нажатии второй:
#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.
Код
#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.
Пример многоканального кода
#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);
// ...
}