Arduino 5, AŽD přejezdové zařízení bez závor (LED + zvuk)

Dnes vám popíšu zapojení a program pro řízení přejezdového zařízení AŽD typ 71.

Použité komponenty:
1 x Arduino Pro Mini (Nano) - Aliexpress (cca 35 CZK klon)
1 x DFPlayer MP3 (Mp3-TF-16P) - AliExpress (cca 30 CZK verze mp3-tf-16p)
4 x led červená
2 x led bílá
1 x spínač dle volby, možné i magnetické spínače do kolejí
1 x odpor 10 k pro spínač
6 x odpor 330 ohmů pro led
1 x odpor 1 k pro pin TX propojení modulů (ochrana)
1 x microSD paměťová karta - formát FAT32
1 x repro 3 W 4 ohmy

microSD karta - do kořenového adresáře nahrajte zvuk s názvem 0001.mp3
Zvuk AŽD 71 můžete stáhnout zde.

Zapojení:
Pin 4 a 5, 7 a 8 - červená světla (4 a 7 jsou levá, 5 a 8 jsou pravá)
Pin 6 a 9 - bílá světla
Pin 12 - spínač proti plus (odpor proti GND)

Napájení:
5 V všechny moduly.

Video:  (Pozor na videu je jiná verze se základním Pull-Up rezistor spínačem proti GND a starší verzí programu, která způsobovala krátkodobé nesvícení ani jednoho červeného světla ve výstraze, což originál nezpůsobuje - verze programu v obsahu je již opravena)


Program:
#include <SoftwareSerial.h>   //vejrov.cz
SoftwareSerial mySerial(2, 3); // RX, TX
uint8_t play1[10] = { 0X7E, 0xFF, 0x06, 0X03, 00, 00, 0x01, 0xFE, 0xF7, 0XEF};
int red1 = 4;
int red2 = 5;  //vejrov.cz
int red3 = 7;  //vejrov.cz
int red4 = 8;
int white1 = 6;
int white2 = 9;
int ledDelay = 400; 
bool wait = true;
const int  buttonPin = 12; 
int buttonPushCounter = 0;   // počítadlo stlačení tlačítka
int buttonState = 0;         // současný stav tlačítka
int lastButtonState = 0;     // předchozí stav tlačítka


void setup()  
{
pinMode(red1, OUTPUT); //vejrov.cz
pinMode(red2, OUTPUT);
pinMode(red3, OUTPUT);
pinMode(red4, OUTPUT);
pinMode(white1, OUTPUT);
pinMode(white2, OUTPUT);
mySerial.begin(9600);
Serial.begin(9600);
pinMode(buttonPin, INPUT);
}

void loop()
{
buttonState = digitalRead(buttonPin);  

if (buttonState != lastButtonState) {
         if (buttonState == HIGH) {
            buttonPushCounter++;
            Serial.println("on");
            Serial.print("number of button pushes:  ");
            Serial.println(buttonPushCounter);
        }
        else {
            Serial.println("off");
        }
        }
          lastButtonState = buttonState;
 //vejrov.cz
if (buttonPushCounter % 2 == 0) { 

    if (wait == true){delay (6000);} //delay - délka zpoždění bílého světla 6000 = 6 sekund - max 32 000 = 32 sekund
  wait = false;
digitalWrite(white1, HIGH);
digitalWrite(white2, LOW);
delay(ledDelay); 
digitalWrite(white1, LOW); 
digitalWrite(white2, HIGH);
delay(ledDelay);  //vejrov.cz
 }

else {
 wait = true;
  for (int i=0; i<10; i++) {mySerial.write( play1[i]);}
 delay(10);   //vejrov.cz
digitalWrite(red1, HIGH); 
digitalWrite(red3, HIGH); 
delay(ledDelay);   //vejrov.cz
digitalWrite(red1, LOW);  
digitalWrite(red3, LOW); 
 delay(100);
digitalWrite(red2, HIGH);
digitalWrite(red4, HIGH);
delay(ledDelay); 
delay(200);  //vejrov.cz
digitalWrite(red2, LOW); 
digitalWrite(red4, LOW); 
 }
}