Problema com código

Olá pessoal, estou em um projeto no momento em que tenho um RTC + LCD 16X2 + I2C + Servo, no entanto há algo de errado com meu código que faz com que o meu pushbutton para ativar o servo não funcione corretamente, o que acontece é que com o codigo abaixo eu pressiono o button e o servo não funciona pois há algo de erro na programação do loop que eu não consigo identificar.

  // Programa : Controlando o servo com 3 chaves
// Autor: Arduino e Cia

#include <Servo.h> 
#include <DS3231.h>
DS3231  rtc(SDA, SCL);
Servo servo;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE);
int estadoBotao = 0; 
int Chave=3; //Pino a ser ligado na chave esquerda
//int ChaveCentral=4;  //Pino a ser ligado na chave central
//int ChaveDireita=5;  //Pino a ser ligado na chave direita

void setup() 
{ 
  // Setup Serial connection
  Serial.begin(9600);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
  
  // Initialize the rtc object
  rtc.begin();
  
   lcd.begin (16,2);
  
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(MONDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(13, 42, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(28, 12, 2016);   // Set the date to January 1st, 2014
  
  // Pino de dados do servo conectado ao pino 9 do Arduino
  servo.attach(9);   
  //Define o pino como entrada
  pinMode(Chave, INPUT);      
  //Aciona o resistor pull-up interno
  digitalWrite(Chave, HIGH);  
  //pinMode(ChaveCentral, INPUT);
  //digitalWrite(ChaveCentral, HIGH);
  //pinMode(ChaveDireita, INPUT);
  //digitalWrite(ChaveDireita, HIGH);
} 

void loop() 
{ 
 //Le o valor da Chave Esquerda (On/Off)
  estadoBotao=digitalRead(Chave);  
  //Caso a chave seja pressionada, movimenta o servo
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print(rtc.getTemp());
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print(rtc.getTimeStr());    

  //Blink   
  delay(3000);     
  lcd.display();   
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.clear();

  lcd.print("Data: "); 
  lcd.print(rtc.getDateStr()); 
  
  //Blink 
  delay(3000);   
  lcd.clear();
  if(estadoBotao == LOW) 
    {
      delay(200);
      servo.write(180); delay(4000); //espera 4 segundos
      servo.write(0); delay(500);
   }
  //lcd.noDisplay();   
  
  //Serial.print(rtc.getDOWStr()); Dia da senaba
 // Serial.print(" ");
  
  // Send date
  //Serial.print(rtc.getDateStr());
  //Serial.print(" -- ");

  // Send time
  //Serial.println(rtc.getTimeStr());
  
  //Serial.print("Temperature:");
  //Serial.print(rtc.getTemp());
  //Serial.println(" C");
  
  
}

Da seguinte maneira ele funciona o botão normalmente porém o LCD para.

#include <Servo.h> 
#include <DS3231.h>
DS3231  rtc(SDA, SCL);
Servo servo;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE);
int estadoBotao = 0; 
int Chave=3; //Pino a ser ligado na chave esquerda
//int ChaveCentral=4;  //Pino a ser ligado na chave central
//int ChaveDireita=5;  //Pino a ser ligado na chave direita

void setup() 
{ 
  // Setup Serial connection
  Serial.begin(9600);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
  
  // Initialize the rtc object
  rtc.begin();
  
   lcd.begin (16,2);
  
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(MONDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(13, 42, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(28, 12, 2016);   // Set the date to January 1st, 2014
  
  // Pino de dados do servo conectado ao pino 9 do Arduino
  servo.attach(9);   
  //Define o pino como entrada
  pinMode(Chave, INPUT);      
  //Aciona o resistor pull-up interno
  digitalWrite(Chave, HIGH);  
  //pinMode(ChaveCentral, INPUT);
  //digitalWrite(ChaveCentral, HIGH);
  //pinMode(ChaveDireita, INPUT);
  //digitalWrite(ChaveDireita, HIGH);
} 

void loop() 
{ 
 //Le o valor da Chave Esquerda (On/Off)
  estadoBotao=digitalRead(Chave);  
  //Caso a chave seja pressionada, movimenta o servo
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print(rtc.getTemp());
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print(rtc.getTimeStr());    

  //Blink   
  delay(3000);     
  lcd.display();   
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.clear();

  lcd.print("Data: "); 
  lcd.print(rtc.getDateStr()); 
  
  //Blink 
  delay(3000);   
  lcd.clear();   
  if(estadoBotao == LOW) 
    {
      delay(200);
      servo.write(180); delay(4000); //espera 4 segundos
      servo.write(0); delay(500);
   }
  //lcd.noDisplay();   
  
  //Serial.print(rtc.getDOWStr()); Dia da senaba
 // Serial.print(" ");
  
  // Send date
  //Serial.print(rtc.getDateStr());
  //Serial.print(" -- ");

  // Send time
  //Serial.println(rtc.getTimeStr());
  
  //Serial.print("Temperature:");
  //Serial.print(rtc.getTemp());
  //Serial.println(" C");
  
  
}

No teu código não vejo onde estejas a fazer o debounce do teu botão.Estas a fazê-lo em hardware?

Desculpe me, sou iniciante no arduino e mal tenho ideia do que se trata. Não fiz debounce.

Porém não acho que venha a ser isto pois pelo que li na internet o debounce seria utilizado pra corrigir erros de contato mecanico no botão, o que não é a causa do meu problema.

EDIT: Fiz o teste apertando o botão várias vezes e realmente ele funciona algumas vezes, logo deve ser mesmo problema de debounce. Poderia me ajudar com resolver isso ? E quando ele funciona o LCD automaticamente apaga.

Tens de fazer o debounce ao botao para resolver os "falsos" disparos do botao mecanico. Vê aqui a tua resposta esta la dentro http://playground.arduino.cc/Learning/SoftwareDebounce Extrai a lógica, entende o que é feito e aplica no teu código ...