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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.02.2014, 15:18   #271
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

если я правильно понял последний вопрос, то мне уже ответ дали, просто процитирую -так же как и на первой

Цитата:
Сообщение от Admin Посмотреть сообщение
спад и подъем, это я имел ввиду нарастающий фронт сигнала и спадающий фронт(передний и задний фронт меандра)
Так как оптрон имеет два втречнопараллельных светодиода, то у оптрона на выходе будет меандр с частотой 100Гц
Поэтому обработка положительного и отрицательного полупериода абсолютно идентичны
Bulatovor вне форума   Ответить с цитированием
Старый 10.02.2014, 18:18   #272
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   #273
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
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   #274
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 вне форума   Ответить с цитированием
Старый 27.02.2014, 13:49   #275
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
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, работающий в фоновом режиме

Цитата:
данный вариант диммера использует функцию внешнего прерывания attachInterrupt(interrupt, function, mode) которая запускается делителем ноля
Что за делитель?
Я не уверен что библиотека CyberLib подойдет под Arduino микро
Admin вне форума   Ответить с цитированием
Старый 27.02.2014, 14:07   #276
Morfeus48
Junior Member
 
Регистрация: 12.12.2013
Сообщений: 4
Вес репутации: 0
Morfeus48 is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Извиняюсь, неверно выразился, не делитель ноля, а детектор ноля, как на Вашей схеме - PC814. А ардуина используется не микро, а про мини. Диммер работает, плавно зажигает и гасит лампочку, а соответственно библиотека CyberLib очень даже подходит, проблема в невозможности получения данных из радиоканала во время работы диммера. Стоит только остановить посстоянно возникающие внешние прерывания, отключив РС814 от сети, как данные из радиоканала успешно принимаются и обрабатываются ардуиной. А как получать данные не отключая РС814 ума не приложу
Morfeus48 вне форума   Ответить с цитированием
Старый 27.02.2014, 14:27   #277
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
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, работающий в фоновом режиме

Цитата:
проблема в невозможности получения данных из радиоканала во время работы диммера. Стоит только остановить посстоянно возникающие внешние прерывания, отключив РС814 от сети, как данные из радиоканала успешно принимаются и обрабатываются ардуиной. А как получать данные не отключая РС814 ума не приложу
Прерывания диммера происходит каждые 9мс + 1мс
Когда прерывание обрабатывается, то другие прерывания не смогут в этот момент запустить свой обработчик. Получается что Вам нужно уложиться в 9 мс и разрешать прием данных с приемника только в окне между прерываниями
Admin вне форума   Ответить с цитированием
Старый 27.02.2014, 15:51   #278
Morfeus48
Junior Member
 
Регистрация: 12.12.2013
Сообщений: 4
Вес репутации: 0
Morfeus48 is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

А можно ли как нибудь прерывания приемника сделать главнее прерываний диммера? В окно 9 мс влезть не удается, даже отправляя по 20 одинаковых пакетов с повышенной частотой передачи. С повышением частоты передачи только больше пакетов по дороге теряться стало, а толка 0... Уменьшать размер пакета тоже смысла нет, он и так очень маленький (про содержимое пакетов данных написано в комментариях скетча).
Morfeus48 вне форума   Ответить с цитированием
Старый 27.02.2014, 16:03   #279
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
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, работающий в фоновом режиме

Цитата:
А можно ли как нибудь прерывания приемника сделать главнее прерываний диммера?
Честно говоря не знаю
Почитайте в DataSheet по контроллеру Atmega328
Admin вне форума   Ответить с цитированием
Старый 02.03.2014, 01:14   #280
Murkur
Member
 
Регистрация: 13.12.2013
Сообщений: 50
Вес репутации: 0
Murkur is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Скажите, пожалуйста, по поводу такого варианта. Есть частотный преобразователь для управления двигателя, схему прикрепил. Частотник будет питаться от 220В и управлять 3-х фазным двигателем, а точнее, запуском, замедлением и точной остановкой и так по кругу каждые 4-5 секунд.
Дело в том, что на схеме подключён один двигатель, а нужно подключить второй, но работать одновременно они не будут - нужно перелючать три фазы на один или второй двигатель.
Релюшками не надёжно будет, вот и думаю такое реализовать на симисторах. Тоесть, в разрыв между частотником и двигателем ставить симисторы и запускать таким образом по очереди двигатели.
Возможен ли такой вариант и какие симисторы лучше использовать?
Спасибо.
Миниатюры
Нажмите на изображение для увеличения
Название: Untitled-1_03.jpg
Просмотров: 465
Размер:	39.8 Кб
ID:	1586  
Murkur вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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