// ***************************************************************
// Kisautó világításvezérlő
//
// Alkalmazott vezérlő: Arduino Uno
//
// Bementek:
//
// BUTTON1 -> PIN8
// BUTTON2 -> PIN9
// BUTTON3 -> PIN10
//
// Kimenetek:
// LED1 -> PIN2
// LED2 -> PIN3
// LED3 -> PIN4
//
// A program más kivezetéseket nem használ.
//
// A ledek korlátozó ellenállással a táp felé, aktív alacsony szintre
// vannak kötve.
// A gombok külső felhúzó ellenállással a táp felé, aktív alacsony
// szintet kapcsolnak.
//
// BUTTON1 megnyomásával felkapcsolódik LED1, és úgy is marad
// a következő lenyomásig. Ekkor lekapcsol.
//
// BUTTON2 lenyomás indítja LED2 villogását 500/500ms ütemben
// következő lenyomásig.
//
// BUTTON3 lenyomás indítja LED3 villogását 250/250ms ütemben
// következő lenyomásig.
//
// Gyarmati Krisztián @ sargarigo
// 2021-11-20
//
// ***************************************************************



#define LED1 2
#define LED2 3
#define LED3 4

#define BUTTON1 8
#define BUTTON2 9
#define BUTTON3 10

char led1eng = 1;
char led2 = 1, led2eng = 0, led2tarolo = 0;
char led3 = 1, led3eng = 0; // ledek állapotait őrizzük bennük

char button1 = 1, button2 = 1, button3 = 1; // gombok állapotait őrizzük bennük
char button1_ = 1, button2_ = 1, button3_ = 1; // gombok előző állapotait őrizzük bennük

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);

  pinMode(BUTTON1, INPUT);
  pinMode(BUTTON2, INPUT);
  pinMode(BUTTON3, INPUT);

  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, HIGH);

  led2tarolo = 2;
}

void loop() {
  // tároljuk az előző állapotokat
  button1_ = button1;
  button2_ = button2;
  button3_ = button3;


  // ***************************************************************
  // gombok kezelése
  // ***************************************************************

  button1 = digitalRead(BUTTON1);
  button2 = digitalRead(BUTTON2);
  button3 = digitalRead(BUTTON3);

  if (button1_ == 1 && button1 == 0)  // éppen most engedte el a gombot
    led1eng = 1 - led1eng;  // ha ki volt kapcsolva, akkor bekapcsoljuk és viszont

  if (button2_ == 1 && button2 == 0)  // éppen most engedte el a gombot
    led2eng = 1 - led2eng;  // ha ki volt kapcsolva, akkor bekapcsoljuk és viszont

  if (button3_ == 1 && button3 == 0)  // éppen most engedte el a gombot
    led3eng = 1 - led3eng;  // ha ki volt kapcsolva, akkor bekapcsoljuk és viszont





  // ****************************************************************
  // LED1 fényszóró
  // ***************************************************************
  digitalWrite(LED1, led1eng);





  // ***************************************************************
  // LED2 vészvillogó
  // ***************************************************************

  if (led2eng == 1)
  {
    // LED2 villogtató
    if (led2tarolo == 0)  // csak minden második ütemben kapcsoljon
    {
      digitalWrite(LED2, led2);
      led2 = 1 - led2;
      led2tarolo = 2;
    }
    led2tarolo --;
  }
  else
    digitalWrite(LED2, HIGH); // ez csak arra kell, nehogy véletlenül bekapcsolódva maradhasson





  // ***************************************************************
  // LED3 villogó
  // ***************************************************************

  if (led3eng == 1)
  {
    // LED3 villogtató
    digitalWrite(LED3, led3);
    led3 = 1 - led3;
  }
  else
    digitalWrite(LED3, HIGH); // ez csak arra kell, nehogy véletlenül bekapcsolódva maradhasson

  delay(250);
}
