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

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

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

Попытался скомпилировать код из шапки под arduino mega - сыпало ошибки
написал свой, может кому пригодится:
используется библиотека TimerOne код компилится для любой платы, в цикле loop рандомно меняется яркость первого диммера каждые 100мс.

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<= endDimPini++) //пройдемся циклом по портам
  
{
    
pinMode (iOUTPUT);
    
digitalWrite(iLOW); // гасим оответствующий пин

    
Dimmer[startDimPin] = 10//выставим яркость соответствующего диммера в 0
  
}
  
//CHANGE – прерывание вызывается при любом изменении значения на входе;
  //RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
  //FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
  
attachInterrupt(0detect_upLOW);  // настроить срабатывание прерывания 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<= endDimPini++)
  {
    if (
Dimmer[startDimPin] > tic )
      
digitalWrite(iHIGH); //управляем выходом (откроем семистор)
  
}
}

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

void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту
{
  
Timer1.stop(); //остановить таймер
  
for ( int i startDimPin<= endDimPini++)
  {

    
digitalWrite(iLOW);
  }
  
tic 200;     //обнулить счетчик
  
attachInterrupt(0detect_upLOW); //перепрограммировать прерывание на другой обработчик

}

void loop() {
  {

//********помигаем первым диммером рандомно********
    
Dimmer[0] = random(10200);
    
//Задержка для более плавного эффекта мерцания
    
delay(100);

  }

DAP вне форума   Ответить с цитированием
 


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

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

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

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


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


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