Продолжение темы Dimmer
Купить готовый модуль Dimmer
Управление Dimmer с планшета
http://www.youtube.com/watch?v=wTXWWPCRt7k
Вид для печати
Продолжение темы Dimmer
Купить готовый модуль Dimmer
Управление Dimmer с планшета
http://www.youtube.com/watch?v=wTXWWPCRt7k
А можно схемку Dimmer наподобие как в fritzing, я в таких не очень разбираюсь. Да и обозначения не все понятны.
Например
Вложение 19331
А на этой стороне что то припаяно?
https://duino.ru/images/product_imag...ges/2366_1.png
К сожалению, другой схемы нет
http://cyber-place.ru/showthread.php?t=525
А на схеме я отметил в квадратах, что это?
резисторы
Без разницы какие, главное что бы не меньше чем 0,5 ватт
Спасибо, попробую сам собрать если получится. конденсатор 0 1 u это вроде такого или тоже без разницы, лиш бы 0.1uF?
Без разницы, только что бы по напряжению подошли
А сколько должно напряжение?
350-400В , но эту цепь можно не собирать если не будет индуктивной нагрузки
Почти собрал, но не нашлось резисторов на 43 кОм, можно на 47 поставить? D2 и D4 на схеме - это подключать к 2 и 4 пинам ардуины?
Сделал на макетке, но не уверен что правильно
https://image.prntscr.com/image/a6vY...AbaxpQybCg.png
Заработал диммер, только одно но - не регулирует яркость. Если только в скетче менять значение Dimmer[i - startDimPin] = 90; //выставим яркость соответствующего диммера в 0 а само не меняется
PHP код:
#include <TimerOne.h>
//#include <CyberLib.h>
volatile uint8_t tic ;
uint8_t data;
int startDimPin = 3; //первый диммер
int endDimPin = 12; //последний диммер
int Dimmer[9]; //количество диммеров минус 1
void setup() {
//*********************Настраиваем порты на выход**********************
for ( int i = startDimPin; i <= endDimPin; i++) //пройдемся циклом по портам
{
pinMode (i, OUTPUT);
digitalWrite(i, LOW); // гасим оответствующий пин
Dimmer[i - startDimPin] = 10; //выставим яркость соответствующего диммера в 0
}
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
Timer1.initialize(40); // Интервал срабатывания таймера в мкс
Timer1.attachInterrupt(halfcycle); //будет вызыватся каждый раз при отсчете заданого времени
Timer1.stop();
Serial.begin(115200); //инициализация порта
randomSeed(analogRead(0)); //псевдогенератор случайных чисел будет использовать шумы на аналог пин 0
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic--; //счетчик
for ( int i = startDimPin; i <= endDimPin; i++)
{
if (Dimmer[i - startDimPin] > tic )
digitalWrite(i, HIGH); //управляем выходом (откроем семистор)
}
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic = 200; //обнулить счетчик
Timer1.resume(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
Timer1.stop(); //остановить таймер
for ( int i = startDimPin; i <= endDimPin; i++)
{
digitalWrite(i, LOW);
}
tic = 200; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
void loop() {
{
//********помигаем первым диммером рандомно********
Dimmer[0] = random(10, 200);
//Задержка для более плавного эффекта мерцания
delay(100);
}
}
Яркость сама не будет меняться. Откуда ардуине знать какая яркость нужна?
Здесь уже полет фантазий.
Так то да, но перед скетчем было написано
потому и не стал вникать в код : )Цитата:
Попытался скомпилировать код из шапки под arduino mega - сыпало ошибки
написал свой, может кому пригодится:
используется библиотека TimerOne код компилится для любой платы, в цикле loop рандомно меняется яркость первого диммера каждые 100мс.
А не поставить бы на симистор радиатор? Взял на 800, но мощность нагревателя фена примерно 700. Не большой запас, наверно будет греться.
https://image.prntscr.com/image/rQO3...RVVpc46SnQ.png
Сделал наспех так что всё коряво (с обратной стороны вообще позорище). Главное работает - всё равно будет убрано в корпус.
можно рандомно сделать, можно циклом медленно поднимать , а потом убавлять.
симистор скорее всего на 800Вольт, тебе нужно знать его номинальный токЦитата:
А не поставить бы на симистор радиатор? Взял на 800, но мощность нагревателя фена примерно 700. Не большой запас, наверно будет греться.
Цитата:
Сделал наспех так что всё коряво (с обратной стороны вообще позорище). Главное работает - всё равно будет убрано в корпус.
Нормально выглядит
Я хочу сделать управление через энкодер.
Вот такой симистр брал.
Симистор на 8А получается его мощность 170 Ватт
Через энкодер не проблема, можно сделать.
Р.S.
Только что, пришла в голову мысль как повесить энкодер на одно прерывание.
Странно что никто раньше об этом не догадался :)
на одно прерывание - это как?
И тут меня не на шутку понесло!!!
Можно весь энкодер повесить на 1 вход
Вложение 19336
Только еще 1 ограничительный резистор 1К по питанию нужно будет добавить.
Цитата:
Ни как не пойму как сделать
подключить энкодер?
За основу код для энкодера можно взять здесь
Как подключать энкоднер знаю, вот как с помощью его управлять диммером - не разберусь
Я могу помочь, подсказать , подправить, но весь код не напишу, да и подключенного энкодера у меня сейчас нет
Без тестов код написать сложно
Сделайте пока по классической схеме
код:
Код:
void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) {
// выход В в полож. сост., значит вращение по часовой стрелке
// увеличиваем яркость, не более чем до 255
if(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else {
// выход В в 0 сост., значит вращение против часовой стрелки
// уменьшаем яркость, но не ниже 0
if(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
loopTime = currentTime;
}
}
Сделал по аналогии данного кода, но иногда при регулировке бывают яркие вспышки лампочки (особенно на малой мощности)
Конденсаторы 0,1 мкФ на выходах энкодера установлены?
По поводу кода не понял? Выложи здесь
Забыл код выложить : )
Энкодер у меня модулем (резисторы есть)PHP код:
#include <Encoder.h>
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile unsigned long Dimmer;
#define PIN_ENCODER_CLK 12
#define PIN_ENCODER_DT 11
#define PIN_ENCODER_SW 10
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
int accel = 1;
int i = 0;
long oldPosition = 0;
void setup() {
Serial.begin(9600);
D4_Out; //Настраиваем порты на выход
D4_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
attachInterrupt(0, detect_up, RISING); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
Dimmer = 4500;
}
//********************обработчики прерываний*******************************
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
delay_us(Dimmer);
D4_High;
delay_us(40); //формируем импульс включения симистора
D4_Low;
}
//*************************************************************************
void loop(){
//=== ручка энкодера/регулироака
long newPosition = myEnc.read() / accel;
if (newPosition > oldPosition)
{
Dimmer -= 100;
Serial.println(">>>");
if ( Dimmer < 500 )
Dimmer = 500;
}
else
if (newPosition < oldPosition)
{
Dimmer += 100; // Убавляем скорость
Serial.println("<<<");
if ( Dimmer > 9500 )
Dimmer = 9500;
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
Dimmer = Dimmer;
Serial.println(Dimmer);
}
}
Закоментируй везде Serial.print
Изменил мах min значения Dimmer - вроде стало получше, хотя и не очень плавное регулирование. Но меня это особо не волнует - всё равно управлять буду нагревателем, а для него это не заметно будет.
А можно сделать от 0 до 255?Цитата:
Dimmer = 5500; // время в микросекундах, где 500 = Max. 9500 = Min.
Можно конечно, простым делением
Появились в продаже новые модули Arduino dimmer
Вложение 19505
Из плюсов диммера это радиатор для симистора
Вложение 19504