Я, к сожалению, с Arduino никогда не работал. И под рукой у меня его нет.
Но, полистав мануал, приблизительно понял принцип работы, поэтому постараюсь помочь.
1. Для начала поменяем местами светодиоды 9 - 13. После у нас будет совпадать направление нумерации "показание светофора - номер выхода": 1 - 9 (белый), 2 - 10 (красный), 3 - 11 (КЖ) и т.д.
Это нам пригодится в коде. Если посмотреть внимательно, то номер_выхода = показание_светофора + 8 (будем пользоваться далее, чтоб не писать множество лишних проверок в коде).
2. Пока мы используем только 2 параметра из 4, будем передавать ZDReceiver'ом и принимать на Arduino только их:
<показание_светофора>;<лампа>
Например: 3;1 или 5;0
Таким образом мы передаем и принимаем строку размером 3 байта.
3. Код
// устанавливаем выходы
const int lampPin = 8; // лампа
const int wPin = 9; // белый
const int rPin = 10; // красный
const int ryPin = 11; // КЖ
const int yPin = 12; // желтый
const int gPin = 13; // зеленый
// переменная с предыдущим показанием локомотивного светофора
// (чтобы знать, какой светодиод тушить после переключения сигнала)
int previous = 1;
void setup()
{
// устанавливаем 8 - 13 на вывод
// (вообще лучше сделать циклом, но я оставил для наглядности)
pinMode(lampPin, OUTPUT);
pinMode(gPin, OUTPUT);
pinMode(yPin, OUTPUT);
pinMode(ryPin, OUTPUT);
pinMode(rPin, OUTPUT);
pinMode(wPin, OUTPUT);
Serial.begin(9600); // устанавливаем скорость передачи 9600 бод
Serial.flush(); // очищаем буфер последовательного соединения
}
void loop()
{
int light;
int lamp;
// если доступно 3 или больше байта на входе
if(Serial.available() >= 3)
{
light = Serial.read(); // читаем показание светофора
Serial.read(); // пропускаем симваол;
lamp = Serial.read(); // состаояние лампы
// если показание светофора поменялось
if(light != previous)
{
analogWrite(previous + 8, LOW); // тушим светодиод предыдущего показания
analogWrite(light + 8, HIGH); // зажигаем новый
previous = light; // запоминаем показание
}
//если состояние лампы 1, зажигаем светодиод; если - 0, то тушим
if(lamp == 1)
analogWrite(lampPin, HIGH);
else
analogWrite(lampPin, LOW);
}
}
Пробуйте, отписывайсь. Будем думать вместе