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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.02.2014, 18:03   #1
Viktor161
Junior Member
 
Регистрация: 05.02.2014
Сообщений: 3
Вес репутации: 0
Viktor161 is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

А что для управления водяным насосом эта вещь не подойдет?

Последний раз редактировалось Viktor161; 05.02.2014 в 18:43.
Viktor161 вне форума   Ответить с цитированием
Старый 05.02.2014, 19:31   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,617
Вес репутации: 9822
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
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Для управления оборотами, не подойдет
Для включения и выключения насоса можно использовать твердотельное реле
Admin вне форума   Ответить с цитированием
Старый 05.02.2014, 20:14   #3
Viktor161
Junior Member
 
Регистрация: 05.02.2014
Сообщений: 3
Вес репутации: 0
Viktor161 is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

А вот надо управлять оборотами) это реализуемая задача? если да, подскажите пожалуйста в какую сторону копать!
Viktor161 вне форума   Ответить с цитированием
Старый 05.02.2014, 21:53   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,617
Вес репутации: 9822
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
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Копайте в сторону частотного преобразователя
Admin вне форума   Ответить с цитированием
Старый 06.02.2014, 13:23   #5
kentik
Junior Member
 
Регистрация: 09.10.2013
Сообщений: 27
Вес репутации: 0
kentik is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

какой насос?
данная схема подходит для управления 220 вольт переменки однофазным коллекторным двигателем. именно скорость вращения регулируется.
kentik вне форума   Ответить с цитированием
Старый 06.02.2014, 16:21   #6
Viktor161
Junior Member
 
Регистрация: 05.02.2014
Сообщений: 3
Вес репутации: 0
Viktor161 is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Насос будет такой:
http://market.yandex.ru/model.xml?hi...502&ncrnd=5232
по идее он коллекторный, это что значит диммер подойдет?
Viktor161 вне форума   Ответить с цитированием
Старый 10.02.2014, 14:34   #7
alex.spb
Junior Member
 
Регистрация: 10.02.2014
Сообщений: 2
Вес репутации: 0
alex.spb is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Приветствую всех!
Собрал сабжевый диммер, на след элементах: триак BT138, оптрон PC814A, оптопара MOC3022.
Подключил к диммеру электронный транс для галогеновых ламп на 12В. Трансформатор заявлен как "Dimmable with Cut-Off dimmer"
Код скетча:
PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <MsTimer2.h>
volatile uint8_t ticDimmer1 255;
boolean MoveDetect false;

void setup() 

  
D13_Out;//Настраиваем порт на выход
  
D13_Low;
  
D3_In//int1
  
D6_In// PIR Sensor

    
attachInterrupt(1detect_upLOW); 
    
StartTimer1(halfcycle40); //время для одного разряда ШИМ
    
StopTimer1(); //остановить таймер
    
delay(30000); // калибровка PIR
    
UART_Init(115200); //инициализация порта
    
uint8_t *buffer = (unsigned char*)"Start";
    
UART_SendArray(buffer,5);
}
****************************
void halfcycle()  //прерывания таймера

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

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

//*************************************************************************
void turnOFF() // Функция таймера выключения
{
      
Dimmer1 255;//dimmer off
      
MsTimer2::stop(); // откл таймер
}
void loop() 
{
  if (
D6_Read == HIGH// сработал PIR сенсор
  
{
     if (
MoveDetect// Движение уже было
         
MsTimer2::stop(); //  тормозим таймер отключения
    
else
      {
        
MoveDetect true
        
Dimmer1 150;// даем не полную яркость
       

  }
  else 
//PIR сенсор молчит
  
{
  if (
MoveDetect
  {
    
MoveDetect false;
    
MsTimer2::set(15000turnOFF); // запускаем таймер отключения на 15 сек
    
MsTimer2::start();
  }
  }

На обычной лампе накаливания схема и код работает как надо!
Но галогенки при включении на неполную яркость (Dimmer1=150) сначала не долго мигают, потом горят в полную яркость.
Если вход транса нагрузить(зашунтиров� �ть) лампой накаливания, то и лампа накаливания и галогенки работают как надо. Пробовал шунтировать транс резистором 0,5М-1,5М без результата.
Снаббер стоит и при нормальное работе он шумит

Подскажите как заставить транс и галогенки работать адекватно.
P.S. мне не совсем понятно как работает триак на второй полуволне, он постоянно закрыт?

Последний раз редактировалось alex.spb; 10.02.2014 в 15:57.
alex.spb вне форума   Ответить с цитированием
Старый 10.02.2014, 18:18   #8
alex.spb
Junior Member
 
Регистрация: 10.02.2014
Сообщений: 2
Вес репутации: 0
alex.spb is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

допустим оптрон на выходе дает меандр 100Гц. тем самым он делит входной полупериод на два или я не так понимаю? тем не менее по коду второй полупериод отсекается. получается вторая половина входного меандра ВСЕГДА отсекается?
дожно же быть как то так:

и второй вопрос: если выходной меанд 100Гц, длительность полупериода 5мс. почему таймер рассчитан на 40мкс*250 = 10мс??

Последний раз редактировалось alex.spb; 10.02.2014 в 18:26.
alex.spb вне форума   Ответить с цитированием
Старый 10.02.2014, 20:30   #9
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,617
Вес репутации: 9822
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
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Отсекает также как и на Вашей осциллограмме
Admin вне форума   Ответить с цитированием
Старый 27.02.2014, 12:31   #10
Morfeus48
Junior Member
 
Регистрация: 12.12.2013
Сообщений: 4
Вес репутации: 0
Morfeus48 is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Уважаемы форумчане, прошу Вас подсказать: данный вариант диммера использует функцию внешнего прерывания attachInterrupt(interrupt, function, mode) которая запускается делителем ноля, в результате ардуина напрочь отказывается принимать и обрабатывать какие-либо сигналы получаемые с радиоприемника на 433.92 Мгц (приемник подключен к 6 ноге Arduino Pro Mini). Если во время работы устройства делитель нуля отключить, то радиоканал работает идеально, ардуина получает данные, стоит только подключить делитель ноля и данные не приходят. Для радиоканала используется библиотека VirtualWire совместно с EasyTransferVirtualWire. Может кто сталкивался с похожей проблемой подскажите.

Скетч:
PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <EEPROM.h>

const int led_pin 13;                     //нога, которой будем дрыгать для индикации
const int receive_pin 6;                 //нога к которой подключен приемник
const int ID 18420;                     //ИД передатчика на который мы настраиваемся
unsigned int unique_device_id 0;       //ИД этого устройства будет записан в эту переменную
int lhmillis ;                      //переменная для фиксации времени команды на плавное гашение-зажигания
const int tg 12;                     //интервал в миллисикундах между степенями гашения-зажигания
const int work 12000;               //врямя работы диммера
int Dimmer1M ;                       //переменная для хранения значения Dimmer1 при операциях
boolean flag true;                //TRUE - при подаче питания диммер ненадолго включится, если FALSE то не включится
unsigned long time;                //переменная для фиксации времени работы диммера
volatile uint8_t tic 0;
volatile uint8_t Dimmer1 200;
//uint8_t data;

//create object
EasyTransferVirtualWire ET
//char buf[120];
/*
device_id — идентификатор устройства, отправившего пакет. 
Тип данных: unsigned int (длина 2 байта, диапазон значений от 0 до 65535) — как мне кажется, вполне достаточно для домашней сети.

destination_id — идентификатор устройства, кому предназначен пакет. 
Тип данных тот же, что и у device_id. 
Важно отметить, что пакеты всё равно будут получаться всеми приёмниками, но уже программой на самом приёмнике можно «отсекать» пакеты, которые устройству не предназначены. 
Так же можно принять в качестве правила то, что значение «0» в данном поле означает широковещательный пакет.

packet_id — идентификатор пакета. 
Тип тот же unsigned int. 
По замыслу, при отправке пакет «помечается» случайным числом, что может быть использовано для повторной отправки одного и того же пакета несколько раз с каким-то интервалом 
— ввиду ненадёжности протокола это имеет смысл, но принимающее устройство должно фильтровать повторные команды дабы не выполнять одно и то же действие в качестве реакции на пакет данных.

command — тип команды. 
Тип данных byte (длина 1 байт, диапазон значений от 0 до 255). 
Это так называемый «класс команды», а по сути информация о том, что за данные мы посылаем. 
Например, мы можем составить собственную таблицу команд, отведя для команды управления открытием/закрытием номер 10, а для команды передачи данных о температуре номер 15. 
Главное, чтобы эта таблица у нас была постоянной. 
А можно поступить ещё хитрее — подсмотреть возможные команды в том же протоколе ZWave и использовать у себя их таблицу, чтобы было всё «как у взрослых», и не нужно было заботиться о сохранности этих ценных сведений.

data — собственно данные. 
Тип данных int (длина 2 байта, диапазон значений от -32,768 до 32,767. 
В этом поле мы передаём непосредственно данные в виде одного числа. 
Мало? Ну мне показалось достаточным. 
Температуру можно передать (например усвловившись, что она умножена на 100), статус датчика движения — легко, команду для приёмника с реле — проще простого. 
Текстовые данные на внешний дисплей, конечно, не отправишь, но такой цели и не ставилось, а для моих настоящих и будущих устройств хватит за глаза и пары десятков чисел, чтобы описать все возможные команды.
*/
struct SEND_DATA_STRUCTURE{
  
//наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
  //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
  
unsigned int device_id;
  
unsigned int destination_id;  
  
unsigned int packet_id;
  
byte command;
  
int data;
};

//переменная с данными нашей структуры
SEND_DATA_STRUCTURE mydata;

//ниже пару функций для записи данных типа unsigned int в EEPROM
void EEPROMWriteInt(int p_addressunsigned int p_value)
      {
      
byte lowByte = ((p_value >> 0) & 0xFF);
      
byte highByte = ((p_value >> 8) & 0xFF);

      
EEPROM.write(p_addresslowByte);
      
EEPROM.write(p_address 1highByte);
      }

unsigned int EEPROMReadInt(int p_address)
      {
      
byte lowByte EEPROM.read(p_address);
      
byte highByte EEPROM.read(p_address 1);

      return ((
lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
      }

void setup()
{
    
D2_In;  //настраиваем порт на вход для отслеживания прохождения сигнала через ноль  
    
D4_Out//Настраиваем порты на выход
    
D4_Low//установить на выходах низкий уровень сигнала
    
    //CHANGE – прерывание вызывается при любом изменении значения на входе; 
    //RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH) 
    //FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low) 
    
attachInterrupt(0detect_upLOW);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
    
StartTimer1(halfcycle40); //время для одного разряда ШИМ
    
StopTimer1(); //остановить таймер
    
    
pinMode(led_pinOUTPUT);
    
Serial.begin(115200); // Debugging only

    
ET.begin(details(mydata));
    
// Initialise the IO and ISR
    
vw_set_rx_pin(receive_pin);
    
vw_setup(2000);      // Скорость приёма
    
vw_rx_start();       // Запуск режима приёма
    
  // Device ID
  
Serial.print("Getting Device ID... "); 
  
unique_device_id=EEPROMReadInt(0); 
  if (
unique_device_id<10000 || unique_device_id>60000) {
   
Serial.print("N/A, updating... "); 
   
unique_device_id=random(1000060000);
   
EEPROMWriteInt(0unique_device_id);
  }
  
Serial.println(unique_device_id);
  
}

//********************обработчики прерываний*******************************
void halfcycle()  //прерывания таймера

  
tic++;  //счетчик  
  
if(tic 200tic 200;     //ограничитель минимального накала спирали лампы
  
if(Dimmer1 tic D4_High//управляем выходом
}

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

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

//*************************************************************************

void loop()
{
Start
//  Обработка плавного гашения и зажигания света
  
if (Dimmer1M Dimmer1)//  если есть команда на плавное гашение
  
{
    if (
Dimmer1<=200)// если состояние диммера не на минимальном значении
    
{
      if( 
millis()-lhmillis>tg// и прошло время плавности гашения
      
{
        
Dimmer1++; // увеличиваем значение переменной на единицу
        
lhmillis millis(); // обновляем значение переменной
        //Serial.println(Dimmer1);
      
}
    }
  }
  if (
Dimmer1M Dimmer1)//  если есть команда на плавное включение
  
{
      if( 
millis()-lhmillis>tg// дальше по аналогии с гашением
      
{
        
Dimmer1--;
        
lhmillis millis();
        
//Serial.println(Dimmer1);
      
}
  }



    if(
ET.receiveData()) // получили пакет данных, обрабатываем
    
{  
      if(
mydata.device_id == ID)        //проверим, от кого пришел пакет
        
{
          
digitalWrite(led_pinHIGH);
          
Serial.print("Got: ");
          
Serial.print("Device ID: ");
          
Serial.print(mydata.device_id);
          
Serial.print(" Destination ID: ");
          
Serial.print(mydata.destination_id);        
          
Serial.print(" Packet ID: ");
          
Serial.print(mydata.packet_id);
          
Serial.print(" Command: ");
          
Serial.print(mydata.command);
          
Serial.print(" Data: ");
          
Serial.print(mydata.data);
          
Serial.println();
          if(
mydata.data == 1
            {
              
time millis();
              
flag true;
            }
          
Serial.println(Dimmer1);
          
digitalWrite(led_pinLOW);
        }
    }
if(
flag == true)
  {
    
Dimmer1M 0;
    if( 
millis()-time>work)
      {
         
Dimmer1M 200
         
flag false;
      }
  }
      
End

Последний раз редактировалось Morfeus48; 27.02.2014 в 12:52. Причина: Добавил скетч
Morfeus48 вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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