Показать сообщение отдельно
Старый 14.10.2015, 23:59   #7
BR95009
Brocken-Meister
 
Аватар для BR95009
 
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,628
Сказал(а) 'не согласен(а)'!: 7
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,030
Поблагодарили 9,327 раз(а) в 3,314 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
0 Всего
Репутация: репутация неоспорима (9368)
По умолчанию

Геннадич, я не о том.

Какая комбинация переключенныхс стрелок = какой световой схеме?

Например:
1.два красных == 0-0
2.один красный и белые == 0-1
3.один зеленый == 1-0
4.зеленый и желтый ==1-1

Цитата:
Сообщение от genadich Посмотреть сообщение
Для каждого адреса есть 2 положения: "прямо" и "криво".
Там тупо 0 и 1. Прямо и криво - это уже от контроллера щависит и от подключеняи стрелки.

---------- Сообщение добавлено в 01:59 ---------- Предыдущие сообщение было в 01:52 ----------

Лови скетч, Геннадич.

Должно работать. Нету светофора, что бы проверить.

Arduino код:
// DCC декодер для немецкого выходного сигнала Viessmann H0 Licht-Ausfahrsignal Art.Nr  4013:
// by BR95009. V01
// Лицензия GPL. Бесплатно для не коммерческого использования. Ссылка на автора обязательна.
// DCC reading PIN = 2 (from opto coupler)

// Подключаем библиотеку DCC Decoder
#include <DCC_Decoder.h>

// Параметры декодера для настройки:
#define DECODER_ADDRESS_1  1     // Адрес декодера для первой стрелки
#define DECODER_ADDRESS_2  2     // Адрес декодера для второй стрелки

// Управляющие пины, где wire номер = номеру провода на схеме светофора Viessmann H0 Licht-Ausfahrsignal Art.Nr  4013:
#define WIRE1_PIN  8
#define WIRE2_PIN  7
#define WIRE3_PIN  6
#define WIRE4_PIN  5
#define WIRE5_PIN  4

//Прерывание для DCC библиотеки
#define kDCC_INTERRUPT   0

bool on_already1 false// флаг, что бы отсечь остальные аналогичные пакеты для первой стрелки
bool on_already2 false// флаг, что бы отсечь остальные аналогичные пакеты для второй стрелки

// Флаги  состояний декодера:
bool flag1 false// флаг комманды первой стрелки (ВКЛ/ВЫКЛ)
bool flag2 false// флаг комманды второй стрелки (ВКЛ/ВЫКЛ)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()//обязательная функция для любого сетча: настраивает программу, запускается 1 раз при старте.
//Выставляем управляющие пины на вывод:
  
pinMode(WIRE1_PINOUTPUT); pinMode(WIRE2_PINOUTPUT); pinMode(WIRE3_PINOUTPUT); pinMode(WIRE4_PINOUTPUT); pinMode(WIRE5_PINOUTPUT);

  
//Выставляем их в "НIGН", что бы при запуске светофор не горел. Так как они подключены к общему плюсу и минусом к выводам, то управляющая логика будет обратной:
  // HIGH = OFF, LOW = ON:
  
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);

  
// Инициализируем декодер:
  
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handlertrue);
  
DCC.SetupDecoder0x000x00kDCC_INTERRUPT );
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() // Оновная функция, повторяющаяся бесконечно.
{
  
DCC.loop(); // постонно крутим DCC библиотеку, что бы не пропускать пакеты.
}// end of loop   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Обработчик стрелочных пакетов. Эта функция запускается, когда библиотека ловит пакет:
void BasicAccDecoderPacket_Handler(int addressboolean activatebyte data)
{
  
// Конвертируем адрес стрелки в формат Мультимауса и Рокрейла:
  
address -= 1address *= 4address += 1address += (data 0x06) >> 1address += 4;

  
boolean enable = (data 0x01) ? 0//получаем команду декодеру

  
if ( address == DECODER_ADDRESS_1) {// Если адрес в пакете == адресу декодера #1, то обрабатываем флаг1
    
if ( enable && !on_already1) { // Флаг1 в 1
      
flag1 true;
      
on_already1 true//больше не ловим остальные 5 пакетов ВКЛ
      
set_lights(); // меняем схему при переключении
    
}
    if ( !
enable && on_already1) { // Флаг1 в 0
      
flag1 false;
      
on_already1 false//больше не ловим остальные 5 пакетов ВЫКЛ
      
set_lights(); // меняем схему при переключении
    
}
  }
  if ( 
address == DECODER_ADDRESS_2) { // Если адрес в пакете == адресу декодера #2, то обрабатываем флаг2
    
if ( enable && !on_already2) { // Флаг2 в 1
      
flag2 true;
      
on_already2 true//больше не ловим остальные 5 пакетов ВКЛ
      
set_lights(); // меняем схему при переключении
    
}
    if ( !
enable && on_already2) { // Флаг2 в 0
      
flag2 false;
      
on_already2 false//больше не ловим остальные 5 пакетов ВЫКЛ
      
set_lights(); // меняем схему диодов при переключении
    
}
  }
}
// end of handler

// Функция установки диодов во ВКЛ/ВЫКЛ
void set_lights() {
  
// Логика кобработки флагов:
  
if ((flag1 == false) && (flag2 == false)) { //Логика состояния 0&0
    // Меняем HIGH на LOW по вкусу! HIGH = диод не горит, LOW = диод горит
    
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);
  }
  if ((
flag1 == false) && (flag2 == true)) { //Логика состояния 0&1
    
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);
  }
  if ((
flag1 == true) && (flag2 == false)) { //Логика состояния 1&0
    
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);
  }
  if ((
flag1 == true) && (flag2 == true)) { //Логика состояния 1&1
    
digitalWrite(WIRE1_PINHIGH); digitalWrite(WIRE2_PINHIGH); digitalWrite(WIRE3_PINHIGH); digitalWrite(WIRE4_PINHIGH); digitalWrite(WIRE5_PINHIGH);
  }

}
//End of sketch 
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка.
Московский Модуль H0-присоединяйтесь!

Последний раз редактировалось BR95009; 15.10.2015 в 09:52.
BR95009 вне форума  
Вверх
3 пользователя(ей) сказали cпасибо: