#include <avr/wdt.h> // watchdog knihovna
// ---------- PINY ----------
#define IN_A 0
#define IN_B 1
#define RELAY_A 2
#define RELAY_B 3
#define LED 4
// ---------- ČASY ----------
#define RELAY_PULSE 2000 // délka impulzu relé (2 s)
#define RETURN_TO_A_DELAY 8000 // návrat na A po 8 s stabilního napětí
#define LOOP_DELAY 50 // rychlost hlavní smyčky
// ---------- PROMĚNNÉ ----------
// aktuální zdroj
// 0 = žádný
// 1 = A
// 2 = B
byte currentSource = 0;
// časovače
unsigned long relayTimer = 0;
unsigned long returnTimer = 0;
unsigned long ledTimer = 0;
// stav relé
bool relayActive = false;
byte activeRelay;
// stav LED pro blikání
bool ledState = false;
// ---------- FUNKCE ZAPNUTÍ RELÉ ----------
void startRelay(byte r)
{
digitalWrite(r, HIGH); // zapni relé
activeRelay = r;
relayTimer = millis();
relayActive = true;
}
// ---------- FUNKCE VYPNUTÍ RELÉ ----------
void stopRelay()
{
digitalWrite(activeRelay, LOW);
relayActive = false;
}
// ---------- SETUP ----------
void setup()
{
pinMode(IN_A, INPUT);
pinMode(IN_B, INPUT);
pinMode(RELAY_A, OUTPUT);
pinMode(RELAY_B, OUTPUT);
pinMode(LED, OUTPUT);
digitalWrite(RELAY_A, LOW);
digitalWrite(RELAY_B, LOW);
// LED vypnutá (aktivní LOW)
digitalWrite(LED, HIGH);
// zapnutí watchdogu
wdt_enable(WDTO_2S);
}
// ---------- HLAVNÍ SMYČKA ----------
void loop()
{
wdt_reset(); // reset watchdogu
bool A = digitalRead(IN_A);
bool B = digitalRead(IN_B);
byte targetSource = currentSource;
// ---------- ROZHODOVÁNÍ ----------
if (A)
{
targetSource = 1; // A má prioritu
}
else if (B)
{
targetSource = 2;
}
// ---------- NÁVRAT NA A SE ZPOŽDĚNÍM ----------
if (targetSource == 1 && currentSource == 2)
{
if (returnTimer == 0)
returnTimer = millis();
if (millis() - returnTimer > RETURN_TO_A_DELAY)
{
startRelay(RELAY_A);
currentSource = 1;
returnTimer = 0;
}
}
else
{
returnTimer = 0;
// ---------- PŘEPÍNÁNÍ ----------
if (!relayActive && targetSource != currentSource)
{
if (targetSource == 1)
startRelay(RELAY_A);
if (targetSource == 2)
startRelay(RELAY_B);
currentSource = targetSource;
}
}
// ---------- VYPNUTÍ RELÉ PO IMPULZU ----------
if (relayActive && millis() - relayTimer > RELAY_PULSE)
{
stopRelay();
}
// ---------- DIAGNOSTICKÁ LED (aktivní LOW) ----------
if (currentSource == 1)
{
// A = LED svítí
digitalWrite(LED, LOW);
}
else if (currentSource == 2)
{
// B = LED bliká
if (millis() - ledTimer > 500)
{
ledTimer = millis();
ledState = !ledState;
if (ledState)
digitalWrite(LED, LOW);
else
digitalWrite(LED, HIGH);
}
}
else
{
// žádný zdroj
digitalWrite(LED, HIGH);
}
delay(LOOP_DELAY);
}A
B
A
B