Duda acerca de Serial Println (Ascensor)

Buenas, soy medio nuevo por aquí y en el mundo de Arduino. La verdad no sé demasiado y tengo una duda medio estúpida jajaja.
Cuestión que ando haciendo un ascensor para un proyecto del colegio, tengo 4 pulsadores de llamada para ir a “x” piso y también un Sensor Infrarrojo CNY70 que está dentro del ascensor para detectar los diferentes pisos.
Mi problema es que tengo el siguiente código:

//Determinamos los pines.
int PulsadorP1 = 8; // Pulsador de Llamada Piso 1.
int PulsadorP2 = 9; // Pulsador de Llamada Piso 2.
int PulsadorP3 = 10; // Pulsador de Llamada Piso 3.
int PulsadorP4 = 11; // Pulsador de Llamada Piso 4.
int SensorAsc = A0; // Sensor Detector del Ascensor.
int DisplayA = 22; // Display A.
int DisplayB = 23; // Display B.
int DisplayC = 24; // Display C.
int DisplayD = 25; // Display D.
int DisplayE = 26; // Display E.
int DisplayF = 27; // Display F.
int DisplayG = 28; // Display G.
int Motor1 = 7; // Señal Motor.
int Motor2 = 6; // Señal Motor.
int EstadoPulsador1; // Declaramos para void loop.
int EstadoPulsador2; // Declaramos para void loop.
int EstadoPulsador3; // Declaramos para void loop.
int EstadoPulsador4; // Declaramos para void loop.
int EstadoSensor; // Declaramos para void loop.

void setup() {
  pinMode (PulsadorP1, INPUT);
  pinMode (PulsadorP2, INPUT);
  pinMode (PulsadorP3, INPUT);
  pinMode (PulsadorP4, INPUT);
  pinMode (SensorAsc, INPUT);
  pinMode (DisplayA, OUTPUT);
  pinMode (DisplayB, OUTPUT);
  pinMode (DisplayC, OUTPUT);
  pinMode (DisplayD, OUTPUT);
  pinMode (DisplayE, OUTPUT);
  pinMode (DisplayF, OUTPUT);
  pinMode (DisplayG, OUTPUT);
  pinMode (Motor1, OUTPUT);
  pinMode (Motor2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  EstadoPulsador1 = digitalRead(PulsadorP1);
  EstadoPulsador2 = digitalRead(PulsadorP2);
  EstadoPulsador3 = digitalRead(PulsadorP3);
  EstadoPulsador4 = digitalRead(PulsadorP4);
  EstadoSensor = analogRead(SensorAsc);
  Serial.println (EstadoSensor);
  delay (50);

  
/* 
Valores de los Pisos.
Piso 1 : 15 - 30.
Piso 2 : 39 - 55.
Piso 3 : 68 - 90.
Piso 4 : 110 - 155.
*/

// PISO 1, PULSADOR 1.                                                    PISO 1, PULSADOR 1.                                                            PISO 1, PULSADOR1.
// PISO 1, PULSADOR 1.                                                    PISO 1, PULSADOR 1.                                                            PISO 1, PULSADOR1.
// PISO 1, PULSADOR 1.                                                    PISO 1, PULSADOR 1.                                                            PISO 1, PULSADOR1.

if (EstadoPulsador1 == HIGH && EstadoSensor > 15 && EstadoSensor < 30 && EstadoPulsador2 == LOW && EstadoPulsador3 == LOW && EstadoPulsador4 == LOW) {
  digitalWrite (Motor1, LOW);
  digitalWrite (Motor2, LOW); // Se mantiene en el piso el ascensor, sin moverse.
  digitalWrite (DisplayA, HIGH);
  digitalWrite (DisplayB, LOW);
  digitalWrite (DisplayC, LOW);
  digitalWrite (DisplayD, HIGH);
  digitalWrite (DisplayE, HIGH);
  digitalWrite (DisplayF, HIGH);
  digitalWrite (DisplayG, HIGH);
}

// PISO 2, PULSADOR 2.                                                    PISO 2, PULSADOR 2.                                                            PISO 2, PULSADOR 2.
// PISO 2, PULSADOR 2.                                                    PISO 2, PULSADOR 2.                                                            PISO 2, PULSADOR 2.
// PISO 2, PULSADOR 2.                                                    PISO 2, PULSADOR 2.                                                            PISO 2, PULSADOR 2.

// IDEA (Esto se me ocurrió hacer por eso lo marqué como IDEA)

if (EstadoPulsador2 == HIGH && EstadoSensor > 15 && EstadoSensor < 30 && EstadoPulsador1 == LOW && EstadoPulsador3 == LOW && EstadoPulsador4 == LOW) { // Si llamo al Piso 2 y el ascensor se encuentra en el piso 1.
  while (EstadoSensor != (EstadoSensor > 32 && EstadoSensor < 55)) {
    digitalWrite (Motor1, LOW);
    digitalWrite (Motor2, HIGH); // Sube el ascensor.
    digitalWrite (DisplayA, LOW);
    digitalWrite (DisplayB, LOW);
    digitalWrite (DisplayC, HIGH);
    digitalWrite (DisplayD, LOW);
    digitalWrite (DisplayE, LOW);
    digitalWrite (DisplayF, HIGH);
    digitalWrite (DisplayG, LOW); // Marca un 2 en el display.
    Serial.println (EstadoSensor);
}
  digitalWrite (Motor1, LOW);
  digitalWrite (Motor2, LOW);
  digitalWrite (DisplayA, LOW);
  digitalWrite (DisplayB, LOW);
  digitalWrite (DisplayC, HIGH);
  digitalWrite (DisplayD, LOW);
  digitalWrite (DisplayE, LOW);
  digitalWrite (DisplayF, HIGH);
  digitalWrite (DisplayG, LOW);
  Serial.println (EstadoSensor);
}
}

Como dije anteriormente no tengo muchísima idea de esto de Arduino, pero básicamente ando viendo que estoy haciendo mal ahí.
Cuando llamo al piso 1, y el ascensor se encuentra en el piso 1 el motor no se moverá y marcará un 1 en el display. Eso me funciona de 10, pero luego cuando hice para el piso 2 es mi problema, lo que pasa es lo siguiente:
Presiono el pulsador 2 para que suba al piso 2, lo que sucede es que sube y todo, pero no se detiene en dicho piso. Me he fijado por el Monitor Serial y cuando presiono 2 automáticamente se congela y deja de marcar o otra es que marca pero siempre el mismo número y supuestamente tiene que variar, no?.
Quizás hice todo mal la programación ahí donde marque IDEA, si alguien me puede dar una mano desde ya gracias!

Bien, primero te felicito por varias cosas:

  1. Leiste las normas o te diste cuenta como postear viendo otros hilos de cualquier forma aplausos.

  2. Indicaste que se trata de una tarea escolar y no te quedaste con las manos cruzadas e intentaste algo. Aplausos 2 !!

  3. Tu código esta bien comentado y eso es algo que no siempre se ve en el foro.

Ahora analicemos tu código.

He modificado tu código de modo que mas o menos cumpla con lo que esperas.

Hay mucho para mejorar pero no quise apartarme demasiado de tu lógica aunque claro hay algunos cambios que tal vez requiera explicación:
El manejo del display por ejemplo lo he simplificado al igual que cada movimiento del motor Parado, Sube, Baja.

A ver que te parece

//Determinamos los pines.
const byte PulsadorP1  = 8; // Pulsador de Llamada Piso 1.
const byte PulsadorP2  = 9; // Pulsador de Llamada Piso 2.
const byte PulsadorP3  = 10; // Pulsador de Llamada Piso 3.
const byte PulsadorP4  = 11; // Pulsador de Llamada Piso 4.
const byte SensorAsc   = A0; // Sensor Detector del Ascensor.

const byte Motor1      = 7; // Señal Motor.
const byte Motor2      = 6; // Señal Motor.

bool EstadoPulsador1; // Declaramos para void loop.
bool EstadoPulsador1Ant = false;
bool EstadoPulsador2; // Declaramos para void loop.
bool EstadoPulsador2Ant = false;
bool EstadoPulsador3; // Declaramos para void loop.
bool EstadoPulsador3Ant = false;
bool EstadoPulsador4; // Declaramos para void loop.
bool EstadoPulsador4Ant = false;
unsigned int EstadoSensor; // Declaramos para void loop.

// Segmentos de un display 7 Segmentos
// segumentos de a, b, c, d, e, f y g
int segmentos[] = {22, 23, 24, 25, 26, 27, 28};

byte  Digit[10][8] =  {              // Arduino UNO va muy justo de memoria. Por eso lo
                                     // definimos como byte y no como int
  // a b c d e f g                                      
   { 1,1,1,1,1,1,0,0 },    // 0   
   { 0,1,1,0,0,0,0,0 },    // 1
   { 1,1,0,1,1,0,1,0 },    // 2
   { 1,1,1,1,0,0,1,0 },    // 3
   { 0,1,1,0,0,1,1,0 },    // 4
   { 1,0,1,1,0,1,1,0 },    // 5
   { 1,0,1,1,1,1,1,0 },    // 6
   { 1,1,1,0,0,0,0,0 },    // 7
   { 1,1,1,1,1,1,1,0 },    // 8
   { 1,1,1,0,0,1,1,0 }     // 9
};

bool detenido = true;     // true = detenido false = moviéndose
                          // puede resultar confuso pero si esta en 1 esta permitido responder a los 
                          // pulsadores de lo contrario no.
int piso, pisoAnt = 0;

void setup() {

  pinMode (PulsadorP1, INPUT);
  pinMode (PulsadorP2, INPUT);
  pinMode (PulsadorP3, INPUT);
  pinMode (PulsadorP4, INPUT);

  for (int i = 0; i<7; i++)           // defino cada segmento del vector como salida
       pinMode(segmentos[i], OUTPUT);

  pinMode (Motor1, OUTPUT);
  pinMode (Motor2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  EstadoPulsador1 = digitalRead(PulsadorP1);
  EstadoPulsador2 = digitalRead(PulsadorP2);
  EstadoPulsador3 = digitalRead(PulsadorP3);
  EstadoPulsador4 = digitalRead(PulsadorP4);
  EstadoSensor    = analogRead(SensorAsc);
  Serial.println (EstadoSensor);
  delay (50);
  piso = dondeEstoy(EstadoSensor);           // devuelve en que piso esta en función del valor del sensor
  if (piso != pisoAnt)                       // solo muestro cambios si el piso cambia.
      Display(piso);  
  pisoAnt = piso;

  // solo me muevo si el ascensor esta detenido
  if (EstadoPulsador1 && !EstadoPulsador1Ant) {
      if (detenido) {
          if (piso == 1) 
              AscensorParado(); // no hago nada porque estoy en ese piso
          else 
              AscensorBaja();   // si no estoy en piso 1 es porque estoy en pisos superiores y debe bajar
      }
  }
  EstadoPulsador1Ant = EstadoPulsador1;

  if (EstadoPulsador2 && !EstadoPulsador2Ant) {
      if (detenido) {
          if (piso == 2) 
              AscensorParado(); // no hago nada porque estoy en ese piso
          else 
              if (piso > 2)         // Si ascensor esta en pisos 3 o 4 entonces debe bajar
                  AscensorBaja();   
              else 
                  AscensorSube();   // Si ascensor esta en piso 1 debe subir
      }
  }
  EstadoPulsador2Ant = EstadoPulsador2;
  
  if (EstadoPulsador3 && !EstadoPulsador3Ant) {
      if (detenido) {
          if (piso == 3) 
              AscensorParado(); // no hago nada porque estoy en ese piso
          else 
              if (piso > 3) {        // Si ascensor esta en piso 4 entonces debe bajar
                  AscensorBaja();   
              }
              else {
                  AscensorSube();   // Si ascensor esta en piso 1 o 2 debe subir
              }

      }
  }
  EstadoPulsador3Ant = EstadoPulsador3;

  if (EstadoPulsador4 && !EstadoPulsador4Ant) {
      if (detenido) {
          if (piso == 4) 
              AscensorParado(); // no hago nada porque estoy en ese piso
          else 
              AscensorSube();   // Si ascensor esta en piso 1 debe subir
      }
  }
  EstadoPulsador4Ant = EstadoPulsador4;
}

void AscensorParado() {
  digitalWrite (Motor1, LOW);
  digitalWrite (Motor2, LOW); // Se mantiene en el piso el ascensor, sin moverse.
  detenido = true;
}

void AscensorSube() {
  digitalWrite (Motor1, LOW);
  digitalWrite (Motor2, HIGH); // Sube el ascensor.
  detenido = false;
}

void AscensorBaja() {
  digitalWrite (Motor1, HIGH);
  digitalWrite (Motor2, LOW); // Sube el ascensor.
  detenido = false;
}

void Display(int N) {
  for (int i = 0 ; i<7 ; i++) {   
      digitalWrite(segmentos[i],  Digit[N][i]);
  }
}


/* 
    Valores de los Pisos.
    Piso 1 : 15 - 30.
    Piso 2 : 39 - 55.
    Piso 3 : 68 - 90.
    Piso 4 : 110 - 155.
*/
int dondeEstoy(int tmp) {

  if (tmp > 15 && tmp < 30) {
      return 1;
  }
  if (tmp > 39 && tmp < 55) {
      return 2;
  }  
  if (tmp > 68 && tmp < 90) {
      return 3;
  }
  if (tmp > 110 && tmp < 155) {
      return 4;
  }
  else 
      return 0;
}

Gracias por responder! La verdad viendo el código que me pasaste me doy cuenta de lo mucho que me falta por aprender en el mundo de Arduino!. Ahora me fijo bien de que trata cada comando porque a simple vista veo chino mezclado con alemán, muchas gracias la verdad por darte un tiempo! Ojalá poder solucionar mi problema, el caso es que son para 4 pisos así que toca bastante jajaja, mañana te contaré como me fue! Gracias y saludos de Argentina!

Bikeros: Gracias por responder! La verdad viendo el código que me pasaste me doy cuenta de lo mucho que me falta por aprender en el mundo de Arduino!. Ahora me fijo bien de que trata cada comando porque a simple vista veo chino mezclado con alemán, muchas gracias la verdad por darte un tiempo! Ojalá poder solucionar mi problema, el caso es que son para 4 pisos así que toca bastante jajaja, mañana te contaré como me fue! Gracias y saludos de Argentina!

Buenas! Surgieron 2 problemas y 1 pudimos resolver solamente, me olvidé de comentarte que ando usando un Arduino Mega, y que el display es de ánodo común jajaja. Unos de los problemas es que al principio no sabíamos por que no marcaba bien el display y después modifiqué los 0 por los 1, y viceversa y funcionó, primer problema resuelto. Luego surgió otro problema que es el que el ascensor no se detiene, le mandamos la señal para que suba a tal piso y no logra detenerse. Quizás con el pasar de las horas de esta noche se me ocurra la solución.

Gracias y saludos nuevamente!

Bueno te dije que era un primer intento… en el que básicamente mejoraba tu idea pero es perfectible muchas veces.

Bueno el ascensor no se detiene porque no hay un sistema que le diga que lo haga, porque no prestamos atención a eso y yo siempre empiezo respondiendo basado en lo que el que consulta ha entregado.

Ahora debería funcionar mejor.

//Determinamos los pines.
const byte PulsadorP1  = 8; // Pulsador de Llamada Piso 1.
const byte PulsadorP2  = 9; // Pulsador de Llamada Piso 2.
const byte PulsadorP3  = 10; // Pulsador de Llamada Piso 3.
const byte PulsadorP4  = 11; // Pulsador de Llamada Piso 4.
const byte SensorAsc   = A0; // Sensor Detector del Ascensor.

const byte Motor1      = 7; // Señal Motor.
const byte Motor2      = 6; // Señal Motor.

bool EstadoPulsador1; // Declaramos para void loop.
bool EstadoPulsador1Ant = false;
bool EstadoPulsador2; // Declaramos para void loop.
bool EstadoPulsador2Ant = false;
bool EstadoPulsador3; // Declaramos para void loop.
bool EstadoPulsador3Ant = false;
bool EstadoPulsador4; // Declaramos para void loop.
bool EstadoPulsador4Ant = false;
unsigned int EstadoSensor; // Declaramos para void loop.

// Segmentos de un display 7 Segmentos
// segumentos de a, b, c, d, e, f y g
int segmentos[] = {22, 23, 24, 25, 26, 27, 28};

byte  Digit[10][8] =  {              // Arduino UNO va muy justo de memoria. Por eso lo
                                     // definimos como byte y no como int
  // a b c d e f g                                      
   { 1,1,1,1,1,1,0,0 },    // 0   
   { 0,1,1,0,0,0,0,0 },    // 1
   { 1,1,0,1,1,0,1,0 },    // 2
   { 1,1,1,1,0,0,1,0 },    // 3
   { 0,1,1,0,0,1,1,0 },    // 4
   { 1,0,1,1,0,1,1,0 },    // 5
   { 1,0,1,1,1,1,1,0 },    // 6
   { 1,1,1,0,0,0,0,0 },    // 7
   { 1,1,1,1,1,1,1,0 },    // 8
   { 1,1,1,0,0,1,1,0 }     // 9
};

bool detenido = true;     // true = detenido false = moviéndose
                          // puede resultar confuso pero si esta en 1 esta permitido responder a los 
                          // pulsadores de lo contrario no.
int pisoActual, pisoActualAnt = 0, pisoPedido;

void setup() {

  pinMode (PulsadorP1, INPUT);
  pinMode (PulsadorP2, INPUT);
  pinMode (PulsadorP3, INPUT);
  pinMode (PulsadorP4, INPUT);

  for (int i = 0; i<7; i++)           // defino cada segmento del vector como salida
       pinMode(segmentos[i], OUTPUT);

  pinMode (Motor1, OUTPUT);
  pinMode (Motor2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  
  leoSensores();                           // consulto estado de pulsadores y sensor de piso
  pisoActual = dondeEstoy(EstadoSensor);   // devuelve en que pisoActual esta en función del valor del sensor
 
  if (pisoActual != pisoActualAnt)         // solo muestro cambios si el pisoActual cambia.
      Display(pisoActual);  
  pisoActualAnt = pisoActual;
 
  if (detenido) {
      if (pisoActual < pisoPedido)         // si se presionó el mismo piso del ascensor no hago nada
          AscensorSube();                  // no hago nada porque estoy en ese pisoActual
      if (pisoActual > pisoPedido)
          AscensorBaja();                  // si no estoy en pisoActual 1 es porque estoy en pisoActuals superiores y debe bajar
  }
  else {                                   // ascensor moviéndose de modo que me enfoque en cuando debo detenerlo
      if (pisoActual ==  pisoPedido)
          AscensorParado();
  }
}

void leoSensores() {
  
  EstadoPulsador1 = digitalRead(PulsadorP1);
  EstadoPulsador2 = digitalRead(PulsadorP2);
  EstadoPulsador3 = digitalRead(PulsadorP3);
  EstadoPulsador4 = digitalRead(PulsadorP4);
  EstadoSensor    = analogRead(SensorAsc);
  Serial.println (EstadoSensor);
     
  // solo me muevo si el ascensor esta detenido
  if (EstadoPulsador1 && !EstadoPulsador1Ant) {
      pisoPedido = 1;
  }
  EstadoPulsador1Ant = EstadoPulsador1;

  if (EstadoPulsador2 && !EstadoPulsador2Ant) {
      pisoPedido = 2;  
  }
  EstadoPulsador2Ant = EstadoPulsador2;
  
  if (EstadoPulsador3 && !EstadoPulsador3Ant) {
      pisoPedido = 3;
  }
  EstadoPulsador3Ant = EstadoPulsador3;

  if (EstadoPulsador4 && !EstadoPulsador4Ant) {
      pisoPedido = 4;
  }
  EstadoPulsador4Ant = EstadoPulsador4;
  delay (50);
}

void AscensorParado() {
  digitalWrite (Motor1, LOW);
  digitalWrite (Motor2, LOW); // Se mantiene en el pisoActual el ascensor, sin moverse.
  detenido = true;
}

void AscensorSube() {
  digitalWrite (Motor1, LOW);
  digitalWrite (Motor2, HIGH); // Sube el ascensor.
  detenido = false;
}

void AscensorBaja() {
  digitalWrite (Motor1, HIGH);
  digitalWrite (Motor2, LOW); // Sube el ascensor.
  detenido = false;
}

void Display(int N) {
  for (int i = 0 ; i<7 ; i++) {   
      digitalWrite(segmentos[i],  Digit[N][i]);
  }
}

/* 
    Valores de los Pisos.
    Piso 1 : 15 - 30.
    Piso 2 : 39 - 55.
    Piso 3 : 68 - 90.
    Piso 4 : 110 - 155.
*/
int dondeEstoy(int tmp) {
  int piso = 0;

  if (tmp > 15 && tmp < 30) {
      piso = 1;
  }
  if (tmp > 39 && tmp < 55) {
      piso = 2;
  }  
  if (tmp > 68 && tmp < 90) {
      piso = 3;
  }
  if (tmp > 110 && tmp < 155) {
      piso = 4;
  }
  return piso;
}

Muchas gracias por tu respuesta! Estuve experimentando y todo parecía ir bien pero surgieron algunos problemas y dudas acerca de tu código : Cómo bien dije anteriormente soy bastante novato en el tema de Arduino y una duda que quería preguntarte es que quieres conseguir con

EstadoPulsador1Ant = false? (Estuve fijandome por internet y supongo que es false = 0 y true = 1)

Y que significa : unsigned?. La usaste cuando declarabas el estado del sensor!.

Los problemas que surgieron fueron que al intentar volver de un piso superior a uno inferior no surgía nada, no sé si será porque el sensor no detecta bien los valores porque me he fijado y todo marca bien. La opción que se me vino a la cabeza fue intentar interpretar lo mejor posible el código, y de ahí es que surgieron algunas preguntas. Una de las soluciones que se me ocurrió es cambiar los valores de los pisos para ver si mejoraba y nada. Seguiré buscando soluciones, gracias por tu tiempo!

Debo contarte que la verdad me ayudaste un montón, aprendí varias cosas pero todavía sigo siendo todo un inexperto. Y que llevo haciendo este proyecto desde hace más de 1 semana y nuestro profesor nos habrá enseñado unas 2 clases de 10 minutos de Arduino, lo básico y nada casi...

Gracias por tu tiempo de verdad!

Bueno mi amigo hacer un ascensor sin saber programar es una tontería. Asi que mejor busca en la sección Documentación las sugerencias de libros y otro hilo con clases de youtube y presta atención porque te falta conocimiento básico.

Youtube esa lleno de cursos. no pueden en 10 minutos resolver algo asi.

El código puede tener fallas pero no se resuelven cambiando lo que sube por lo que baja, eso es manotazo de ahogado.

Se analiza y se resuelve. Tampoco puedo explicarte que es cada cosa porque con poner en google : Arduino tipo variable unsigned int tienes la respuesta o Arduino tipo variable bool lo mismo.

Una variable bool es una variable que solo toma dos estados, SI/NO, VERDADERO/FALSO, TRUE/FALSE, HIGH/LOW, 1/0 Solo recuerda que el lenguaje C solo admite leyendas en ingles asi que nos quedamos con TRUE/FALSE y HIGH/LOW

unsigned int es entero sin signo. Un entero es un número de 2^16 bits = calculadora mediante numeros enteros de 0 a 65535 ya que la cuenta te dará 65536 pero como en los microcontroladores todocomienza desde 0 ahi tienes el numero que falta.

cuando usas signo o solo int se pierde un bit y se divide por dos la cantidad de numeros positivos y negativos.

Eso es algo que tu profesor debió enseñarte como parte fundamental antes de llegar a microcontroladores o Arduino.

Mas tarde miro el código y veré si tiene algun error.

Tu prueba si tu sensor funciona como crees.