Как правильно управляь диммером на болших расстояниях?

isdzaurov
Offline
Зарегистрирован: 18.05.2015

Всем добрый день! 

Дорогие ардуинщики помогите мне с одной задачей. 

Я управляю диодной лентой 220 вольт, через выпрямитель.

При помощи модуля AC light dimmer module

При прямом подключении ленты к диммеру или через кабель 20 метров, все работает хорошо, но при увеличении кабеля например до 50-70 метров, лента всегда светится и не манят свою яркость. Когда же я подключаю лампу накаливания то все работает хорошо даже на 100 метрах. 

Я использую данный код:

#include  <TimerOne.h>          // Avaiable from http://www.arduino.cc/playground/Code/Timer1
volatile int i=0;               // Variable to use as a counter volatile as it is in an interrupt
volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 3;                // Output to Opto Triac
int dim = 0;                    // Dimming level (0-128)  0 = on, 128 = 0ff
int inc=1;                      // counting up or down, 1=up, -1=down
int freqStep = 75;    // This is the delay-per-brightness step in microseconds.
                      // For 60 Hz it should be 65
// It is calculated based on the frequency of your voltage supply (50Hz or 60Hz)
// and the number of brightness steps you want. 
// 
// Realize that there are 2 zerocrossing per cycle. This means
// zero crossing happens at 120Hz for a 60Hz supply or 100Hz for a 50Hz supply. 
// To calculate freqStep divide the length of one full half-wave of the power
// cycle (in microseconds) by the number of brightness steps. 
//
// (120 Hz=8333uS) / 128 brightness steps = 65 uS / brightness step
// (100Hz=10000uS) / 128 steps = 75uS/step
void setup() {                                      // Begin setup
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);      
  // Use the TimerOne Library to attach an interrupt
  // to the function we use to check to see if it is 
  // the right time to fire the triac.  This function 
  // will now run every freqStep in microseconds.                                            
} 

void zero_cross_detect() {    
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  i=0;
  digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
}                                 
 
// Turn on the TRIAC at the appropriate time
void dim_check() {                   
  if(zero_cross == true) {              
    if(i>=dim) {                     
      digitalWrite(AC_pin, HIGH); // turn on light       
      i=0;  // reset time step counter                         
      zero_cross = false; //reset zero cross detection
    } 
    else {
      i++; // increment time step counter                     
    }                                
  }                                  
}                                   
 
void loop() {                        
  dim+=inc;
  if((dim>=128) || (dim<=0))
    inc*=-1;
  delay(18);
}

На одном из форумов мне сказали что при подключении лампы накаливания все работает хорошо так как у нее есть инерционность. Я заметил в этом логику, но при этом когда я использую другой код, который не учитывает проход через ноль и не отслеживает его, а просто изменяет PWM выход от 20 до 80% все работает плавно, даже на 100 метрах как с лампой так и с лентой. Я думаю что все дело в выпрямителе он же преобразовывает ток в пульсирующий.

//Libraries
#include <RBDdimmer.h>//https://github.com/RobotDynOfficial/RBDDimmer

//Parameters
const int zeroCrossPin  = 2;
const int acdPin  = 3;
int MIN_POWER  = 0;
int MAX_POWER  = 80;
int POWER_STEP  = 2;

//Variables
int power  = 0;

//Objects
dimmerLamp acd(acdPin);

void setup(){
//Init Serial USB
Serial.begin(9600);
Serial.println(F("Initialize System"));
acd.begin(NORMAL_MODE, ON);
}

void loop(){
  testDimmer();
}

void testDimmer(){/* function testDimmer */ 
////Sweep light power to test dimmer
  for(power=MIN_POWER;power<=MAX_POWER;power+=POWER_STEP){
    acd.setPower(power); // setPower(0-100%);
      Serial.print("lampValue -> ");
      Serial.print(acd.getPower());
      Serial.println("%");
    delay(100);
  }

  for(power=MAX_POWER;power>=MIN_POWER;power-=POWER_STEP){
    acd.setPower(power); // setPower(0-100%);
      Serial.print("lampValue -> ");
      Serial.print(acd.getPower());
      Serial.println("%");
    delay(100);
  }
}

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

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

вопрос-то в чем?

isdzaurov
Offline
Зарегистрирован: 18.05.2015

b707 пишет:

вопрос-то в чем?

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

SAB
Offline
Зарегистрирован: 27.12.2016

Использовать RS485 тогда и на километре без проблем будет управлять.

Komandir
Offline
Зарегистрирован: 18.08.2018

Как вариант использовать провод для сварочных аппаратов :-)

isdzaurov
Offline
Зарегистрирован: 18.05.2015

SAB пишет:

Использовать RS485 тогда и на километре без проблем будет управлять.

Вы сейчас говорите про управление модулем на расстояние киллометр, но у меня модуль рядом с контроллером, а вот лента далеко от модуля диммера. 

isdzaurov
Offline
Зарегистрирован: 18.05.2015

Komandir пишет:

Как вариант использовать провод для сварочных аппаратов :-)

Чем они лучше? 

Komandir
Offline
Зарегистрирован: 18.08.2018

Потери на большой длине меньше !

SAB
Offline
Зарегистрирован: 27.12.2016

Так вы будете управлять по RS485 самим контроллером, а он будет управлять лентой.