//Itt állíthatod be a megfelelő pineket ESP/Arduino-n
//ha a target ESP8266 akkor...
#ifdef ESP8266
  #define RELE_PIN D1
  #define GOMB_PIN D2
//minden mas esetben (pld Arduino) ...
#else
  #define RELE_PIN 3
  #define GOMB_PIN 2
#endif

#define GOMB_TURES 500 //500ms -enkent 1 gomblenyomast tesz lehetove

//attachInterrupt miatt a "volatile" kell, hogy a funkcióból is felül lehessen írni a változót
volatile bool vilagitasStatusz = false;
volatile unsigned long utolsoInterakcio = 0; //ez egy időbélyem, ebbe tároljuk a millis funkcióval az utolsó változás pillanatát

void gombFigyelo() {
   if (utolsoInterakcio == 0 || utolsoInterakcio < millis() - GOMB_TURES) {
	 // ez egy logikai elágazás által végre hajtott érték váltás. 
	 // Ha true a jelenlegi statusz akkor false értékre, ha false akkor pedig true értékre állítja a változót
	 
     vilagitasStatusz = !vilagitasStatusz ? true : false; 
     if (vilagitasStatusz == true) {
        vilagitas(true); //bekapcsoljuk
     }else {
        vilagitas(false); //kikapcsoljuk
     }
     
     //frissítjuk a változás pillanatában az utolsoInterakció időbélyegét
     utolsoInterakcio = millis(); 
   }
}

//vilgaitast vezérlő funkció, ami egy bool értéket vár a kapcsolás végrehajtásához
void vilagitas(bool statusz) {
  Serial.print("Vilagitas = ");
  //statusz ? HIGH : LOW parancs abban az esetben ha a statusz true, HIHG értéket ad át a digitalWrite 2. 
  //paraméterének, ha false, akkor pedig LOW ad át, ahogy az a digitalWrite megköveteli
  //ebben az esetben nem fogja megváltoztatni a statusz értékét a parancsunk
  digitalWrite(RELE_PIN, statusz ? HIGH : LOW);  
  if (statusz) { Serial.println("BE"); }
  else { Serial.println("KI"); }
}

void setup() {
  Serial.begin(115200);
  Serial.println("Indulas ...");
  pinMode(GOMB_PIN, INPUT);
  pinMode(RELE_PIN, OUTPUT);
  digitalWrite(RELE_PIN, LOW);
  //gomb lenyomasra fusson csak
  attachInterrupt(GOMB_PIN, gombFigyelo, RISING);
}

void loop() {
  
}
