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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.05.2020, 00:00   #951
demoniaus
Junior Member
 
Регистрация: 18.05.2020
Сообщений: 6
Вес репутации: 0
demoniaus is an unknown quantity at this point
По умолчанию

Здравствуйте!
Дернуло что-то на карантине покрутить ардуину. Сразу оговорюсь, познания в программировании и аппаратных делах у меня неочень. Но как говорится очень хочется. Поэтому заранее извиняюсь за, возможно, глупые вопросы.

Перейду сразу к делу.

Имеется готовый диммер с алика. В качестве управлялки использую ардуино нано.

Никак не могу заставить эту парочку корректно работать вместе.
Начну с самого начала. Подключение вроде стандартное.


vcc - 5v, gnd - gnd, z-c - pin2, pwm - pin4
Естественно есть входное 220 на зеленую колодку и лампа на синюю.
Далее использую следующий код.

PHP код:
#define dimPin 4
#define zeroPin 2
#include <CyberLib.h>
volatile int ticDimmer;

void setup() {
  
Serial.begin(9600);
  
pinMode(dimPinOUTPUT);
  
digitalWrite(dimPin0);
  
pinMode(zeroPinINPUT);                 // настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  
attachInterrupt(0detect_upFALLING);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень

  
StartTimer1(timer_interrupt40);        // время для одного разряда ШИМ
  
StopTimer1();                            // остановить таймер

}

void loop() {

  if (
Serial.available()) {
    
Dimmer Serial.parseInt();
    
Serial.println(Dimmer);
  }
  
}

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
void timer_interrupt() {       // прерывания таймера срабатывают каждые 40 мкс
  
tic++;                       // счетчик
  
if (tic Dimmer)            // если настало время включать ток
    
digitalWrite(dimPin1);   // врубить ток
}

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

void  detect_down() {  // обработка внешнего прерывания на пересекание нуля сверху
  
tic 0;                                  // обнулить счетчик
  
StopTimer1();                             // остановить таймер
  
digitalWrite(dimPin0);                  // вырубить ток
  
attachInterrupt(0detect_upFALLING);   // перенастроить прерывание
}
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ-------------------------- 
Это код с этого форума. Цель его - через Serial порт регулировать яркость лампы. Вот только по какой-то причине он не работает.

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

Так как я новичек, могу сейчас совсем что-то странное сказать, но я попробовал провести проверочные манипуляции. Например я пробовал вынуть контакт из пин4 и соединить его с +5. В таком случае при вынимании лампа гаснет, при контакте с +5 она горит. Далее пробовал
в функции detect_up и detect_down добавить вывод в порт какого-то значения. Я знаю что Serial.println() очень долгая команда и ее не стоит использовать, но все же при ее добавлении я видел в мониторе постоянные срабатывания на FALLING и RISING. После этого я убрал эти строчки.

ТАким образом получается что диммер вроде рабочий, но управление им происходит некорректно.

Да, еще хотел добавить, что я так же пробовал использовать родную библиотеку от производителя. С ней все хорошо работает, но все же мне стало интересно как добиться работы с использованием вашего подхода, если это конечно возможно.
Заранее спасибо.
demoniaus вне форума   Ответить с цитированием
Старый 19.05.2020, 15:23   #952
demoniaus
Junior Member
 
Регистрация: 18.05.2020
Сообщений: 6
Вес репутации: 0
demoniaus is an unknown quantity at this point
По умолчанию

Приветствую. Сегодня взял для теста код из шапки темы. И добавил модуль плавного набора яркости и плавного угасания. Я проверил этот модуль сначала на светодиоде с помощью ШИМ интерфейса. Затем, когда убедился, что светодиод плавно загорается и гаснет добавил этот код в loop. Результат такой же как и вчера. Когда счетчик доходит до 0 лампа гаснет, все остальное время она постоянно горит.

Интересный момент. На пине PWM самого диммера имеется светодиод. Когда я запустил код с морганием, этот светодиод отрабатывает программу как нужно. Тоесть плавно загорается и гаснет. А Вот в лампу что-то не идет ((

Код прилагаю.

PHP код:
#include "CyberLib.h" //Библиотека от Cyber-Place.ru
volatile uint8_t ticDimmer1Dimmer2Dimmer3;
uint8_t data;
unsigned long timing;

void setup() 

  
D4_OutD5_OutD6_Out//Настраиваем порты на выход
  
D4_LowD5_LowD6_Low//установить на выходах низкий уровень сигнала
  
D2_In//настраиваем порт на вход для отслеживания прохождения сигнала через ноль  
  
//CHANGE – прерывание вызывается при любом изменении значения на входе; 
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH) 
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low) 
    
attachInterrupt(0detect_upLOW);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
    
StartTimer1(halfcycle40); //время для одного разряда ШИМ
    
StopTimer1(); //остановить таймер
    
UART_Init(115200); //инициализация порта
}
//********************обработчики прерываний*******************************
void halfcycle()  //прерывания таймера

  
tic++;  //счетчик  
  
if(Dimmer1 tic D4_High//управляем выходом
  
if(Dimmer2 tic D5_High;  //управляем выходом
  
if(Dimmer3 tic D6_High;  //управляем выходом 
}

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

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

//*************************************************************************
void loop() {
if (
Dimmer1 255 ) { // Вместо 10000 подставьте нужное вам значение паузы
    
while (Dimmer1 255) {
      if (
millis() - timing 30) {
        
timing millis(); 
        
Dimmer1++;
        
//analogWrite(6, Dimmer);
      
}
    }
  }
  else
  {
    while (
Dimmer1 0) {
      if (
millis() - timing 30) {
        
timing millis();    
        
Dimmer1--;
        
//analogWrite(6, Dimmer);
      
}
    }
  }

demoniaus вне форума   Ответить с цитированием
Старый 19.05.2020, 21:21   #953
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
По умолчанию

Цитата:
Это код с этого форума. Цель его - через Serial порт регулировать яркость лампы. Вот только по какой-то причине он не работает.
Вы код из шапки темы без модификаций пробовали?
Admin вне форума   Ответить с цитированием
Старый 20.05.2020, 01:34   #954
demoniaus
Junior Member
 
Регистрация: 18.05.2020
Сообщений: 6
Вес репутации: 0
demoniaus is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Вы код из шапки темы без модификаций пробовали?
Здравствуйте. Я бы взял код из шапки без изменений, но я не понимаю как мне взаимодействовать с ардуиной после прошивки. Я так понимаю там не используется Serial порт.
А как организовать ввод значения яркости через uart я пока не могу разобраться. Поэтому я просто поменял в нем кусок

PHP код:
void loop() 
{
Start
  
if (UART_ReadByte(data)) Dimmer1=data;
  
   
Dimmer2=195//200=мин. 0=макс 
   
Dimmer3=0//200=мин. 0=макс 
End
На вот такой. В нем не надо ничего вводить, яркость лампы по моей идее должна нарастать от 0 до 255 и обратно. Собственно демонстрировать сам эффект диммирования.

PHP код:
void loop() {
if (
Dimmer1 255 ) { 
    while (
Dimmer1 255) {
      if (
millis() - timing 30) {
        
timing millis(); 
        
Dimmer1++;
      }
    }
  }
  else
  {
    while (
Dimmer1 0) {
      if (
millis() - timing 30) {
        
timing millis();    
        
Dimmer1--;
      }
    }
  }

Остальной код не менялся... все как в шапке один в один.
Полный код который тестировал описан в предыдущем моем посте.
demoniaus вне форума   Ответить с цитированием
Старый 20.05.2020, 11:06   #955
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
По умолчанию

Цитата:
Я так понимаю там не используется Serial порт
Используется, Вы просто невнимательно прочитали пост. Проверьте код из шапки, это называется поиск ошибок методом исключения. Что бы Вы не думали , что проблема в моем коде
Admin вне форума   Ответить с цитированием
Старый 20.05.2020, 12:04   #956
demoniaus
Junior Member
 
Регистрация: 18.05.2020
Сообщений: 6
Вес репутации: 0
demoniaus is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Используется, Вы просто невнимательно прочитали пост. Проверьте код из шапки, это называется поиск ошибок методом исключения. Что бы Вы не думали , что проблема в моем коде
Здравствуйте! Хочу отметить, я не утверждал что код не рабочий. Все-таки у остальных то он работает. Я просто сказал, что по какой-то причине этот код не работает у меня. Скорее всего я что-то делаю не так.

Итак, залил в ардуино нано код из шапки без изменений. Я работаю через arduino ide.
Лампочка просто загорелась на каком то уровне яркости. Далее как попробовать изменить яркость?
Я попробовал открыть монитор порта и внести туда какое-то значение. Но лампа не реагирует. Как горела на каком-то уровне так и горит. Приложу несколько фото. Возможно с подключением что-то не то?

Фотка1 Фотка2
demoniaus вне форума   Ответить с цитированием
Старый 20.05.2020, 13:03   #957
demoniaus
Junior Member
 
Регистрация: 18.05.2020
Сообщений: 6
Вес репутации: 0
demoniaus is an unknown quantity at this point
По умолчанию

Почитал внимательно сообщение в шапке. Можно управлять символами Г d и пробелом. Попробовал их использовать. Ничего не меняется.
Настройки сериал порта выставил следующие - 115200бод, нет конца строки.
Может надо что-то в схему подключение добавить? Резистор может какой? В коде хоть какое-то минимальное понимание есть, а вот с аппаратной частью у меня совсем все плохо.
demoniaus вне форума   Ответить с цитированием
Старый 20.05.2020, 21:58   #958
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
По умолчанию

Можно фото платы?
Admin вне форума   Ответить с цитированием
Старый 20.05.2020, 22:07   #959
demoniaus
Junior Member
 
Регистрация: 18.05.2020
Сообщений: 6
Вес репутации: 0
demoniaus is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Можно фото платы?
фото1 фото2 фото3 фото4 фото5

Это сам диммер, адруина простая нано. На макетке. Соединения как на картинке несколько постов выше. Питаю от USB компьютера.

Последний раз редактировалось demoniaus; 20.05.2020 в 22:10.
demoniaus вне форума   Ответить с цитированием
Старый 20.05.2020, 23:14   #960
petran67
Junior Member
 
Регистрация: 20.05.2020
Сообщений: 6
Вес репутации: 0
petran67 is an unknown quantity at this point
По умолчанию

Доброго времени суток всем.
У меня тут нарисовалась одна проблемка... Понадобилось знакомому в срочном порядке склепать 6-ти канальный диммер для 220-ти вольтовых светодиодных ламп. Имеется у меня дешевенькая схема диммера с регулировкой по ШИМ, НО процесс диммирования зависит от мощности нагрузки, которая должна быть не меньше 100 ватт а здесь на некоторых каналах даже меньше 50 ватт и диммирование плакало горькими слезами...
Следующий способ решения вопроса у меня упал на управление через ШИМ, НО уже не зависящий от мощности подключенной нагрузки. Тобишь - на ардуинке, так как у меня тут завалялась без дела одна ардуинка 2560 R3. Теперь вот, ищу скетч для шестиканальной регулировки. Буду весьма признателен за подсказки, которые помогут избежать глупых ошибок в сборке сей конструкции.
Должен сразу предупредить - в программировании скетчей я далековат. Знаю как склепать схему, как загрузить скетч и как бы все...
Может найдется кто, у кого есть готовый скетч такого проектика? Думаю, главное здесь - скетч для 6-ти каналов с управлением потенциометрами по аналоговым входам ардуины. И так как диммер однофазный, отслеживание перехода ноля не требуется для всех каналов отдельно.
Спасибо заранее за потерянное драгоценное время.
petran67 вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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