Диммер для лампы

Vinegret
Offline
Зарегистрирован: 25.01.2015

Здравствуйте, товарищи аццы! Помогите кто-нить, покорнейше прошу. Суть проблемы в том, что приобрел я на мухамедэкспрессе модуль RobotDyn AC light dimmer. https://ru.aliexpress.com/item/AC-Light-Dimmer-Module-for-PWM-control-1-Channel-3-3V-5V-logic-AC-50-60hz/32802025086.html?spm=2114.13010608.0.0.xNglD5 Изготовлен он на базе MOC302. На плате русским по белому написано ZeroCross Detector, что как бы намекает на наличие детектора нуля. Так же имеется набор контактов, аналогичных выходам диммера с видео http://www.youtube.com/watch?v=-YyuncOGa1U. Подписаны они как PWM, Z-C, Vcc, GND. Исходя из надписей назначение выводов предельно ясно. Но вот засада. При заливке скетча из видео лампа горит во весь накал и на попытки изменить яркость свечения не реагирует никак.

/* AC Light Dimmer - Inmojo  AC Voltage dimmer with Zero cross detection  Author: Charith Fernanado http://www.inmojo.com charith@inmojo.com  License: Released under the Creative Commons Attribution Share-Alike 3.0 License.  http://creativecommons.org/licenses/by-sa/3.0 Target:  Arduino  Attach the Zero cross pin of the module to Arduino External Interrupt pin Select the correct Interrupt # from the below table Pin    |  Interrrupt # | Arduino Platform --------------------------------------- 2      |  0            |  All 3      |  1            |  All 18     |  5            |  Arduino Mega Only 19     |  4            |  Arduino Mega Only 20     |  3            |  Arduino Mega Only 21     |  2            |  Arduino Mega Only  */

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(AC_LOAD, OUTPUT);	      // Set the AC Load as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
  // (10000us - 10us) / 128 = 75 (Approx)
  int dimtime = (75*dimming);      
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
  digitalWrite(AC_LOAD, LOW);    // triac Off
}

void loop()
{
  dimming = 128; 
  delay(100);
  dimming = 75;  
  delay(100);
  dimming = 25;  
  delay(100);

}

Скажите, куды копнуть. Требуется просто регулировать яркость свечения с помощью изменения значения одной переменной.

Vinegret
Offline
Зарегистрирован: 25.01.2015

MOC3021 поправочка.

b707
Offline
Зарегистрирован: 26.05.2017

В заголовке скетча есть табличка... какой пин с каким прерыванием.  Графы там съехали, но все же видно, что для прерывания 0 нужен пин 2.  А у вас - пин 3

DIVGENY
Offline
Зарегистрирован: 23.08.2016

вот похожая тема.

а вот табличка )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а еще у MOC302x zero cross атсуцтвует напрочь. 

nik182
Offline
Зарегистрирован: 04.05.2015

Ну так это хорошо. Был бы зерокрос ничего отдимерить не получилось бы. Только включено - выключено.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
Ну так это хорошо. Был бы зерокрос ничего отдимерить не получилось бы. Только включено - выключено.

Если пытаться "отдимерить" в каждом периоде - то "да".

А при наличии "зерокрос" обычно пропускается часть периодов целиком.

Vinegret
Offline
Зарегистрирован: 25.01.2015

Судя по табличке соответствия номера прерывания и пинов на моей ардуине, то выходит нулевое прерываение соответствует второму пину. Прерывание инициализируется на второй пин в строке 

attachInterrupt(0, zero_crosss_int, RISING);

Как я понимаю, не обязательно указывать номер пина для прерывания.

А третий пин как раз используется как выход для подачи сигнала на диммер для отсечения части синусоиды длительностью в 10 мс.

Так, что в коде должно быть все в порядке.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

код рабочий, может модуль не соответствует схеме и оптосимистор подтянут к +, а включение нагрузки управляется логическим нулем.  для проверки измени значения в сроках

  digitalWrite(AC_LOAD, LOW);     // начало импульса включения нагрузки
  delayMicroseconds(10);              // задержка 1мс
  digitalWrite(AC_LOAD, HIGH);    // окончание импульса

если отключить пин PWM от платы ардуино, то при подаче питания лампочка светиться не должна.
другого на ум не приходит, кроме банального пробоя симистора....

nik182
Offline
Зарегистрирован: 04.05.2015

andriano пишет:

Если пытаться "отдимерить" в каждом периоде - то "да".

А при наличии "зерокрос" обычно пропускается часть периодов целиком.

Абсолютно согласен. Только это уже не димер а PWM получится. И зерокросс можно вообще опустить. Подавай импульсы кратные 10мс - зерокросс сам разберётся что когда включать. Вот только лампочкой и мотором так управлять не очень хорошо. Лампочка моргает, мотор дёргается. А нагревателю даже лучше - бросков тока нет - меньше помех.  

DIVGENY
Offline
Зарегистрирован: 23.08.2016

Диммер

лампочке с ее инерцией по боку, если ты на нее смотреть не будишь...

Vinegret
Offline
Зарегистрирован: 25.01.2015

Привет, аццы! В общем решение проблемы нашлось усиленной гуглежкой различных диммеров на базе MOC3021. Нагуглил я следующий код.

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

//the interrupt function must take no parameters and return nothing
void zero_crosss_int()  //function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation : 1 full 50Hz wave =1/50=20ms 
  // Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) 
  // For 60Hz => 8.33ms (10.000/120)
  // 10ms=10000us
  // (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65

  int dimtime = (75*dimming);    // For 60Hz =>65    
  delayMicroseconds(dimtime);    // Wait till firing the TRIAC
  digitalWrite(AC_LOAD, HIGH);   // Fire the TRIAC
  delayMicroseconds(10);         // triac On propogation delay (for 60Hz use 8.33)
  digitalWrite(AC_LOAD, LOW);    // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
}

void loop()  {
  for (int i=5; i <= 128; i++){
    dimming=i;
    delay(10);
   }
}

По сути он отличается только содержанием функции loop. Но, почему-то, зараза работает. И теперь можно изменять яркость свечения лампы изменяя значение переменной dimming. В общем это все я к чему? Диммеры на базе MOC3021 вполне имеют право на существование. Всем спасибо. Все свободны.

Vinegret
Offline
Зарегистрирован: 25.01.2015

Да. Этот момент я тоже проверил. При отключении хвоста от PWM лампа не горит. Но стоит подключить вывод PWM к +5в, симистор открывается и лампа окрашивает все вокруг в те цвета, в которые она все вокруг окрашивает.

bankir_1986
Offline
Зарегистрирован: 23.03.2015

Так и первый пост работает. Как говорится "просто добавь воды" в вышем  delay(100); случае не различимы глазу при инепции лампы (или не присматривались как лампа 3 раза за секунду меняла яркость). Увеличь  delay(); и все сразу увидишь.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

Vinegret пишет:

и на попытки изменить яркость свечения не реагирует никак.

в первом посте выклал видео, там в конце видео в loop подобный код.

короче, налицо человек, не доводящий дело до конца....

Vinegret
Offline
Зарегистрирован: 25.01.2015

Буду исправляться, уважаемый развешиватель ярлыков.

Gomez
Offline
Зарегистрирован: 09.09.2017

Приподниму. Я правильно понимаю, что такую схему диммирования (как на плате, указанной в первом посте), можно применять и для LED-ламп (диммируемых, естественно)?

Просто хочу собрать управление с пульта четырехламповым светильником на светодиодных лампах.

Krik13
Offline
Зарегистрирован: 22.11.2017

Всем привет!

Пытаюсь разбираться с ардуино и электроникой.

Прикупил себе димммер как у топикстартера, с целью управления вибро-помпой (типа ULKA EX).

Попробовал регулировку диммера, подключив на выход вольтметр. Получил странные значения. Регулировка идет, но скачками и масимальные значения превышают 300В.

Есть ощущение, что вольтмертом я не вижу реальную картину. Это так? Может ли напряжение на выходе диммера быть больше входного напряжения? 

Правильный ли вообще подход - регулировать производительность соленоидного насоса диммером?

Sr.FatCat
Offline
Зарегистрирован: 19.02.2016

Krik13 пишет:

Есть ощущение, что вольтмертом я не вижу реальную картину. Это так? Может ли напряжение на выходе диммера быть больше входного напряжения? 


Лучше конечно почитать о ФИ методе регулирования. Ну и с RMS вольтметрами ознакомиться. 

Krik13 пишет:

Правильный ли вообще подход - регулировать производительность соленоидного насоса диммером?


Не правильный. Соленоидом, если только это не специальный пропорциональный клапан рулить нельзя. Он или вкл или выкл.

madeinjamming
Offline
Зарегистрирован: 13.03.2018

Подскажите пожалуйста вашу схему можно применять и для LED-ламп?

yden
Offline
Зарегистрирован: 30.01.2016

Добрый всем.

Подскажите, плиз. Такой же девайс как и у ТС. Не могу заставить работать. Заливаю упомянутые выше скетчи - тишина. Ардуино нано, D3 пин - PWM.

Есть какой-то секрет?

 

благодарю

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

yden пишет:
D3 пин - PWM.

Этого мало. Нужно подключить питание и вывод zc модуля подключить на пин 2 дуины.

yden
Offline
Зарегистрирован: 30.01.2016

OlegK пишет:

yden пишет:
D3 пин - PWM.

Этого мало. Нужно подключить питание и вывод zc модуля подключить на пин 2 дуины.

Делал. Все так же, не фурычит.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

1. Переменную, которая используется в прерывании, нужно объявить с квалификатором volatile
volatile int dimming = 128
2. Возможно, 10 мксек мало для открытия симистора, попробуйте поставить 30 для проверки.

KVL80
Offline
Зарегистрирован: 12.01.2018

Подскажите, как возможно упростить схему. Установлено 2 симистра, для регулирования мощности и одна оптопара для контроля "0". Составил скетч в FL Prog. Как прописать, чтобы использовался один вход на Pin2?

#define REMOTEXY_MODE__HARDSERIAL
#include <RemoteXY.h>
#define REMOTEXY_SERIAL Serial
#define REMOTEXY_SERIAL_SPEED 9600
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] = {2, 0, 19, 0, 8, 13, 0, 4, 128, 9, 15, 78, 6, 2, 26, 4, 128, 8, 32, 80, 6, 2, 26};
struct {
  signed char ten_1;  // регулятор мощности ТЭН 1
  signed char ten_2;  //регулятор мощности ТЭН 2
  unsigned char connect_flag;
} RemoteXY;
#pragma pack(pop)
int _SCT3_DLDIV = 0;
bool _SCT3_DLOSN = 0;
unsigned long _SCT3_DLST = 0UL;
bool _SCT3_DLIDM = 0;
int _SCT2_DLDIV = 0;
bool _SCT2_DLOSN = 0;
unsigned long _SCT2_DLST = 0UL;
bool _SCT2_DLIDM = 0;
void setup()
{
  RemoteXY_Init ();
  pinMode(2, INPUT);  // вход контроля "0"
  pinMode(4, OUTPUT);  // выход на симистр 1
  pinMode(3, INPUT);  // вход контроля "0"
  pinMode(5, OUTPUT);  // выход на симистр 2
  TCCR2A = 0;
  TCCR2B = 0 << CS22 | 1 << CS21 | 0 << CS20;
  TIMSK2 = 1 << TOIE2;
  TCNT2 = 210;
  attachInterrupt(0, _SCT2positiveCoutFunction, CHANGE );
  attachInterrupt(1, _SCT3positiveCoutFunction, CHANGE );
}
void loop()
{ RemoteXY_Handler  ();
 
 
 
 
 
  //Плата:1
  _SCT3_DLDIV = (map(((RemoteXY.ten_2)), (100), (0), (873), (8639)));
  _SCT2_DLDIV = (map(((RemoteXY.ten_1)), (100), (0), (873), (8639)));
 
 
 
 
}
void  _SCT2positiveCoutFunction()
{ if ((!_SCT2_DLOSN) && (!_SCT2_DLIDM)) {
    _SCT2_DLIDM = 1;
    _SCT2_DLST = micros();
  }
}
void  _SCT3positiveCoutFunction()
{ if ((!_SCT3_DLOSN) && (!_SCT3_DLIDM)) {
    _SCT3_DLIDM = 1;
    _SCT3_DLST = micros();
  }
}
ISR (TIMER2_OVF_vect)
{ if ((_SCT2_DLIDM) || (_SCT3_DLIDM)) {
    if (_SCT2_DLIDM) {
      if (_SCT2_DLOSN) {
        if ((_SCT2_DLST + 4) < micros()) {
          _SCT2_DLST = micros();
          _SCT2_DLOSN = 0;
          digitalWrite(4, 0);
          _SCT2_DLIDM = 0;
        }
      } else {
        if ((_SCT2_DLST + _SCT2_DLDIV) < micros()) {
          _SCT2_DLST = micros();
          _SCT2_DLOSN = 1;
          digitalWrite(4, 1);;
        }
      }
    }
    if (_SCT3_DLIDM) {
      if (_SCT3_DLOSN) {
        if ((_SCT3_DLST + 4) < micros()) {
          _SCT3_DLST = micros();
          _SCT3_DLOSN = 0;
          digitalWrite(5, 0);
          _SCT3_DLIDM = 0;
        }
      } else {
        if ((_SCT3_DLST + _SCT3_DLDIV) < micros()) {
          _SCT3_DLST = micros();
          _SCT3_DLOSN = 1;
          digitalWrite(5, 1);;
        }
      }
    }
  }
  TCNT2 = 210;
}
yden
Offline
Зарегистрирован: 30.01.2016

Запустил.

Вопрос: к одному контроллеру можно пару-тройку диммеров подключить?

yden
Offline
Зарегистрирован: 30.01.2016

апну тему

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014