Brocken-Meister
Регистрация: 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_PIN, OUTPUT); pinMode(WIRE2_PIN, OUTPUT); pinMode(WIRE3_PIN, OUTPUT); pinMode(WIRE4_PIN, OUTPUT); pinMode(WIRE5_PIN, OUTPUT);
//Выставляем их в "НIGН", что бы при запуске светофор не горел. Так как они подключены к общему плюсу и минусом к выводам, то управляющая логика будет обратной:
// HIGH = OFF, LOW = ON:
digitalWrite(WIRE1_PIN, HIGH); digitalWrite(WIRE2_PIN, HIGH); digitalWrite(WIRE3_PIN, HIGH); digitalWrite(WIRE4_PIN, HIGH); digitalWrite(WIRE5_PIN, HIGH);
// Инициализируем декодер:
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
DCC.SetupDecoder( 0x00, 0x00, kDCC_INTERRUPT );
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() // Оновная функция, повторяющаяся бесконечно.
{
DCC.loop(); // постонно крутим DCC библиотеку, что бы не пропускать пакеты.
}// end of loop ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Обработчик стрелочных пакетов. Эта функция запускается, когда библиотека ловит пакет:
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data)
{
// Конвертируем адрес стрелки в формат Мультимауса и Рокрейла:
address -= 1; address *= 4; address += 1; address += (data & 0x06) >> 1; address += 4;
boolean enable = (data & 0x01) ? 1 : 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_PIN, HIGH); digitalWrite(WIRE2_PIN, HIGH); digitalWrite(WIRE3_PIN, HIGH); digitalWrite(WIRE4_PIN, HIGH); digitalWrite(WIRE5_PIN, HIGH);
}
if ((flag1 == false) && (flag2 == true)) { //Логика состояния 0&1
digitalWrite(WIRE1_PIN, HIGH); digitalWrite(WIRE2_PIN, HIGH); digitalWrite(WIRE3_PIN, HIGH); digitalWrite(WIRE4_PIN, HIGH); digitalWrite(WIRE5_PIN, HIGH);
}
if ((flag1 == true) && (flag2 == false)) { //Логика состояния 1&0
digitalWrite(WIRE1_PIN, HIGH); digitalWrite(WIRE2_PIN, HIGH); digitalWrite(WIRE3_PIN, HIGH); digitalWrite(WIRE4_PIN, HIGH); digitalWrite(WIRE5_PIN, HIGH);
}
if ((flag1 == true) && (flag2 == true)) { //Логика состояния 1&1
digitalWrite(WIRE1_PIN, HIGH); digitalWrite(WIRE2_PIN, HIGH); digitalWrite(WIRE3_PIN, HIGH); digitalWrite(WIRE4_PIN, HIGH); digitalWrite(WIRE5_PIN, HIGH);
}
}
//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.
|