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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.05.2013, 15:34   #91
TyShkan
Junior Member
 
Регистрация: 08.05.2013
Адрес: Москва
Сообщений: 4
Вес репутации: 0
TyShkan is an unknown quantity at this point
По умолчанию

А сильно будет схема отличаться, если с использованием MOSFET-транзистора делать?
TyShkan вне форума   Ответить с цитированием
Старый 08.05.2013, 15:48   #92
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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 вне форума   Ответить с цитированием
Старый 13.05.2013, 08:45   #93
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
По умолчанию

Итак имеем диммер по схему в первом посту, в качестве детектора 0 датчик acs712 подключенный к А3.
такой вот скетч
PHP код:
#include "CyberLib.h"      //подключаем библиотеку быстрого управления пинами

// Переменные для функционирования Диммера
int Dimmer1=30
int Dimmer2M=25// переменная для хранения значения Dimmer при операциях
int tic1=0,        // счетчик таймера
volatile long Vout;// значение аналогового порта, можно конечно и считывать прямо,но на сайте Arduino говорится что при использовании в функции max других функций результаты получаются непредсказуемыми

void setup()  

  
D4_Out//Настраиваем порт на выход Dimmer1
  
D4_Low
  
D9_In//настраиваем порт на вход для кнопки 1
  
D9_High;  //установить на входах высокий уровень и подключить резистор 
  
StartTimer1(halfcycle160);// учитывая скорость аналогового чтения порта порядка 50 мкс такая частота будет оптимальной
}

//********************обработчики прерываний для работы диммера*******************************

void halfcycle()  //прерывания таймера
{   
  
Vout=A3_Read// читаем  порт к которому подключен выход датчика
  
if (Vout>507 && Vout>516// ищем нулевую точку
  
{   
    
D4_Low//выключаем симистор
    
tic1=0;   //обнулить счетчик 
      
};
  
tic1++;  //счетчик   
  
if(Dimmer1 tic1 D4_High// включаем симистор
}; 

//************************************************************************* 
void loop() {
  

Итого - лампа горит в полную силу, отключение от датчика ситуацию не меняют. Отключение от ардуинки управляющего контакта симмистора лампу гасят. Осциллографа нет, чтоб посмотреть. На выходе датчика 2,5 вольта, видимо в среднем мультик, показывает. Вообщем зашел пока в тупик ищу Осциллограф чтоб посмотреть что происходит на А3 или может кто еще какие методы диагностики подсткажет
Bulatovor вне форума   Ответить с цитированием
Старый 13.05.2013, 10:51   #94
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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
По умолчанию

Ошибка
if (Vout>507 && Vout>516)
Admin вне форума   Ответить с цитированием
Старый 13.05.2013, 10:53   #95
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
По умолчанию

точно, Спасибо вечерком попробую.
Bulatovor вне форума   Ответить с цитированием
Старый 13.05.2013, 19:49   #96
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
По умолчанию

Итак, ситуация улучшилась, вместо диммера получил выключатель на крайних значениях лампочка включается и выключается
скетч такой. Вопрос, видимо, в коэффициентах диммирования -буду еще раз пересчитывать
PHP код:

// Данный скетч на основе программы Admina реализует управление диммером при помощи кнопки, с функцией плавного гашения и включения, отключения с задержкой
#include "CyberLib.h"      //подключаем библиотеку быстрого управления пинами
#include <Bounce.h>        // библиотека для устранения дребезга  
#include <leOS.h>          // библиотека многозадачности

// Переменные для функционирования Диммера
int Dimmer1=30
int Dimmer2// переменная определяющая яркость свечения диммера
int Dimmer1M=30
int Dimmer2M=25// переменная для хранения значения Dimmer при операциях
int tud 30// время в миллисекундах отвечающее за плавность регулирования
int tic1=0tic2=0;        // счетчик таймера

// Переменные для кнопок
int qbutton1 ;        //  начальное значение счетчика нажатий на кнопку 1
int qbutton2 ;        //  начальное значение счетчика нажатий на кнопку 2
unsigned long b1millis1=0
unsigned long b1millis2=0;// Время последнего срабатывания кнопки
int t 10;               // переменная количество секунд таймера
int tcl 1000// время, после которого считается что кнопка нажата
int tc0 2000// время, после которого считается что серия нажатий на кнопки окончена

// Переменные измерения тока
volatile long  Smax// сумма максимальных значений
volatile long PeriodTic=0// счетчик периодов
volatile long PintTic=0// счетчик периодов
volatile long Vmax;// максимальное значение за период
volatile long Vout;// значение аналогового порта, можно конечно и считывать прямо,но на сайте Arduino говорится что при использовании в функции max других функций результаты получаются непредсказуемыми
long Power=0// значение потребляемой мощности
long I 0// сила тока



Bounce bouncer1 Bounce(915); 
Bounce bouncer2 Bounce(1015);  //создаем экземпляр класса Bounce для кнопок выводы 9 и 10
leOS myOS;                      //создать экземпляр класса 



void setup()  

  
D4_Out//Настраиваем порт на выход Dimmer1
  
D5_Out//Настраиваем порт на выход Dimmer2
  
D13_Out//Настраиваем порт на выход светодиода
  
D4_Low
  
D5_Low
  
D13_Low;  //установить на выходах  уровень сигнала
  
D9_In//настраиваем порт на вход для кнопки 1
  
D9_High;  //установить на входах высокий уровень и подключить резистор 
  
D10_In//настраиваем порт на вход для кнопки 2
  
D10_High;  //установить на входах высокий уровень и подключить резистор 

  
Serial.begin(9600);//поднимаем соединение для передачи на терминал 
  
myOS.begin();      // поднимаем задачи

  
StartTimer1(halfcycle160);
}



//********************обработчики прерываний для работы диммера*******************************

void halfcycle()  //прерывания таймера
{   
  
Vout=A3_Read// читаем  порт к которому подключен выход датчика
  
if (Vout>507 && Vout<516// ищем нулевую точку
  
{   
    
D4_Low//выключаем симмистор
    
tic1=0;   //обнулить счетчик 
  
};
  
tic1++;  //счетчик   
  
if(Dimmer1 tic1 D4_High// включаем симистор
}; 



//                             Программы управления яркостью

void timeroff()// отключение по таймеру
{         
  
myOS.removeTask(Dimmer1Up);
  
myOS.removeTask(Dimmer1Up1);
  
myOS.removeTask(Dimmer1Up2);
  
myOS.removeTask(Dimmer1Down);
  
myOS.removeTask(Dimmer1Down2);
  
myOS.addTask(Dimmer1Downtud);
};

void Dimmer1Up() // увеличение яркости на полную
{
  
Dimmer1=Dimmer1-1;
  if(
Dimmer1<=0){
    
Dimmer1=0;
    
myOS.removeTask(Dimmer1Up);

  };
};
void Dimmer1Up1() // увеличение яркости до установленного значения
{
  
Dimmer1=Dimmer1-1;
  if(
Dimmer1<=Dimmer1M){
    
Dimmer1=Dimmer1M;
    
myOS.removeTask(Dimmer1Up1);
  };
};
void Dimmer1Up2() // увеличение яркости по кнопке
{
  
Dimmer1=Dimmer1-1;
  if(
Dimmer1<=0){
    
Dimmer1=0;
    
myOS.removeTask(Dimmer1Up2);
  };
  if(
D9_Read) {
    
Dimmer1M=Dimmer1;
    
myOS.removeTask(Dimmer1Up2);
  } 
};


void Dimmer1Down() // уменьшение яркости на полную
{
  
Dimmer1=Dimmer1+1;
  if(
Dimmer1>=60){
    
Dimmer1=60;
    
myOS.removeTask(Dimmer1Down);

  };
}

void Dimmer1Down2() // уменьшение ярокости по кнопке
{
  
Dimmer1=Dimmer1+1;
  if(
D9_Read){
    
Dimmer1M=Dimmer1;
    
myOS.removeTask(Dimmer1Down2);
  };
  if(
Dimmer1>=60){
    
Dimmer1=60;
    
Dimmer1M=Dimmer1;
    
myOS.removeTask(Dimmer1Down2);
  };
}




//************************************************************************* 
void loop() {
  
//Serial.println(Dimmer1,DEC);
  
Serial.println(Vout,DEC);

  if (
bouncer1.update()) 
  { 
    if (
bouncer1.fallingEdge()) //если кнопка нажата
    

      
qbutton1=qbutton1+1;
      
b1millis1=millis();
    } 
  };
  if (
bouncer2.update()) 
  { 
    if (
bouncer2.fallingEdge()) //если кнопка нажата
    
{
      
qbutton2=qbutton2+1;
      
b1millis2=millis();
    }; 
  };


  
//если переменная количества нажатий кнопки не равна 0 - 
  
if(qbutton1!=&& millis()-b1millis1>tcl)
  {
// ***********************************************Обработка количества нажатий кнопки 1
    
if(qbutton1>)
    {
      
qbutton1=0;
    }
    if(
qbutton1==)
    {
      if(
millis()-b1millis1<tc0 && D9_Read)//если было одно нажатие и с момента последнего нажатия не прошло время заданное переменной tc1, а кнопка уже опущена
      

        if (
Dimmer1>=60)
        { 
          
qbutton1=0// и обнуляем преременную количества нажатий
          
myOS.removeTask (Dimmer1Up);
          
myOS.removeTask (Dimmer1Up1);
          
myOS.removeTask (Dimmer1Up2);
          
myOS.removeTask (Dimmer1Down);
          
myOS.removeTask (Dimmer1Down2);
          
myOS.addTask (Dimmer1Up1tud);

        }
        else
        { 
          
qbutton1=0// и обнуляем преременную количества нажатий
          
Dimmer1M=Dimmer1;
          
myOS.removeTask (Dimmer1Up);
          
myOS.removeTask (Dimmer1Up1);
          
myOS.removeTask (Dimmer1Up2);
          
myOS.removeTask (Dimmer1Down);
          
myOS.removeTask (Dimmer1Down2); 
          
myOS.addTask (Dimmer1Downtud);

        }  
      }

      if(
millis()-b1millis1>=tc0&& !D9_Read)//если было одно нажатие и с момента последнего нажатия прошло время заданное переменной tc1
      

        
qbutton1=0// и обнуляем преременную количества нажатий
        
myOS.removeTask (Dimmer1Up);
        
myOS.removeTask (Dimmer1Up1);
        
myOS.removeTask (Dimmer1Up2);
        
myOS.removeTask (Dimmer1Down);
        
myOS.removeTask (Dimmer1Down2);
        
myOS.addTask (Dimmer1Up2tud);

      }          
    }
    if(
qbutton1==)
    {
// ***********************************************Обработка количества нажатий кнопки 2
      
if(millis()-b1millis1<tc0 && D9_Read)//если было два нажатия и с момента последнего нажатия не прошло время заданное переменной tc1, а кнопка уже опущена
      

        
qbutton1=0// и обнуляем переменную количества нажатий
        
myOS.removeTask (Dimmer1Up);
        
myOS.removeTask (Dimmer1Up1);
        
myOS.removeTask (Dimmer1Up2);
        
myOS.removeTask (Dimmer1Down);
        
myOS.removeTask (Dimmer1Down2);
        
myOS.addTask(timeroff1000*tONETIME);

      }

      if(
millis()-b1millis1>=tc0&& !D9_Read)//если было два  нажатия и с момента последнего нажатия прошло время заданное переменной tc1
      
{
        
qbutton1=0// и обнуляем переменную количества нажатий
        
myOS.removeTask (Dimmer1Up);
        
myOS.removeTask (Dimmer1Up1);
        
myOS.removeTask (Dimmer1Up2);
        
myOS.removeTask (Dimmer1Down);
        
myOS.removeTask (Dimmer1Down2);
        
myOS.addTask (Dimmer1Up2tud);

      }          
    }
  }

Bulatovor вне форума   Ответить с цитированием
Старый 13.05.2013, 20:08   #97
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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 вне форума   Ответить с цитированием
Старый 13.05.2013, 20:46   #98
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
По умолчанию

МОС3022
Bulatovor вне форума   Ответить с цитированием
Старый 14.05.2013, 12:35   #99
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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
По умолчанию

Попробуй вот так
PHP код:
void halfcycle()  //прерывания таймера 
{    
  
Vout=A3_Read// читаем  порт к которому подключен выход датчика 
  
if (Vout>508 && Vout<516)  tic1=0;   //детектор ноля     
  
if(Dimmer1 tic1 ) {D4_High;} else  D4_Low;
tic1++;  //счетчик  
}; 
Время таймера лучше сделать кратным, например
StartTimer1(halfcycle, 100);
При этом значения dimmer могут изменятся от 0 до 99
Admin вне форума   Ответить с цитированием
Старый 14.05.2013, 18:41   #100
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
По умолчанию

при чтении с аналогового входа в 50 мкс думаю 100 будет слишком часто, не останется времени на все остальное

Изменение кода дало интересный результат - лампочка мигает с видимой частотой только около 3 герц при значении Dimmer1 равном нулю или отрицательных значениях, как впрочем и в старом варианте, лампочка горит только при значении меньше или равно 0, при других значениях даже в 1 лампа гаснет в обоих случаях

При изменении прерывания на 100 в обоих случаях ситуация не меняется, на 200 гаснет все. Есть подозрения всеж на силовую часть - что-то там не так, а может в микросекундами и миллисекундами где напутал

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


Здесь присутствуют: 123 (пользователей: 0 , гостей: 123)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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


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


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