Yo no consigo trabajar mi codigo

Yo obtengo el relay siempre funcionando cuando cargo mi codigo. Aplico al boton un debounce pero cuando yo presiono consigo un parpadeo constante. No funciona correctamente. Los botones si dan la orden de encender el led o apagarlo, funcionan correctamente pero cuando yo pruebo a imprimirlos por consola obtengo un caracter raro como $ o aa no como boolean 0 o 1

/* Relays */

#define PUMP_PIN D6 //PUMP (Red LED)
#define LAMP_PIN D7 //LAMP (Green LED)
boolean pumpStatus = 0;
boolean lampStatus = 0;

/* Buttons */

#define PUMP_ON_BUTTON D9 //push-button PUMP (Red)
#define LAMP_ON_BUTTON D10 //push-button LAMP (Green)

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(10);
  Serial.println("ArduFarmBot 2");
  Serial.println(".... Starting Setup");
  Serial.println("  ");


  pinMode(PUMP_PIN, OUTPUT);
  pinMode(LAMP_PIN, OUTPUT);
  pinMode(PUMP_ON_BUTTON, INPUT_PULLUP);
  pinMode(LAMP_ON_BUTTON, INPUT_PULLUP);

  digitalWrite(PUMP_PIN, LOW);
  digitalWrite(LAMP_PIN, LOW);

}

void loop() {
  // put your main code here, to run repeatedly:
  readLocalCmd();

}

/****************************************************************
* Read local commands (Pump and Lamp buttons are normally "HIGH"):
****************************************************************/

void readLocalCmd()
{
  boolean digiValue = debounce(PUMP_ON_BUTTON);
  Serial.println(digiValue);
  if(!digiValue)
  {
    pumpStatus = !pumpStatus;
    aplyCmd();
  }
  digiValue = debounce(LAMP_ON_BUTTON);
  if(!digiValue)
  {
    lampStatus = !lampStatus;
    aplyCmd();
  }
}

/***************************************************
* Receive Commands and act on actuators
****************************************************/

void aplyCmd()
{
  if(pumpStatus == 1)
  {
    digitalWrite(PUMP_PIN, HIGH);
    
  }
  else
  {
    digitalWrite(PUMP_PIN, LOW);
  }

  if(lampStatus == 1)
  {
    digitalWrite(LAMP_PIN, HIGH);
  }
  else
  {
    digitalWrite(LAMP_PIN, LOW);
  }
}


/***************************************************
* Debouncing a key
****************************************************/
boolean debounce(int pin)
{
  boolean state;
  boolean previousState;
  const int debounceDelay = 30;
  
  previousState = digitalRead(pin);
  for(int counter=0; counter< debounceDelay; counter++)
  {
    delay(1);
    state = digitalRead(pin);
    if(state != previousState)
    {
      counter = 0;
      previousState = state;
    } 
  }
  return state;
}

Es lo que dice tu código. Dice... si esta en LOW

  if(!digiValue)
  {
    pumpStatus = !pumpStatus;
    aplyCmd();
  }

haz que el rele cambie a cada momento

Lo que deberías preguntar es

  if(!digiValue && digiValueAnt)
  {
    pumpStatus = !pumpStatus;
    aplyCmd();
  }
   digiValueAnt = digiValue;

Y define digiValueAnt como boolean pero no en el loop por favor, debe ser global.