# define RPRESS LOW     // replay "pressing" button
# define RRELEASE HIGH  // relay not pressing
void setup() {
  Serial.begin(115200);
  Serial.println("\nWake up!\n");
  slaveSetup();
  masterSetup();
}
void loop() {
  slaveLoop();
  masterLoop();
  delay(20);    // poor man's debounce
}
// MASTER
# include <TimerOne.h>
// # include <SoftwareSerial.h>
//# define pirPin 3
# define redLed 6
# define greenLed 9
# define blueLed 10
# define GarSwitch 4
# define GarRelay1 5
# define GarRelay2 11
//# define Fan 12
//# define ldrPin A0
//# define tempPin A1
int garageState = 0;
int lastGarageState = 0;
char ch;
bool HC05_Awake = false;  // poke the HC05 periodically, or not
// SoftwareSerial mySerial(7, 8);  // Rx | Tx
# define mySerial Serial1
// MASTER
void masterSetup() {
  Timer1.initialize(40000000);
  Timer1.attachInterrupt(KeepAlive);
//  Serial.begin(115200);
//  Serial.println("\nWake up!\n");
  mySerial.begin(38400);
//...  mySerial.print('a');
  pinMode(GarSwitch, INPUT_PULLUP);
  lastGarageState = digitalRead(GarSwitch);
  pinMode(GarRelay1, OUTPUT);
  pinMode(GarRelay2, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
//  pinMode(Fan, OUTPUT);
//  pinMode(ldrPin, INPUT);
//  pinMode(pirPin, INPUT);
//  pinMode(tempPin, INPUT);
  digitalWrite(redLed, HIGH);
  digitalWrite(greenLed, HIGH);
  digitalWrite(blueLed, HIGH);
  digitalWrite(GarRelay1, RRELEASE);  // master not "pressing" the real button
  digitalWrite(GarRelay2, LOW);
  digitalWrite(greenLed, LOW);
//  digitalWrite(Fan, LOW);
  lastGarageState = digitalRead(GarSwitch);  // normally high
}
// MASTER
int counter;
void masterLoop() {
  // Sending
  // read input once
  garageState = digitalRead(GarSwitch);  // LOW = pressed
  if (garageState != lastGarageState) {
Serial.print(" this ");
    mySerial.print('a');
    if (garageState == LOW) {  // switch got pressed
      Serial.print(" ");
      Serial.print(counter);
      counter++;
      Serial.println(" master print an 'a'");
      mySerial.print('a');
      digitalWrite(blueLed, HIGH);
      digitalWrite(redLed, HIGH);
      digitalWrite(greenLed, LOW);
    } else {  // switch got released
      Serial.print(" ");
      Serial.print(counter);
      counter++;
      Serial.println(" master print a 'c'");
      mySerial.print('c');
      digitalWrite(blueLed, HIGH);
      digitalWrite(greenLed, HIGH);
      digitalWrite(redLed, LOW);
    }
  }
// Receiving
  if (mySerial.available()) {
    char ch = mySerial.read();
    Serial.write(ch);
    if (ch == 'b') {
      Serial.print(" ");
      Serial.print(counter);
      counter++;
      Serial.println(" master print a 'b'");
      mySerial.print('b');
      digitalWrite(GarRelay1, RPRESS);
      digitalWrite(blueLed, LOW);
      digitalWrite(redLed, HIGH);
      digitalWrite(greenLed, HIGH);
//...      delay(1000);
    } else if (ch == 'd') {
      Serial.print(" ");
      Serial.print(counter);
      counter++;
      Serial.println(" master print a 'd'");
      mySerial.print('d');
      digitalWrite(blueLed, HIGH);
      digitalWrite(redLed, LOW);
      digitalWrite(greenLed, HIGH);
      digitalWrite(GarRelay1, RRELEASE);
    }
  }
  lastGarageState = garageState;
//  delay(20);  // poor man's debouncing is done once in the loop() function
}
void KeepAlive() {
  if (HC05_Awake) {
    mySerial.print('m');
    Serial.print(" alive! ");
  }
}
/////
// SLAVE
//# include <SoftwareSerial.h>
//SoftwareSerial mySerial(7, 8);  // Rx | Tx
# define yaSerial Serial2
# define redLed 27 // 25 oops! latest head slapper
# define greenLed 25 // 27
# define blueLed 29
# define Button 31
// # define pwrLed 9
// char slaveCH;  global unused!  ...
int buttonState = 0;
int lastButtonState = 0;
int slaveCounter = 1000;  // so we can see which counter easilier
void slaveSetup() {
//  Serial.begin(115200);
  yaSerial.begin(38400);
 // pinMode(pwrLed, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
  pinMode(Button, INPUT_PULLUP);
  // digitalWrite(greenLed, LOW);
  // digitalWrite(redLed, LOW);
  // digitalWrite(blueLed, LOW);
  // analogWrite(pwrLed, 3);
//.. catch the state of the button at startup
  lastButtonState = digitalRead(Button);  // LOW = pressed
}
void slaveLoop() {
  // read input once
  buttonState = digitalRead(Button);  // LOW = pressed
  if (buttonState != lastButtonState) {
    yaSerial.print('a');
    if (buttonState == LOW) {  // switch got pressed
      Serial.print(" ");
      Serial.print(slaveCounter);
      slaveCounter++;
      Serial.println(" slave print a 'b'");
      yaSerial.print('b');
      digitalWrite(blueLed, LOW);
      digitalWrite(redLed, HIGH);
      digitalWrite(greenLed, HIGH);
    } else {  // switch got released
      Serial.print(" ");
      Serial.print(slaveCounter);
      slaveCounter++;
      Serial.println(" slave print a 'd'");
      yaSerial.print('d');
      digitalWrite(blueLed, HIGH);
      digitalWrite(greenLed, LOW);
      digitalWrite(redLed, HIGH);
    }
  }  //...
    // Receiving
  if (yaSerial.available()) {
    char ch = yaSerial.read();
    Serial.write(ch);
    if (ch == 'a') {
    
      Serial.print(" ");
      Serial.print(slaveCounter);
      slaveCounter++;
      Serial.println(" slave received an 'a'");
      digitalWrite(redLed, LOW);
      digitalWrite(greenLed, HIGH);
      digitalWrite(blueLed, HIGH);
    } 
    else if (ch == 'c') {
      Serial.print(" ");
      Serial.print(slaveCounter);
      slaveCounter++;
      Serial.println(" slave received a 'c', echoing ");
      yaSerial.print('c');
      digitalWrite(redLed, HIGH);
      digitalWrite(greenLed, LOW);
      digitalWrite(blueLed, HIGH);
    }
    else if (ch == 'm') {
      Serial.println("              OK, alive! ");
    }
    else {
      Serial.print(" ");
      Serial.print((int) ch);
      Serial.println(" < slave unknown char input ");
    }
  }
  lastButtonState = buttonState;
//  delay(20);  // poor man's debouncing is done once in the loop() function
}
MASTER (as)
garage
switch
SLAVE
HC05 X
slave
button