Az eredeti Arduino-kód megtekintése
Ez a letölthető .ino tartalma; megjelenítéskor a sortöréseket a böngészőhöz igazítjuk.
// ======================================================================
// Két Viessmann 3 LED-es fénysorompó szinkron vezérlése
//
// AUTOMATA ÜZEM: LDR + lézer alapján működik
// KÉZI ÜZEM: gomb rövid nyomása -> szabad/tílos váltás
// 2 mp hosszú nyomás -> automata <-> kézi váltás
//
// LED logika: harmadik láb mindig INPUT, így nem világít össze semmi
// GOMB: A0 (INPUT_PULLUP) -> LOW = nyomva, HIGH = nincs nyomva
// MODE kijelző: D13 (LOW=automata, HIGH=kézi)
// ======================================================================
// -------------------
// JELZŐ 1 lábai
// -------------------
const int S1_SARGA = 2;
const int S1_PIROS = 3;
const int S1_FEHER = 4;
// -------------------
// JELZŐ 2 lábai
// -------------------
const int S2_SARGA = 8;
const int S2_PIROS = 9;
const int S2_FEHER = 10;
// -------------------
// Bemenetek
// -------------------
const int LDR_PIN = A1; // automata fénykapu
const int BUTTON_PIN = A0; // gomb (INPUT_PULLUP)
const int MODE_PIN = 13; // visszajelző LED (automat/kezi)
// -------------------
// Állapotváltozók
// -------------------
unsigned long lastToggle = 0;
bool feherState = false;
bool pirosState = false;
unsigned long buttonPressStart = 0;
bool lastButton = HIGH;
bool manualMode = false; // false = automata, true = kézi
bool manualTilos = false; // kézi módban aktív jelzés
// ======================================================================
// Inicializálás
// ======================================================================
void setup() {
Serial.begin(9600);
pinMode(S1_SARGA, OUTPUT);
pinMode(S1_PIROS, OUTPUT);
pinMode(S1_FEHER, OUTPUT);
pinMode(S2_SARGA, OUTPUT);
pinMode(S2_PIROS, OUTPUT);
pinMode(S2_FEHER, OUTPUT);
pinMode(LDR_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(MODE_PIN, OUTPUT); // manuális/automata jelzés
allOff();
}
// ======================================================================
// Fő loop
// ======================================================================
void loop() {
// -------------------------------------
// 1) GOMB KEZELÉSE (INPUT_PULLUP)
// -------------------------------------
bool btn = digitalRead(BUTTON_PIN);
// Lenyomás (LOW)
if (btn == LOW && lastButton == HIGH) {
buttonPressStart = millis();
}
// Felengedés (HIGH)
if (btn == HIGH && lastButton == LOW) {
unsigned long pressTime = millis() - buttonPressStart;
if (pressTime >= 2000) {
// hosszú nyomás -> üzemmód váltás
manualMode = !manualMode;
Serial.print("MOD VALTAS: ");
Serial.println(manualMode ? "KEZI" : "AUTOMATA");
} else {
// rövid nyomás -> csak kézi módban érvényes
if (manualMode) {
manualTilos = !manualTilos;
Serial.print("KEZI VALTAS: ");
Serial.println(manualTilos ? "TILOS" : "SZABAD");
}
}
}
lastButton = btn;
// -------------------------------------
// 2) MODE visszajelző (D13)
// -------------------------------------
digitalWrite(MODE_PIN, manualMode ? HIGH : LOW);
// -------------------------------------
// 3) AUTOMATA / KÉZI ÜZEM LOGIKA
// -------------------------------------
bool tilos = false;
if (!manualMode) {
// AUTOMATA: LDR vezérlés
int feny = analogRead(LDR_PIN);
tilos = (feny < 400); // határérték
Serial.print("AUTO feny=");
Serial.print(feny);
Serial.print(" tilos=");
Serial.println(tilos);
}
else {
// KÉZI: LDR-t ignoráljuk
tilos = manualTilos;
Serial.print("KEZI tilos=");
Serial.println(tilos);
}
// -------------------------------------
// 4) JELZÉS VEZÉRLÉS
// -------------------------------------
if (!tilos) {
feherVillog();
} else {
pirosValtakozik();
}
}
// ======================================================================
// LED VEZÉRLÉS
// ======================================================================
void allOff() {
pinMode(S1_SARGA, OUTPUT); digitalWrite(S1_SARGA, LOW);
pinMode(S1_PIROS, OUTPUT); digitalWrite(S1_PIROS, LOW);
pinMode(S1_FEHER, OUTPUT); digitalWrite(S1_FEHER, LOW);
pinMode(S2_SARGA, OUTPUT); digitalWrite(S2_SARGA, LOW);
pinMode(S2_PIROS, OUTPUT); digitalWrite(S2_PIROS, LOW);
pinMode(S2_FEHER, OUTPUT); digitalWrite(S2_FEHER, LOW);
}
// FEHÉR: piros HIGH, fehér LOW, sárga INPUT
void feherOn() {
pinMode(S1_SARGA, INPUT);
pinMode(S1_PIROS, OUTPUT); digitalWrite(S1_PIROS, HIGH);
pinMode(S1_FEHER, OUTPUT); digitalWrite(S1_FEHER, LOW);
pinMode(S2_SARGA, INPUT);
pinMode(S2_PIROS, OUTPUT); digitalWrite(S2_PIROS, HIGH);
pinMode(S2_FEHER, OUTPUT); digitalWrite(S2_FEHER, LOW);
}
// JOBB PIROS: sárga HIGH, piros LOW
void jobbPirosOn() {
pinMode(S1_FEHER, INPUT);
pinMode(S1_SARGA, OUTPUT); digitalWrite(S1_SARGA, HIGH);
pinMode(S1_PIROS, OUTPUT); digitalWrite(S1_PIROS, LOW);
pinMode(S2_FEHER, INPUT);
pinMode(S2_SARGA, OUTPUT); digitalWrite(S2_SARGA, HIGH);
pinMode(S2_PIROS, OUTPUT); digitalWrite(S2_PIROS, LOW);
}
// BAL PIROS: sárga LOW, piros HIGH
void balPirosOn() {
pinMode(S1_FEHER, INPUT);
pinMode(S1_SARGA, OUTPUT); digitalWrite(S1_SARGA, LOW);
pinMode(S1_PIROS, OUTPUT); digitalWrite(S1_PIROS, HIGH);
pinMode(S2_FEHER, INPUT);
pinMode(S2_SARGA, OUTPUT); digitalWrite(S2_SARGA, LOW);
pinMode(S2_PIROS, OUTPUT); digitalWrite(S2_PIROS, HIGH);
}
// ======================================================================
// VILLOGÁS – SZABAD
// ======================================================================
void feherVillog() {
if (millis() - lastToggle > 750) {
lastToggle = millis();
feherState = !feherState;
if (feherState) feherOn();
else allOff();
}
}
// ======================================================================
// VILLOGÁS – TILOS
// ======================================================================
void pirosValtakozik() {
if (millis() - lastToggle > 750) {
lastToggle = millis();
pirosState = !pirosState;
if (pirosState) jobbPirosOn();
else balPirosOn();
}
}
A bemutató a csatolt programra, a korábbi közös építésnél rögzített mérésekre és a jelenlegi bekötési pontosításokra épül. A 400-as küszöb gyakorlati eredmény. A termékfotók forrásait az alkatrészeknél feltüntettük; a lézer képe kivitelpélda. Új hardveres próbát itt nem végeztünk.