• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Мерцание лампы от AC Light Dimmer Module

Const

Member
Доброго времени суток. Имеется ESP-01.
Light Dimmer Module(ссылка на али):

Блок питания 3,3в(ссылка на али):

снаббер(ссылка на али):

Как ясно из заголовка проблема в том что когда все подключаю и пытаюсь диммировать яркость лампы, она начинает мерцать.
Видос проблемы:
Кто знает как решить данную проблему?
 

nikolz

Well-known member
осциллограф есть?
надо посмотреть сигнал управления на пине ESP
а так же пульсации источника питания
а еще схему которую собрали
а еще программу которую загрузили.
Короче , надо сначала все изучить чтобы потом советовать.
 

nikolz

Well-known member
еще можно для начала поуправлять диммером руками без ESP.
 

l15ar

Member
Вот думаю, что, очень возможно, логика вашей программы не учитывает, сигнал перехода напряжения через ноль. Точку, когда нужно включать высокий уровень на вывод DIMMER.
Получается, вы подключаете ШИМ-сигнал на вход диммера, но игнорируете точку перехода через ноль. Этого можно избежать, если использовать оптопару, в которой
точка перехода через ноль, учитывается при коммутации. (https://www.chipdip.ru/product/moc3063m) Тогда, сигнал перехода через ноль - не нужен, совсем!
 

nikolz

Well-known member
Вот думаю, что, очень возможно, логика вашей программы не учитывает, сигнал перехода напряжения через ноль. Точку, когда нужно включать высокий уровень на вывод DIMMER.
Получается, вы подключаете ШИМ-сигнал на вход диммера, но игнорируете точку перехода через ноль. Этого можно избежать, если использовать оптопару, в которой
точка перехода через ноль, учитывается при коммутации. (https://www.chipdip.ru/product/moc3063m) Тогда, сигнал перехода через ноль - не нужен, совсем!
Вы посмотрите диммер который привел автор - там написано что диммер с детектором нуля.
 

l15ar

Member
Понятно, симисторный регулятор управляющий углом открытия тиристора. Извиняюсь. Делать всё это программно, это не по человечески! ИМХО.
Можно поступить так. Взять ШИМ-сигнал, подать на вход транзистора(например, на базу кт315, через сопротивление 100 ом),
колектор подключен к сигналу Zero-C, эммитер подключен к сигналу DIMMER, и также, между ножкой DIMMER и землей подключить электролитический конденсатор 10мкф(не точно, подбирать!).
 

l15ar

Member
Извиняюсь, одним транзистором не выйдет.. Пара тразисторов, или более эфективно использовать ne555. :\
 

Const

Member
осциллограф есть?
надо посмотреть сигнал управления на пине ESP
а так же пульсации источника питания
а еще схему которую собрали
а еще программу которую загрузили.
Короче , надо сначала все изучить чтобы потом советовать.
Для простоты понимания кода оставил минимум:
C++:
#include "dimmable_light.h"

const uint8_t syncPin = 1;
const uint8_t thyristorPin = 2;

DimmableLight light(thyristorPin);
void setup()
{
  DimmableLight::setSyncPin(syncPin);
  DimmableLight::begin();
  delay(100);
}

void loop()
{
  light.setBrightness(40);
}
Код зажигает лампу на 40 процентов, но поведение точно такое же.
Я не мастер рисовать схемы, но как есть набросал в фотошопе.
shema.jpg
Осциллографа к сожалению нет.
Если в место ESP 01 подключить плату NODE MCU и питать от USB компа, то мерцания появляются крайне редко.
 

nikolz

Well-known member
1) напишите тест для проверки правильности чтения с диммера согнала перехода через ноль.
т е читаете фронт сигнала нуля измеряете до следующего и выводите в терминал результата
2) напишите тест для проверки правильности формирования импульса управления
сделайте цикл, в котором медленно меняете длительность импульса и выведите на терминал результат.
3) после этого подключайте пин управления диммером.
 

Const

Member
1) напишите тест для проверки правильности чтения с диммера согнала перехода через ноль.
т е читаете фронт сигнала нуля измеряете до следующего и выводите в терминал результата
Набросал вот такой код. Показывает количество миллисекунд между переходами через 0.
C++:
#include <Arduino.h>

const uint8_t syncPin = 1;
const uint8_t thyristorPin = 2;
unsigned long interval;

void ICACHE_RAM_ATTR light()
{
  Serial.println(String(millis() - interval));
  interval = millis();
}

void setup()
{
  interval = millis();
  Serial.begin(115200);
  pinMode(thyristorPin, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(syncPin), light, FALLING);
}

void loop()
{
}
Показывает 10 мс, но так же пролетают и 1 и 0. Мне кажется что это из за паразитных наводок.
Если в микросекундах то 10000мкс в среднем и пролетает по 200 и 500 мкс.
 

nikolz

Well-known member
Набросал вот такой код. Показывает количество миллисекунд между переходами через 0.
C++:
#include <Arduino.h>

const uint8_t syncPin = 1;
const uint8_t thyristorPin = 2;
unsigned long interval;

void ICACHE_RAM_ATTR light()
{
  Serial.println(String(millis() - interval));
  interval = millis();
}

void setup()
{
  interval = millis();
  Serial.begin(115200);
  pinMode(thyristorPin, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(syncPin), light, FALLING);
}

void loop()
{
}
Показывает 10 мс, но так же пролетают и 1 и 0. Мне кажется что это из за паразитных наводок.
Если в микросекундах то 10000мкс в среднем и пролетает по 200 и 500 мкс.
относительно природы помех вопрос открытый.
но пока вы их не устраните будет мерцание.
---------------------
не исключено, что это влияние Wifi.
отключите wifi.
-------------------------
В колбеке прерывания от пина надо выставить начала шим и включать таймер
а в колбеке таймера - выставить конец шим .
По такому алгоритму у вас не будет проблем с wifi
и процессор будет свободным.
------------------
у вас очень грубо регулируется ширина импульса ШИМ
 
Сверху Снизу