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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.01.2015, 11:45   #431
utya
Junior Member
 
Регистрация: 29.01.2015
Сообщений: 6
Вес репутации: 0
utya is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

тоесть один такой модуль это одна лампочка, хочу три лампочки подключаю три таких модуля?
utya вне форума   Ответить с цитированием
Старый 30.01.2015, 12:10   #432
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, работающий в фоновом режиме

Все верно, 1 модуль одна нагрузка до 2kW
Admin вне форума   Ответить с цитированием
Старый 30.01.2015, 12:50   #433
utya
Junior Member
 
Регистрация: 29.01.2015
Сообщений: 6
Вес репутации: 0
utya is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Спасибо большое. Теперь понятно, а то я мозг ломаю, думаю где же оно многоканальная если там всего один выход
utya вне форума   Ответить с цитированием
Старый 30.01.2015, 13:17   #434
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 вне форума   Ответить с цитированием
Старый 25.02.2015, 13:44   #435
Arduino
Junior Member
 
Регистрация: 25.02.2015
Адрес: Санкт-Петербург
Сообщений: 5
Вес репутации: 0
Arduino is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Скажите, пожалуйста, как подружить этот диммер с другим функционалом на ардуино? В частности,у меня еще считываются данные с ИК приемника и с датчика температуры. Считывание дынных с датчика температуры перенес из loop в вызов по таймеру MsTimer2. А ИК приемник вроде как постоянно надо считать. Но, если это делать в цикле loop, то свет через диммер постоянно мигает.
Arduino вне форума   Ответить с цитированием
Старый 25.02.2015, 13:53   #436
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, работающий в фоновом режиме

Цитата:
Сообщение от Arduino Посмотреть сообщение
А ИК приемник вроде как постоянно надо считать.
Необязательно - для этого существуют прерывания - как самое простое ногу от ИК приемника повесить на пин 2, а от детектора нуля перенести на 3. Мигать свет будет тока при обработки команды с пульта. Так же(по моему) в некоторых библиотеках по работе IR приемниках есть свои функции прерывания.
А вообще лучше код выложить -не должен он из-за loop мигать -ведь это прерывание. Скорее считывать с приемника некорректно должен из-за частых прерываний

Последний раз редактировалось Bulatovor; 25.02.2015 в 14:15.
Bulatovor вне форума   Ответить с цитированием
Старый 25.02.2015, 17:38   #437
Arduino
Junior Member
 
Регистрация: 25.02.2015
Адрес: Санкт-Петербург
Сообщений: 5
Вес репутации: 0
Arduino is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Цитата:
Сообщение от Bulatovor Посмотреть сообщение
как самое простое ногу от ИК приемника повесить на пин 2, а от детектора нуля перенести на 3
Я использую библиотеку IRemote для работы с ИК и в ней почему-то 3й пин жестко зашит для передачи ИК сигнала. Поэтому на 3м пине у меня висит ИК диод. Я, конечно, попробую поправить библиотеку, чтобы высвободить 3й пин и настроить прерывание. Или есть какая-то библиотека получше для работы с ИК?

Цитата:
Сообщение от Bulatovor Посмотреть сообщение
Мигать свет будет тока при обработки команды с пульта.
Хотелось бы, чтобы свет вообще не мигал из-за ИК приемника) По крайней мере при считывании температуры этого удалось добиться.

Цитата:
Сообщение от Bulatovor Посмотреть сообщение
А вообще лучше код выложить -не должен он из-за loop мигать -ведь это прерывание. Скорее считывать с приемника некорректно должен из-за частых прерываний
У меня в коде всего понапичкано. Чтение команд с WiFi, управление телеком, светом. Постарался вырезать лишнее, чтобы не мешало. Но, могу и весь код скинуть. Когда комментирую строчку readDataFromIR();, свет перестает мигать.
PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <IRremote.h>
#include <OneWire.h>
#include <MsTimer2.h>

#define RCNL               F("\r\n")
#define NL                 '\n'
#define DIMMER_CP_DEFAULT  1000

//#define DEBUG
#ifdef DEBUG
#define DEBUG_BAUD        9600
#define DEBUG_RX          8
#define DEBUG_TX          9
#include "SoftwareSerial.h"
#endif
//SoftwareSerial debugSerial (DEBUG_RX,DEBUG_TX); // RX, TX

const int wifiPin 4;
const 
int relayPin 10;
const 
int ledPin 13;
const 
int tempPin 5;
const 
int irInPin 12;
// Hardcoded in IRemote
//const int irOutPin = 3;
const int dimmerInPin 2;
const 
int dimmerOutPin 6;

IRrecv irrecv(irInPin);
IRsend irsend;
OneWire  tempSensor(tempPin);
boolean lightEnabled false;
boolean tvEnabled false;
boolean tvBrowseChannels false;
long tvBrowseTime 0;
float currentTemp 0;
long timeLastCheck;
bool checkEnabled true;
volatile uint8_t ticdimmerValue 255dimmerNewValue 255;
uint8_t data;
int dimmerChangingPeriod DIMMER_CP_DEFAULT;

void setup() {
  
D4_Out;
  
D4_High;
  
D10_Out;
  
D10_High;
  
D13_Out;
  
D6_Out;
  
D6_Low;
  
D2_In;
  
attachInterrupt(0detect_upLOW);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  
StartTimer1(halfcycle40); //время для одного разряда ШИМ
  
StopTimer1();
  
  
MsTimer2::set(2000readDataFromTempSensor);        // установка таймера на 2 сек. для изм. температуры 
  
MsTimer2::start();   

#ifdef DEBUG
  
debugSerial.begin(DEBUG_BAUD);
#endif

  
irrecv.enableIRIn();
  
debugPrintln(F("Arduino started"));
  
printFreeRam();
}

void loop() {
  
updateDimmerLightness();

  
readDataFromIR();
}

/*    Общие методы - Начало    */
void printFreeRam() {
  
String message F("freeRam=");
  
message += String(freeRam());
  
debugPrintln(message);
}

int freeRam () {
  
extern int __heap_start, *__brkval;
  
int v;
  return (int) &
- (__brkval == ? (int) &__heap_start : (int) __brkval);
}

void debugPrint(String str) {
#ifdef DEBUG
  
debugSerial.print(str);
#endif
}

void debugPrintln(String str) {
#ifdef DEBUG
  
debugSerial.println(str);
#endif;
}
/*    Общие методы - Конец    */

/*    Методы для работы с датчиком темперауры - Начало   */
void readDataFromTempSensor() {
  
byte addr[8];
  
byte present 0;
  
byte type_sdat;
  
byte data[12];
  if (
tempSensor.search(addr) && OneWire::crc8(addr7) == addr[7]) {
    switch (
addr[0]) {
    case 
0x10:
      
//WIFI_SERIAL.println("  Chip = DS18S20");
      
type_s 1;
      break;
    case 
0x28:
      
//WIFI_SERIAL.println("  Chip = DS18B20");
      
type_s 0;
      break;
    case 
0x22:
      
//WIFI_SERIAL.println("  Chip = DS1822");
      
type_s 0;
      break;
    default:
      
//WIFI_SERIAL.println("Device not detected");
      
break;
    }

    
tempSensor.reset();
    
tempSensor.select(addr);
    
tempSensor.write(0x441);     
    
dat tempSensor.read();
    while(!
dat) {
      
dat tempSensor.read();
    }
    
present tempSensor.reset();
    
tempSensor.select(addr);   
    
tempSensor.write(0xBE);

    for (
int i 09i++) {         
      
data[i] = tempSensor.read();
    }

    
int16_t raw = (data[1] << 8) | data[0];
    if (
type_s) {
      
raw raw << 3;
      if (
data[7] == 0x10) {
        
raw = (raw 0xFFF0) + 12 data[6];
      }
    } 
    else {
      
byte cfg = (data[4] & 0x60);
      if (
cfg == 0x00raw raw & ~7
      else if (
cfg == 0x20raw raw & ~3;
      else if (
cfg == 0x40raw raw & ~1;

    }
    
currentTemp = (float)raw 16.0;
  }
}
/*    Методы для работы с датчиком темперауры - Конец   */

/*    Методы для работы с IR - Начало   */
void readDataFromIR() {
  
decode_results results;
  if (
irrecv.decode(&results)) {
    if (
results.value == 0x20DF10EF) {
      
//toggleLightState(true);
    
}

    
irrecv.resume();
  }
}
/*    Методы для работы с IR - Конец   */

/*    Методы для управления светом через диммер - Начало   */
void halfcycle()  //прерывания таймера
{
  
tic++;  //счетчик
  
if (dimmerValue tic D6_High//управляем выходом
}

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

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

void updateDimmerLightness() {
  if (
dimmerValue dimmerNewValue) {
    
int changingDelay dimmerChangingPeriod / (dimmerNewValue dimmerValue);
    for (
int i dimmerValue<= dimmerNewValuei++) {
      
dimmerValue i;
      
delay_ms(changingDelay);
    }
    
dimmerChangingPeriod DIMMER_CP_DEFAULT;
  }
  else if (
dimmerValue dimmerNewValue) {
    
int changingDelay dimmerChangingPeriod / (dimmerValue dimmerNewValue);
    for (
int i dimmerValue>= dimmerNewValuei--) {
      
dimmerValue i;
      
delay_ms(changingDelay);
    }
    
dimmerChangingPeriod DIMMER_CP_DEFAULT;
  }
}
/*    Методы для управления светом через диммер - Конец   */ 
Arduino вне форума   Ответить с цитированием
Старый 25.02.2015, 19:46   #438
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, работающий в фоновом режиме

Ну теперь для меня стало ясно где искать. Чтение яндекса показало, что IRRemove.h использует прерывания во всю. Например участники дружественного форума mebitek и Chip ( )еще в 2011 году выяснили, что IrRemove и MsTimer2 одно и тоже прерывание Timer2 и несовместимы.
Итого, прерывания в ардуине не имеют приоритета -соответственно пока обрабытывается одно из прерываний - в твоем случае чтение ИК датчика - прерывания диммера не работают. Чтоб не мигало нужна ИК библиотека без прерываний(но я такой не нашел -может Вам повезет) . Ну и решить проблемы немосместимости библиотек MsTimer2 её можно заменить на TimerOne или использовать многозадачность ардуино версии 2

А теперь о грустном
Цитата:
Хотелось бы, чтобы свет вообще не мигал из-за ИК приемника) По крайней мере при считывании температуры этого удалось добиться
Математика твои хотелки делает невозможным (ну за исключением проживания на жд станциях европы и сша, где частота тока 16 и 25 кгц). Длина пачки импульсов большинства пультов от 60 до 80 мсек. А чтоб диммер не пропускал периоды - считать и обработать эту пачку вы должны за 40 . Путем оптимизации кода можно добится только минимального мерцания -шоб незаметно было

После оптимизации кода чтения пульта ДУ надо измерить время его обработки, соответственно увеличить интервал таймера
Цитата:
StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
и соответственно уменьшить дискретность регулирования

Последний раз редактировалось Bulatovor; 25.02.2015 в 20:57.
Bulatovor вне форума   Ответить с цитированием
Старый 26.02.2015, 02:14   #439
Arduino
Junior Member
 
Регистрация: 25.02.2015
Адрес: Санкт-Петербург
Сообщений: 5
Вес репутации: 0
Arduino is an unknown quantity at this point
По умолчанию Re: Многоканальный Dimmer, работающий в фоновом режиме

Цитата:
Сообщение от Bulatovor Посмотреть сообщение
Итого, прерывания в ардуине не имеют приоритета -соответственно пока обрабытывается одно из прерываний - в твоем случае чтение ИК датчика - прерывания диммера не работают. Чтоб не мигало нужна ИК библиотека без прерываний(но я такой не нашел -может Вам повезет) . Ну и решить проблемы немосместимости библиотек MsTimer2 её можно заменить на TimerOne или использовать многозадачность ардуино версии 2
К сожалению, TimerOne не совместима с библиотекой CyberLib, т.к. там тоже используется Timer1. А с библиотекой leOS2 у меня, к сожалению, перестает работать wifi модуль. Видимо оперативная память в arduino nano заканчивается совсем.
Еще находил библиотеку TimerThree, но в arduino nano она вроде не поддерживается.
Видимо, не запусить это все вместе на малютке arduino nano.
В любом случае, спасибо вам огромное за помощь!
Arduino вне форума   Ответить с цитированием
Старый 26.02.2015, 06:59   #440
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, работающий в фоновом режиме

Да ну! Я на нано целый вэб сервер запускал -тока работал он плохо . А память она у всех одинаковая. Так что избавляйся от прерываний по таймеру и делай внешнее прерывание от приемника, если уж перенести на вторую ногу не сможешь(хотя люди переносят передатчик в ноги 3 на другие) делай прерывание по группе ног и маске -тогда на любую ногу можно приемник подключать с прерыванием. у меня на 328 камне работали сетевая карта+радиомодуль+дат чики температуры, давления, влажности+IR приемник и IR передатчик. Засунь туда все что хочешь и получишь удовольствие от собственного величия

TimerThree поддерживает 328-ые камни, в том числе и нано

Последний раз редактировалось Bulatovor; 26.02.2015 в 07:05.
Bulatovor вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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