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

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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.05.2020, 00:00   #11
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 (пользователей: 0 , гостей: 19)
 

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

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

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


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


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