Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.12.2017, 02:03   #821
wmv84
Junior Member
 
Регистрация: 15.12.2017
Сообщений: 2
Вес репутации: 0
wmv84 is an unknown quantity at this point
По умолчанию

Здравствуйте! Есть желание сделать двухканальную гирлянду на ардуино на основе двух диммеров. Схему спаял, код залил, все работает. Но можно ли заставить ардуино выдавать на 4 пин цифровой сигнал для управления вторым диммером с несколько отличным наполнением скетча. Или брать вторую Нано и заливать в нее свой скетч и привязывать свой диммер?
int AC_LOAD = 3;
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
// 10ms=10000us
// (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65
int dimtime = (75*dimming); // For 60Hz =>65
delayMicroseconds(dimtime); // Off cycle
digitalWrite(AC_LOAD, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(AC_LOAD, LOW); // triac Off
}

void loop() {

for (int i=30; i <= 100; i++){
dimming=i;
delay(3);
}
for (int i=5; i <= 100; i++){
dimming=i;
delay(10);
}
for (int i=30; i <= 100; i++){
dimming=i;
delay(3);
}
for (int i=5; i <= 100; i++){
dimming=i;
delay(10);
}
for (int i=100; i >= 10; i--){
dimming=i;
delay(20);
}
for (int i=20; i <= 100; i++){
dimming=i;
delay(30);
}
for (int i=5; i <= 100; i++){
dimming=i;
delay(10);}
for (int i=2; i <= 100; i++){
dimming=i;
delay(1);}
for (int i=2; i <= 100; i++){
dimming=i;
delay(2);}
for (int i=5; i <= 100; i++){
dimming=i;
delay(3);}
for (int i=15; i <= 100; i++){
dimming=i;
delay(4);}
for (int i=25; i <= 100; i++){
dimming=i;
delay(5);}
for (int i=45; i <= 100; i++){
dimming=i;
delay(15);}
}
wmv84 вне форума   Ответить с цитированием
Старый 15.12.2017, 13:44   #822
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

В шапке пример для работы с 3-мя диммерами
Admin вне форума   Ответить с цитированием
Старый 23.12.2017, 01:20   #823
wmv84
Junior Member
 
Регистрация: 15.12.2017
Сообщений: 2
Вес репутации: 0
wmv84 is an unknown quantity at this point
Thumbs up

Цитата:
Сообщение от Admin Посмотреть сообщение
В шапке пример для работы с 3-мя диммерами
Разобрался! Вы Золото
wmv84 вне форума   Ответить с цитированием
Старый 06.02.2018, 01:27   #824
kastor666
Junior Member
 
Регистрация: 06.02.2018
Сообщений: 2
Вес репутации: 0
kastor666 is an unknown quantity at this point
По умолчанию

Admin, использую ваш код со своим провереным Serial управлением из 5 ANSI символов, первые два - номер канала, 3тий - H или L для прямого выключения, 4и5 - значение яркости.Перевод в цифровые занчения делаю так:

if (Serial.available() > 0) { //если есть доступные данные
// считываем байт

///----------функція з димера 16канал///////


//Serial.flush();

er=Serial.read();
er1=Serial.read();

val = Serial.read(); // on/off var

port1 = Serial.read(); // read the port
port2 = Serial.read();



int p11=(int)er-48;
int p22=(int)er1-48;

pp=p11*10+p22;

chan_num_66=pp; //номер каналу

int p1=(int)port1-48;
int p2=(int)port2-48;
p=p1*10+p2;


dim_com =p; // значение яркости
chan_num=pp; // номер канала

UART_Init(19200); //инициализация порта - отключил, использую Serial.begin/

Если постоянно Arduino шлет в терминал данные, то в ответ я тоже могу посылать. Если остановить передачу из Arduino, то и из терминала данные не доходят вообще либо не то что отправлено.
kastor666 вне форума   Ответить с цитированием
Старый 06.02.2018, 06:47   #825
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Сейчас у меня нет диммера, что бы проверить.
Но могу предложить попробовать все таки использовать код из шапки и отправлять 5 байт массивом. Дело в том что прерывания для обработки диммера срабатывают примерно 150 раз в секунду, а Serial.begin очень нагроможденная функция, к тому же скорость передачи у Вас заниженная, и не успевает отработать. Можно так же попробовать при работе serial запретить прерывания.
Хотя возможно проблема в другом, как я писал Выше нужно пробовать
Admin вне форума   Ответить с цитированием
Старый 07.02.2018, 03:54   #826
kastor666
Junior Member
 
Регистрация: 06.02.2018
Сообщений: 2
Вес репутации: 0
kastor666 is an unknown quantity at this point
По умолчанию

Вопрос таки не к коду диммера, как выяснилось.
kastor666 вне форума   Ответить с цитированием
Старый 07.03.2018, 10:39   #827
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Регулировки диммера осуществряется энкодером https://duino.ru/product_info.php/in...ti-dimmer.html
Нажатием на энкодер можно вкл и выкл диммер, при этом диммер сохраняет уровень яркости и состояние выключателя. Если обесточить, то диммер прочитает последние состояние которое было до выключения
Код не проверялся на реальном устройстве, так что прошу отписаться после проверки
PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru

// Выводы ЭНКОДЕРА
#define CLK 3  // Clock Подключаем к INT1, нельзя переназначать
#define DT 4  // выторой вывод энкодера
#define SW 5  // switch кнопка энкодера


#define ZD 2  // zero detection детектор ноля
#define GT 6  // Gate Triac управление симристором
#define Min 0 // минимальное значение диммера для устранения мерцания
#define Max 255 //максимальное значение диммера для устранения мерцания


volatile uint8_t ticdimmer;
boolean DT_laststat_swtmp// последнее состояние энкодера , состояние выключателя


void setup()  
{
  
pinMode(CLK,INPUT_PULLUP); // Clock Подключаем к INT1, нельзя переназначать
  
pinMode(DTINPUT_PULLUP); // выторой вывод энкодера
  
pinMode(SWINPUT_PULLUP); // кнопка энкодера
  
pinMode(ZDINPUT);     // детектор нуля
  
pinMode(GTOUTPUT);    // управление симистором
  
digitalWrite(GT0);    // отключить симмистор


  
attachInterrupt(0detect_upLOW);  // настроить срабатывание прерывания int0 на низкий уровень
  
attachInterrupt(1encoderTickCHANGE); // прерывания от Энкодера
  
  
StartTimer1(halfcycle40);        // время для одного разряда ШИМ в мкс
  
StopTimer1(); //остановить таймер


  
stat_sw=ReadEEPROM_Byte(1);
  if(
stat_sw) {dimmer=ReadEEPROM_Byte(0);} 
    else {
dimmer=255;}
 
  
DT_last digitalRead(CLK);         // считываем положение CLK
  
Serial.begin(115200);           // для отладки
}


void loop()
{
tmp=digitalRead(SW); //прочитать состояние кнопки
delay(50); // исключаем дребезг кнопки
if( !digitalRead(SW) && !stat_sw && !tmp)//если было нажатие кнопки и выключатель в состооянии выкл.
    
{
      
dimmer=ReadEEPROM_Byte(0);//прочитать состояние диммера
      
stat_sw=true;//изменить состояние выключателя
      
WriteEEPROM_Byte(1stat_sw);//записать состояние выключателя
      
while( !digitalRead(SW)){}
      
StartTimer1(halfcycle40);   //запустить таймер
    
}
      else 
      if( !
tmp && !digitalRead(SW) && stat_sw )//если было нажатие кнопки и состояние выключателя вкл.
      

         
StopTimer1(); //остановить таймер
         
WriteEEPROM_Byte(0dimmer); //записать состояние диммера
         
dimmer=255;
         
stat_sw=false;//изменить состояние выключателя
         
WriteEEPROM_Byte(1stat_sw); //записать состояние выключателя
         
while( !digitalRead(SW)){} 
      }
  
  
//Serial.println(dimmer); 
  //Serial.println(stat_sw);
  
delay(50);         
}
//********************обработчики прерываний*******************************
void halfcycle()  //прерывания таймера

  
tic++;  //счетчик  
  
if( dimmer tic digitalWrite(GTHIGH); //управляем выходом на симистор
}


void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту
{  
 
tic=0;             //обнулить счетчик
 
ResumeTimer1();   //запустить таймер
 
attachInterrupt(0detect_downHIGH);  //перепрограммировать прерывание на другой обработчик
}  


void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту
{   
 
StopTimer1();                      //остановить таймер
 
digitalWrite(GTLOW);             //логический ноль на выход
 
tic=0;       //обнулить счетчик
 
attachInterrupt(0detect_upLOW); //перепрограммировать прерывание на другой обработчик



void encoderTick()     // Обратка прерываний от Энкодера
{
  
uint8_t DT_now digitalRead(CLK);  // считываем текущее положение CLK
  
  
if (DT_now != DT_last)              // если предыдущее и текущее положение CLK не равны, значит был поворот 
  
{                     
    if (
digitalRead(DT) != DT_now)    // если DT не равен CLK, значит вращение по часовой стрелке
    
{                             
      if( 
dimmer Max dimmer++;    // прибавить яркость
    
} else {                          // если DT равен CLK, значит вращение против часовой
             
if( dimmer Min dimmer--;  // убавить яркость           }
            
}
  }         
  
DT_last DT_now;                   // сохранить положение CLK для следующей проверки

Admin вне форума   Ответить с цитированием
Старый 10.03.2018, 18:32   #828
illinoisssss
Junior Member
 
Регистрация: 10.03.2018
Сообщений: 1
Вес репутации: 0
illinoisssss is an unknown quantity at this point
По умолчанию

Доброго времени суток. А возможно ли как то изменить код программы из шапки так, чтобы через один симистор диммировать верхнюю и нижнюю полу волны синусоиды по отдельности? И что для этого требуется изменить в коде программы? Допустим, прописываем в программе такую команду, после которой симистор начинает пропускать только верхнюю полу волну.
illinoisssss вне форума   Ответить с цитированием
Старый 11.03.2018, 23:35   #829
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

А какой в этом смысл? Кому это будет нужно?
Admin вне форума   Ответить с цитированием
Старый 16.03.2018, 07:53   #830
KVL80
Junior Member
 
Регистрация: 16.03.2018
Сообщений: 8
Вес репутации: 0
KVL80 is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от alex74 Посмотреть сообщение
Спасибо,работает.А возможно ли данным вариантом димера управлять через Serial ?
Как это сделать? Стоит ARDUINO NANO.
KVL80 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 47 (пользователей: 0 , гостей: 47)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 01:58. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика