Ayuda con Cubierta móvil

Hola, necesito ayuda. Estoy programando una cubierta para un pequeño invernadero. Utilizo ARDUINO UNO conectado a un MOTOR SHIELD REV3 que invierte el sentido de giro de un motor DC. Lo que quiero es que la cubierta se mueva en función de ciertos valores de temperatura medidos con un sensor TPM36 los cuales se transmiten a un módulo Tinkerkit LCD.

Consigo que se mueva la cubierta, pero quiero instalar un finales de carrera que me paren el motor cuando se cierre el techo y cuando se abra totalmente al invertirse el giro.

Adjunto el código que estoy usando, a ver si me podéis echar una mano:

#include <matrix_lcd_commands.h>
#include <TKLCD.h>
#include <LiquidCrystal.h>
#include <Wire.h>



const int buttonPinAbierto = 4;
const int buttonPinCerrado = 7;
float temperatura = 0; //variable para la temperatura
int motorPin=12; // pin donde se conecta el motor
int buttonStateAbierto=0;
int buttonStateCerrado=0;

void setup(){
 Serial.begin (9600); //inicia comunicacion serial
 lcd.begin(16,2);
 Serial.println (temperatura);
 
 pinMode(12,OUTPUT); //Iniciar Motor  (salida)
 pinMode(9,OUTPUT);
 pinMode(buttonPinAbierto, INPUT);
 pinMode(buttonPinCerrado, INPUT);  
}
 
void loop(){
  
  //Calcula la temperatura usando como referencia 5v
  temperatura = (5.0 * analogRead(0)*100.0)/1023.0;
  
  Serial.println (temperatura); //escribe la temperatura en el serial
  delay (3000);//espera 3 segundos para la siguiente medicion

  //Lee los estados de los finales de carrera:
  buttonStateAbierto=digitalRead(buttonStateAbierto);
  buttonStateCerrado=digitalRead(buttonStateCerrado);
  
  //esto enciende y apaga el motor que abre y cierra la cubierta
   if ((temperatura > 26)&&(buttonStateAbierto==HIGH)){//cambiar la temperatura a conveniencia. Comprobar si cuando el final de carrera esta pulsado se encuentra HIGH o LOW
     digitalWrite(12,HIGH); //Dirección Motor 
     digitalWrite(9, LOW); //Soltar Freno 
     analogWrite(3,255); //Giro Motor al max.

     delay (5000); // Cambiar en función del tiempo que tarde en desplazarse completamente la parte móvil de la cubierta
     digitalWrite(9, HIGH); //Poner Freno
  }

    //esto enciende y apaga el motor que abre y cierra la cubierta
  if ((temperatura <= 22)&&(buttonStateCerrado==HIGH)){//cambiar numero en funcion de lo que se desee
     digitalWrite(12,LOW); //Dirección Motor 
     digitalWrite(9, LOW); //Soltar Freno 
     analogWrite(3,255); //Giro Motor al max.

     delay (5000); // Cambiar en función del tiempo que tarde en desplazarse completamente la parte móvil de la cubierta
     digitalWrite(9, HIGH); //Poner Freno
  }
  }

  //Quizás con un sólo final de carrera es suficiente. El otro sentido podemos controlarlo por tiempo (delay)

Normas del foro