No detecta final de carrera.

Hola!

Llevo bastante tiempo dándole vueltas a un código y al final he decidido ponerlo aquí.

He creado un pequeño programa que controla el movimiento de dos motores. El caso está en que cuando entra en el estado número 2 el motor comienza a girar (uso un puente H) pero no para.

El caso es que el código si que detecta la variable estado_interruptor porque tengo conectado un display lcd y me muestra el valor correcto, 1.

Es como si entrara en la sentencia else y no pasara de ahí.

¿Alguien puede darme una sugerencia?

Muchisimas gracias por adelantado.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

int led = 13;

int en2 = 9;
int in3 = 6;
int in4 = 5;

int en1 = 10;
int in1 = 8;
int in2 = 7;

int estado = 1;
int modo = 2;


int FCZmax = 12;
int FCZmax_estado = 0;

bool estado_interruptor = 0;


void setup() {
  Serial.begin(9600);

  pinMode(en1, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);

  pinMode(en2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  pinMode(FCZmax, INPUT);

  pinMode(led, OUTPUT);
  
  lcd.begin(16,2);
  
  lcd.backlight(); // finish with backlight on  

  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("Microcontroladores.");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("Seleccione modo.");
  delay(1000);
  lcd.setCursor(0,0);
  lcd.print("Seleccione modo.");
  
}

void loop() 
{
  int valor_altura = analogRead(A0);
  int valor_giro = analogRead(A1);

  Serial.println(valor_altura);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Estado: ");
  lcd.print(estado);
  lcd.setCursor(0,1);
  lcd.print(valor_altura);
  lcd.setCursor(4,1);
  lcd.print(valor_giro);
  lcd.print(" Int.");
  lcd.print(estado_interruptor);
  delay(100);
  lcd.clear();

  FCZmax_estado = digitalRead(FCZmax);

  if (FCZmax_estado == HIGH)
  {
    estado_interruptor = 1;
    digitalWrite(led, HIGH);
  }

  if (modo == 2)
  {
    if (estado == 1)
    {
      Serial.println("Estado 1");
      // Regulo altura
      digitalWrite(en1, HIGH);
      
      if (valor_giro < 380)
      {
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
      }
      else if (valor_giro > 380)
      {
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
      }
      else if (378 < valor_giro < 388)
      {
        estado = 2;
        digitalWrite(en1, LOW);
        delay(1500);
      }

    if (estado == 2)
    {
      Serial.println("Estado 2");

      if (estado_interruptor == 1)
      {
        Serial.println("cambiodeestado");
        estado == 3;
        digitalWrite(en2, LOW);
        delay(1500);
      }
      else
      {
        Serial.println("Subiendo");
        digitalWrite(en2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW); 
        break;
      }
    }
      
    while (estado == 3)
    {

      Serial.println("Estado 3");
      // Altura = 574

      // Valorfinal - 250

      if (valor_altura < 550)
      {
        digitalWrite(en2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
      }

      else if ( valor_altura > 550)
      {
        digitalWrite(en2, LOW);
      }    
    }

  }
}
}

He cambiado algo el código pero sigue igual. Entra en el apartado donde marca por el puerto serie “subiendo” y no hace nada cuando se activa el final de carrera.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

int led = 13;

int en2 = 9;
int in3 = 6;
int in4 = 5;

int en1 = 10;
int in1 = 8;
int in2 = 7;

int estado = 1;
int modo = 2;

int estadoA = 0;
int estadoB = 0;

int FCZmax = 12;
int FCZmax_estado = 0;

bool estado_interruptor = 0;


void setup() {
  Serial.begin(9600);

  pinMode(en1, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);

  pinMode(en2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  pinMode(FCZmax, INPUT);

  pinMode(led, OUTPUT);
  
  lcd.begin(16,2);
  
  lcd.backlight(); // finish with backlight on  

  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("Microcontroladores.");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("Seleccione modo.");
  delay(1000);
  lcd.setCursor(0,0);
  lcd.print("Seleccione modo.");
  
}

void loop() 
{
  int valor_altura = analogRead(A0);
  int valor_giro = analogRead(A1);

  Serial.println(valor_altura);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Estado: ");
  lcd.print(estado);
  lcd.setCursor(0,1);
  lcd.print(valor_altura);
  lcd.setCursor(4,1);
  lcd.print(valor_giro);
  lcd.print(" Int.");
  lcd.print(estado_interruptor);
  delay(100);
  lcd.clear();

  FCZmax_estado = digitalRead(FCZmax);

  if (FCZmax_estado == HIGH)
  {
    estado_interruptor = 1;
  }

  if (modo == 2)
  {
    if (estado == 1)
    {
      Serial.println("Estado 1");
      // Regulo altura
      digitalWrite(en1, HIGH);
      
      if (valor_giro < 380)
      {
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
      }
      else if (valor_giro > 380)
      {
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
      }
      else if (378 < valor_giro < 388)
      {
        estado = 2;
        digitalWrite(en1, LOW);
        delay(1500);
      }

    if (estado == 2)
    {
      Serial.println("Estado 2");

      if (digitalRead(FCZmax))
      {
        Serial.println("cambiodeestado");
        estado = 3;
        digitalWrite(en2, LOW);
        delay(1500);
      }
      else
      {
        Serial.println("Subiendo");
        digitalWrite(en2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW); 
      }
    }
      
    if (estado == 3)
    {

      Serial.println("Estado 3");
      // Altura = 574

      // Valorfinal - 250

      if (valor_altura < 550)
      {
        digitalWrite(en2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
      }

      else if ( valor_altura > 550)
      {
        digitalWrite(en2, LOW);
      }    
    }

  }
}
}

Pero en todo caso esto es un problema de hardware no un proyecto.
Haras un proyecto alrededor de un final de carrera no detectado?

Bien, mira esto

 if (FCZmax_estado == HIGH)
  {
    estado_interruptor = 1;
  }

tu detectas el estado HIGH y asignas 1 a estado_interruptor y??? que pasa cuando el interruptor vuelve a 0.
Nunca jamás lo vuelves a 0.
Conclusión debes corregirlo

 if (FCZmax_estado == HIGH)
  {
    estado_interruptor = 1;
  }
else 
   estado_interruptor = 0;