miércoles, 8 de enero de 2025

Ascensor de tres pisos controlado con Arduino

Este ascensor está movido mediante un tambor que enrolla y desenrolla la cuerda que mueve la cabina arriba y abajo. Este tambor gira movido por un par de engranajes, en donde el piñón es accionado por un motor paso a paso 28BYJ-48. La cabina del ascensor va guiada en dos varillas de aluminio de 4 milímetros de diámetro y 423 milímetros de largo. Las piezas para imprimir en 3D se pueden encontrar en Thingiverse. En cada piso se encuentran un pulsador para llamar al ascensor y el final de carrera que detecta su llegada.

El piñón de 10 dientes que mueve el mecanismo va encajado al extremo del eje del motor paso a paso. La corona dentada de 70 dientes lleva en su interior dos rodamientos de bolas 684ZZ, separados por un pequeño tubo de plástico. La polea que soporta la cuerda en el soporte superior también dispone de dos rodamientos de bolas 684ZZ. Sobre el tambor unido a la corona dentada se sujeta la cuerda y se enrollan tres o cuatro vueltas por cada uno de los extremos en diferente sentido. 

El driver del motor paso a paso, que utiliza un integrado ULN 2003 está conectado a los pines 8 (IN1), 9 (IN2), 10 (IN3) y 11 (IN4) de Arduino.

Los finales de carrera que detectan la llegada de la cabina a los distintos pisos están conectados a los pines 5 (Planta baja), 6 (Primer piso) y 7 (Segundo piso). Los pulsadores utilizados para solicitar el ascensor en los distintos pisos están conectados a los pines 1 (Planta baja), 2 (Primer piso) y 4 (Segundo piso).

Aquí se puede ver la estructura del ascensor casi completa. 



Polea colocada en el soporte superior.


Final de carrera de la planta baja.

Placa de soporte de la placa Arduino.






Los finales de carrera son conmutadores con tres terminales, COM, NO y NC. COM está conectado a 5 voltios y NO al pin de Arduino que se ha de activar y a GND a través de una resistencia de 10 K. 



Los pulsadores de los distintos pisos también están conectados por un punto a 5 voltios y por el otro al pin de Arduino que se ha de activar y a GND a través de una resistencia de 10 K.


En este corte de la corona dentada se puede ver el alojamiento de los dos rodamientos de bolas 684ZZ que llevan entre ambos el tubo espaciador.

En este corte de la polea se pueden ver los alojamientos de los rodamientos de bolas 684ZZ.






Programación

Primer programa para probar el funcionamiento del motor

El valor de la velocidad myStepper.setSpeed(1) se puede variar entre 1 y 10, por encima de este valor no se gana en velocidad e incluso por encima de 15 se bloquea el motor.

//Incluye la librería de Arduino Stepper
#include <Stepper.h>
// Se define el número de pasos por vuelta
const int stepsPerRevolution = 2038;
// Se crea un objeto de la clase stepper llamado myStepper
// Se introducen los pines conectados a IN1-IN3-IN2-IN4 y el número de pasos a girar, definido por la variable stepsPerRevolution
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);
void setup() {
    // Utilizando la librería Stepper no es necesario configurar los pines 8, 9, 10 y 11 como OUTPUT
}
void loop() {
  // Giro lento de una vuelta en el sentido de las agujas del reloj a una velocidad de 5 RPM
  myStepper.setSpeed(1);
  myStepper.step(stepsPerRevolution);
  delay(1000);
  // Giro rápido de una vuelta en sentido contrario al de las agujas del reloj a una velocidad de 10 RPM
  myStepper.setSpeed(10);
  myStepper.step(-stepsPerRevolution);
  delay(1000);
}

Mover arriba y abajo

En este programa cuando apretemos el pulsador de la Planta Baja subirá la cabina y cuando apretemos el pulsador del Primero bajará.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

void setup() {
myStepper.setSpeed(10);
}

void loop() {
if (digitalRead(1) == HIGH) {
      myStepper.step(1);
  }
  if (digitalRead(2) == HIGH) {
      myStepper.step(-1);
  }
}

Programa para el ascensor de dos plantas

Ahora cuando apretemos el pulsador de la Planta Baja bajará la cabina y cuando apretemos el pulsador del Primero subirá. Dejará de subir cuando la cabina haya presionado el final de carrera del Primer piso y dejará de bajar cuando esta haya presionado el final de carrera de la Planta Baja.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

void setup() {
myStepper.setSpeed(10);
}

void loop() {
  //Para subir
if ((digitalRead(2) == HIGH) & (digitalRead(6) == LOW)) {
      myStepper.step(-1);
  }
  //Para bajar
if ((digitalRead(1) == HIGH) & (digitalRead(5) == LOW)) {
      myStepper.step(1);
  }
}

Para no tener que mantener apretado el pulsador

Con este programa podemos presionar el pulsador y soltarlo y el motor seguirá en marcha hasta llegar al punto deseado, arriba o abajo. Tiene un problema solo se puede utilizar una vez, después de subir o bajar la primera vez el motor se bloquea. Para poder seguir utilizándolo se ha de reiniciar Arduino para llevar a la situación de inicio las variables booleanas.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);
boolean PB = false;
boolean Primero = false;

void setup() {
myStepper.setSpeed(10);
}

void loop() {
  if (digitalRead(1) == HIGH) {
     PB = true;
  }
  if (digitalRead(2) == HIGH) {
     Primero = true;
  }
//Para subir
if ((Primero == true) & (digitalRead(6) == LOW)) {
      myStepper.step(-1);
  }
//Para bajar
if ((PB == true) & (digitalRead(5) == LOW)) {
      myStepper.step(1);
  }
}

Resolviendo el problema del programa anterior

En este programa al presionar el final de carrera correspondiente vuelve a valor false la variable de piso correspondiente. De todas formas, si la cabina se encuentra en una posición intermedia, al apretar el otro pulsador el motor se bloquea.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);
boolean PB = false;
boolean Primero = false;

void setup() {
myStepper.setSpeed(10);
}

void loop() {
  if (digitalRead(1) == HIGH) {
     PB = true;
  }
  if (digitalRead(2) == HIGH) {
     Primero = true;
  }
  if (digitalRead(5) == HIGH) {
     PB = false;
  }
  if (digitalRead(6) == HIGH) {
     Primero = false;
  }
//Para subir
if ((Primero == true) & (digitalRead(6) == LOW)) {
      myStepper.step(-1);
  }
//Para bajar
if ((PB == true) & (digitalRead(5) == LOW)) {
      myStepper.step(1);
  }
}  

Evitando el bloqueo del motor

En este programa solamente se puede cambiar el estado de la variable booleana con el pulsador si además el final de carrera correspondiente está presionado. Tendrá efecto apretar el pulsador de la Planta baja si está presionado el final de carrera del primer piso. Por el contrario, tendrá efecto apretar el pulsador del Primer piso si está presionado el final de carrera de la Planta baja. Si la cabina del ascensor queda en una posición intermedia entre la Planta baja y el Primer piso al poner en marcha el programa no subirá ni bajará, aunque se apriete uno u otro pulsador. Presionando a mano el final de carrera correspondiente podremos salvar este inconveniente, y hecho esto, después ya funcionará arriba y abajo correctamente. Para solucionar este último problema se habría de introducir en el programa un elemento de puesta a cero del ascensor.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);
boolean PB = false;
boolean Primero = false;

void setup() {
myStepper.setSpeed(10);
}

void loop() {
  if ((digitalRead(1) == HIGH)&(digitalRead(6) == HIGH)) {
     PB = true;
  }
  if ((digitalRead(2) == HIGH)&(digitalRead(5) == HIGH)) {
     Primero = true;
  }
  if (digitalRead(5) == HIGH) {
     PB = false;
  }
  if (digitalRead(6) == HIGH) {
     Primero = false;
  }
//Para subir
if ((Primero == true) & (digitalRead(6) == LOW)) {
      myStepper.step(-1);
  }
//Para bajar
if ((PB == true) & (digitalRead(5) == LOW)) {
      myStepper.step(1);
  }
}  

Simplificación del programa anterior

En realidad en el programa anterior se pueden eliminar las dobles condicionales que ponen en marcha el motor paso a paso, convirtiéndolas en condicionales simples, ya que ello era una redundancia, puesto que al presionar la cabina el final de carrera correspondiente se pasaba la variable booleana a valor false.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);
boolean PB = false;
boolean Primero = false;

void setup() {
myStepper.setSpeed(10);
}

void loop() {
  if ((digitalRead(1) == HIGH)&(digitalRead(6) == HIGH)) {
     PB = true;
  }
  if ((digitalRead(2) == HIGH)&(digitalRead(5) == HIGH)) {
     Primero = true;
  }
  if (digitalRead(5) == HIGH) {
     PB = false;
  }
  if (digitalRead(6) == HIGH) {
     Primero = false;
  }
//Para subir
if (Primero == true) {
      myStepper.step(-1);
  }
//Para bajar
if (PB == true) {
      myStepper.step(1);
  }
}  

Programa con puesta a cero

Este código que consigue llevar al inicio de la operación la cabina hasta la Planta Baja está formado por las dos primeras estructuras condicionales incluidas dentro del void loop. En el listado del programa se puede ver esta parte resaltada. El primer condicional utiliza el valor true de la variable booleana Control. Mientras el final de carrera de la Planta baja no este presionado la cabina continuará bajando al ponerse en marcha el motor paso a paso. Una vez presionado el final de carrera de la Planta Baja, en el segundo condicional se pasa el valor de Control a false, para de esta forma desactivar el primer condicional.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);
boolean PB = false;
boolean Primero = false;
boolean Control = true;

void setup() {
myStepper.setSpeed(10);
}

void loop() {
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  if ((digitalRead(1) == HIGH)&(digitalRead(6) == HIGH)) {
     PB = true;
  }
  if ((digitalRead(2) == HIGH)&(digitalRead(5) == HIGH)) {
     Primero = true;
  }
  if (digitalRead(5) == HIGH) {
     PB = false;
  }
  if (digitalRead(6) == HIGH) {
     Primero = false;
  }
//Para subir
if (Primero == true) {
      myStepper.step(-1);
  }
//Para bajar
if (PB == true) {
      myStepper.step(1);
  }
}  

Programa para las tres plantas

Se ha creado otra variable booleana para el Segundo piso y una variable entera para el valor que los finales de carrera van asignando.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);
boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if (digitalRead(5) == HIGH) {
     PB = false;
     Piso = 0;
  }
  //Primer piso
  if (digitalRead(6) == HIGH) {
     Primero = false;
     Piso = 1;
  }
  //Segundo piso
  if (digitalRead(7) == HIGH) {
     Segundo = false;
     Piso = 2;
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
  }
}  

A continuación se puede ver el mismo programa con los cambios resaltados en letra más grande y negrita.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);
boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if (digitalRead(5) == HIGH) {
     PB = false;
     Piso = 0;
  }
  //Primer piso
  if (digitalRead(6) == HIGH) {
     Primero = false;
     Piso = 1;
  }
  //Segundo piso
  if (digitalRead(7) == HIGH) {
     Segundo = false;
     Piso = 2;
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
  }
}  

Utilización del display de 8X8

El siguiente código está copiado de ArduinoBlocks. La línea de código ledmatrix_1.setType(0); daba un mensaje de error en el IDE de Arduino y la he pasado a comentario y las dos siguientes también, ya que no se necesitan para el resultado de este programa. Al volver a cargar un programa, bien sea desde ArduinoBlocks o desde el IDE de Arduino, si el display ha quedado encendido algunas veces no permite la nueva carga, por lo que hay que retirar alguno de los cables del puerto i2C o de la alimentación del display para conseguir cargar el nuevo programa.

 

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>

Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

void setup()
{

  ledmatrix_1.begin(0x70);
  //ledmatrix_1.setType(0);
  //ledmatrix_1.setTextWrap(false);
  //ledmatrix_1.setTextSize(1);
  ledmatrix_1.setRotation(2); 
 
  ledmatrix_1.drawRect(0,0,7,7,LED_ON);
  ledmatrix_1.drawRect(0,0,6,6,LED_ON);
  ledmatrix_1.writeDisplay();
  delay(5000);
}


void loop()
{

    ledmatrix_1.clear();
    ledmatrix_1.writeDisplay();

}

El resultado de este programa es el que se muestra a continuación.

Vamos a introducir algo gráfico en el programa final del ascensor

Para empezar el display mostrará una flecha hacia arriba mientras el ascensor esté subiendo.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>
Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);

ledmatrix_1.begin(0x70);
ledmatrix_1.setRotation(2);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if (digitalRead(5) == HIGH) {
     PB = false;
     Piso = 0;
  }
  //Primer piso
  if (digitalRead(6) == HIGH) {
     Primero = false;
     Piso = 1;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Segundo piso
  if (digitalRead(7) == HIGH) {
     Segundo = false;
     Piso = 2;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
  }
}

El siguiente programa es idéntico pero muestra los cambios resaltados.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>
Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);

ledmatrix_1.begin(0x70);
ledmatrix_1.setRotation(2);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if (digitalRead(5) == HIGH) {
     PB = false;
     Piso = 0;
  }
  //Primer piso
  if (digitalRead(6) == HIGH) {
     Primero = false;
     Piso = 1;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Segundo piso
  if (digitalRead(7) == HIGH) {
     Segundo = false;
     Piso = 2;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
  }
}

Añadimos la flecha hacia abajo

Ahora añadimos el código que muestra una flecha indicando hacia abajo cuando la cabina del ascensor baja.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>
Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);

ledmatrix_1.begin(0x70);
ledmatrix_1.setRotation(2);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if (digitalRead(5) == HIGH) {
     PB = false;
     Piso = 0;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Primer piso
  if (digitalRead(6) == HIGH) {
     Primero = false;
     Piso = 1;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Segundo piso
  if (digitalRead(7) == HIGH) {
     Segundo = false;
     Piso = 2;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
}

A continuación se muestra el mismo programa con los cambios resaltados.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>
Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);

ledmatrix_1.begin(0x70);
ledmatrix_1.setRotation(2);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if (digitalRead(5) == HIGH) {
     PB = false;
     Piso = 0;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Primer piso
  if (digitalRead(6) == HIGH) {
     Primero = false;
     Piso = 1;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Segundo piso
  if (digitalRead(7) == HIGH) {
     Segundo = false;
     Piso = 2;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
}

Suavizando el paso por el segundo piso

Con este pequeño código añadido se suaviza el paso por el Primer piso cuando va desde la Planta baja hacia el Segundo piso o viceversa. De esta forma se impide que se borre el display, cosa que también se nota en el funcionamiento del motor. Lo mismo se consigue a la salida del Segundo y de la Planta baja, mientras aun están presionados sus correspondientes finales de carrera.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>
Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);

ledmatrix_1.begin(0x70);
ledmatrix_1.setRotation(2);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if ((digitalRead(5) == HIGH) & (PB == true)) {
     PB = false;
     Piso = 0;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Primer piso
  if ((digitalRead(6) == HIGH) & (Primero == true)) {
     Primero = false;
     Piso = 1;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Segundo piso
  if (digitalRead(7) == HIGH & (Segundo == true)) {
     Segundo = false;
     Piso = 2;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
}

A continuación se muestra el mismo programa con los cambios resaltados.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>
Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);

ledmatrix_1.begin(0x70);
ledmatrix_1.setRotation(2);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if ((digitalRead(5) == HIGH) & (PB == true)) {
     PB = false;
     Piso = 0;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Primer piso
  if ((digitalRead(6) == HIGH) & (Primero == true)) {
     Primero = false;
     Piso = 1;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Segundo piso
  if (digitalRead(7) == HIGH & (Segundo == true)) {
     Segundo = false;
     Piso = 2;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
}

Añadiendo los números de piso

En este momento añadimos el código para que se visualicen los números del piso en cuanto la cabina llega a él.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>
Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);

ledmatrix_1.begin(0x70);
ledmatrix_1.setRotation(2);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if ((digitalRead(5) == HIGH) & (PB == true)) {
     PB = false;
     Piso = 0;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
     ledmatrix_1.drawLine(0,0,6,0,LED_ON);
     ledmatrix_1.drawLine(0,1,1,2,LED_ON);
     ledmatrix_1.drawPixel(2,2,LED_ON);
     ledmatrix_1.drawPixel(3,1,LED_ON);
     ledmatrix_1.drawLine(0,4,6,4,LED_ON);
     ledmatrix_1.drawPixel(0,5,LED_ON);
     ledmatrix_1.drawLine(0,6,1,7,LED_ON);
     ledmatrix_1.drawLine(2,7,3,6,LED_ON);
     ledmatrix_1.drawPixel(3,5,LED_ON);
     ledmatrix_1.drawLine(4,7,5,7,LED_ON);
     ledmatrix_1.drawLine(6,5,6,6,LED_ON);
     ledmatrix_1.writeDisplay();
  }
  //Primer piso
  if ((digitalRead(6) == HIGH) & (Primero == true)) {
     Primero = false;
     Piso = 1;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
     ledmatrix_1.drawLine(0,3,6,3,LED_ON);
     ledmatrix_1.drawLine(1,2,2,1,LED_ON);
     ledmatrix_1.drawPixel(6,2,LED_ON);
     ledmatrix_1.writeDisplay();
  }
  //Segundo piso
  if (digitalRead(7) == HIGH & (Segundo == true)) {
     Segundo = false;
     Piso = 2;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
     ledmatrix_1.drawLine(6,2,6,6,LED_ON);
     ledmatrix_1.drawLine(5,3,2,6,LED_ON);
     ledmatrix_1.drawLine(1,6,0,5,LED_ON);
     ledmatrix_1.drawPixel(0,4,LED_ON);
     ledmatrix_1.drawLine(0,3,1,2,LED_ON);
     ledmatrix_1.drawPixel(2,2,LED_ON);
     ledmatrix_1.writeDisplay();
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
}

A continuación se muestra el mismo programa con los cambios resaltados.

#include <Stepper.h>
Stepper myStepper = Stepper(2038, 8, 10, 9, 11);

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>
Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();

boolean PB = false;
boolean Primero = false;
boolean Segundo = false;
boolean Control = true;
int Piso = 0;

void setup() {
myStepper.setSpeed(10);

ledmatrix_1.begin(0x70);
ledmatrix_1.setRotation(2);
}

void loop() {
  //Puesta a cero al poner en marcha el ascensor
  if (Control==true) {
    if(digitalRead(5) == LOW){
      myStepper.step(1);
    }
  if(digitalRead(5) == HIGH){
     Control = false;
    }
  }
  //Activación de pulsadores
  //Activación del pulsador de la Planta Baja
  if ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {
     PB = true;
     ledmatrix_1.clear();
   ledmatrix_1.writeDisplay();
  }
  //Activación del pulsador del Primer piso
  if ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {
     Primero = true;
     ledmatrix_1.clear();
   ledmatrix_1.writeDisplay();
  }
  //Activación del pulsador del Segundo piso
  if ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {
     Segundo = true;
     ledmatrix_1.clear();
   ledmatrix_1.writeDisplay();
  }
  //Desactivado de los pulsadores y asignación del valor de piso
  //Planta baja
  if ((digitalRead(5) == HIGH) & (PB == true)) {
     PB = false;
     Piso = 0;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
     ledmatrix_1.drawLine(0,0,6,0,LED_ON);
   ledmatrix_1.drawLine(0,1,1,2,LED_ON);
   ledmatrix_1.drawPixel(2,2,LED_ON);
   ledmatrix_1.drawPixel(3,1,LED_ON);
   ledmatrix_1.drawLine(0,4,6,4,LED_ON);
   ledmatrix_1.drawPixel(0,5,LED_ON);
   ledmatrix_1.drawLine(0,6,1,7,LED_ON);
   ledmatrix_1.drawLine(2,7,3,6,LED_ON);
   ledmatrix_1.drawPixel(3,5,LED_ON);
   ledmatrix_1.drawLine(4,7,5,7,LED_ON);
   ledmatrix_1.drawLine(6,5,6,6,LED_ON);
   ledmatrix_1.writeDisplay();
  }
  //Primer piso
  if ((digitalRead(6) == HIGH) & (Primero == true)) {
     Primero = false;
     Piso = 1;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
     ledmatrix_1.drawLine(0,3,6,3,LED_ON);
   ledmatrix_1.drawLine(1,2,2,1,LED_ON);
   ledmatrix_1.drawPixel(6,2,LED_ON);
   ledmatrix_1.writeDisplay();
  }
  //Segundo piso
  if (digitalRead(7) == HIGH & (Segundo == true)) {
     Segundo = false;
     Piso = 2;
     ledmatrix_1.clear();
     ledmatrix_1.writeDisplay();
     ledmatrix_1.drawLine(6,2,6,6,LED_ON);
   ledmatrix_1.drawLine(5,3,2,6,LED_ON);
   ledmatrix_1.drawLine(1,6,0,5,LED_ON);
   ledmatrix_1.drawPixel(0,4,LED_ON);
   ledmatrix_1.drawLine(0,3,1,2,LED_ON);
   ledmatrix_1.drawPixel(2,2,LED_ON);
   ledmatrix_1.writeDisplay();
  }

//Subir la cabina
//Con destino al Segundo piso
if (Segundo == true) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde la Planta baja al Primer piso
if ((Primero == true) & (Piso == 0)) {
      myStepper.step(-1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(0,2,2,0,LED_ON);
      ledmatrix_1.drawLine(0,4,2,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Bajar la cabina
//Con destino a la Planta baja
if (PB == true) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
//Desde el Segundo piso al Primer piso
if ((Primero == true) & (Piso == 2)) {
      myStepper.step(1);
      ledmatrix_1.drawLine(0,3,7,3,LED_ON);
      ledmatrix_1.drawLine(3,0,5,2,LED_ON);
      ledmatrix_1.drawLine(5,4,3,6,LED_ON);
      ledmatrix_1.writeDisplay();
  }
}

Generación de los gráficos del display

El código utilizado en el display permite encender y apagar todos sus LEDs, individualmente (ledmatrix_1.drawPixel(3,5,LED_ON);), en líneas rectas (ledmatrix_1.drawLine(3,0,5,2,LED_ON);) o formando texto. También hay un comando que permite borrar todo el display (ledmatrix_1.clear();). Después del borrado o la escritura se introducir la línea de código ledmatrix_1.writeDisplay();. Este componente se conecta a Arduino mediante un bus i2C, cuya dirección se puede configurar mediante tres mini interruptores. La posición que se muestra en la fotografía con los tres interruptores en OFF consigue la dirección (0x70) que se utiliza en los programas.

Para realizar los gráficos se han de tener en cuenta las coordenadas de los píxeles. El Led de la esquina superior izquierda es el 7, 0. Si bajamos una fila, el primero de la izquierda es el 0, 0. En la esquina inferior derecha está el led 6, 7. En la esquina inferior izquierda el 6, 0. En la esquina superior derecha el 7, 7. 



La flecha hacia abajo se corresponde con el código:

ledmatrix_1.drawLine(0,3,7,3,LED_ON);
ledmatrix_1.drawLine(3,0,5,2,LED_ON);
ledmatrix_1.drawLine(5,4,3,6,LED_ON);
ledmatrix_1.writeDisplay();


El número 2 se corresponde con el código:

ledmatrix_1.drawLine(6,2,6,6,LED_ON);
ledmatrix_1.drawLine(5,3,2,6,LED_ON);
ledmatrix_1.drawLine(1,6,0,5,LED_ON);
ledmatrix_1.drawPixel(0,4,LED_ON);
ledmatrix_1.drawLine(0,3,1,2,LED_ON);
ledmatrix_1.drawPixel(2,2,LED_ON);
ledmatrix_1.writeDisplay();


El número 1 se corresponde con el código:

ledmatrix_1.drawLine(0,3,6,3,LED_ON);
ledmatrix_1.drawLine(1,2,2,1,LED_ON);
ledmatrix_1.drawPixel(6,2,LED_ON);
ledmatrix_1.writeDisplay();


La flecha hacia arriba se corresponde con el código:

ledmatrix_1.drawLine(0,3,7,3,LED_ON);
ledmatrix_1.drawLine(0,2,2,0,LED_ON);
ledmatrix_1.drawLine(0,4,2,6,LED_ON);
ledmatrix_1.writeDisplay();

Las siglas PB se corresponden con el código:

ledmatrix_1.drawLine(0,0,6,0,LED_ON);
ledmatrix_1.drawLine(0,1,1,2,LED_ON);
ledmatrix_1.drawPixel(2,2,LED_ON);
ledmatrix_1.drawPixel(3,1,LED_ON);
ledmatrix_1.drawLine(0,4,6,4,LED_ON);
ledmatrix_1.drawPixel(0,5,LED_ON);
ledmatrix_1.drawLine(0,6,1,7,LED_ON);
ledmatrix_1.drawLine(2,7,3,6,LED_ON);
ledmatrix_1.drawPixel(3,5,LED_ON);
ledmatrix_1.drawLine(4,7,5,7,LED_ON);
ledmatrix_1.drawLine(6,5,6,6,LED_ON);
ledmatrix_1.writeDisplay();

Programas realizados con Arduino Blocks

Mover arriba y abajo

En este programa cuando apretemos el pulsador de la Planta Baja bajará la cabina y cuando apretemos el pulsador del Primero subirá.

Programa para el ascensor de dos plantas

Ahora cuando apretemos el pulsador de la Planta Baja bajará la cabina y cuando apretemos el pulsador del Primero subirá. Dejará de subir cuando la cabina haya presionado el final de carrera del Primer piso y dejará de bajar cuando esta haya presionado el final de carrera de la Planta Baja.

Para no tener que mantener apretado el pulsador

Con este programa podemos presionar el pulsador y soltarlo y el motor seguirá en marcha hasta llegar al punto deseado, arriba o abajo. Tiene un problema solo se puede utilizar una vez, después de subir o bajar la primera vez el motor se bloquea. Para poder seguir utilizándolo se ha de reiniciar Arduino para llevar a la situación de inicio las variables booleanas.

Resolviendo el problema del programa anterior

En este programa al presionar el final de carrera correspondiente vuelve a valor false la variable de piso correspondiente. De todas formas, si la cabina se encuentra en una posición intermedia, al apretar el otro pulsador el motor se bloquea.

Evitando el bloqueo del motor

En este programa solamente se puede cambiar el estado de la variable booleana con el pulsador si además el final de carrera correspondiente está presionado. Tendrá efecto apretar el pulsador de la Planta baja si está presionado el final de carrera del primer piso. Por el contrario, tendrá efecto apretar el pulsador del Primer piso si está presionado el final de carrera de la Planta baja. Si la cabina del ascensor queda en una posición intermedia entre la Planta baja y el Primer piso al poner en marcha el programa no subirá ni bajará, aunque se apriete uno u otro pulsador. Presionando a mano el final de carrera correspondiente podremos salvar este inconveniente, y hecho esto, después ya funcionará arriba y abajo correctamente. Para solucionar este último problema se habría de introducir en el programa un elemento de puesta a cero del ascensor.

Simplificación del programa anterior

En realidad en el programa anterior se pueden eliminar las dobles condicionales que ponen en marcha el motor paso a paso, convirtiéndolas en condicionales simples, ya que ello era una redundancia, puesto que al presionar la cabina el final de carrera correspondiente se pasaba la variable booleana a valor false.

Programa con puesta a cero

Este código que consigue llevar al inicio de la operación la cabina hasta la Planta Baja está formado por las dos primeras estructuras condicionales incluidas dentro del void loop. El primer condicional utiliza el valor true de la variable booleana Control. Mientras el final de carrera de la Planta baja no este presionado la cabina continuará bajando al ponerse en marcha el motor paso a paso. Una vez presionado el final de carrera de la Planta Baja, en el segundo condicional se pasa el valor de Control a false, para de esta forma desactivar el primer condicional.


Programa para las tres plantas

Se ha creado otra variable booleana para el Segundo piso y una variable entera para el valor que los finales de carrera van asignando.



Repartiendo el trabajo en subprogramas

El mismo código del programa anterior lo vamos a dividir en subprogramas. Este programa lo podemos encontrar en ArduinoBlocks.





Vamos a introducir algo gráfico en el programa final del ascensor

Para empezar el display mostrará una flecha hacia arriba mientras el ascensor esté subiendo. Los bloques que se crean o se modifican son los siguientes:


Añadimos la flecha hacia abajo

Ahora añadimos el código que muestra una flecha indicando hacia abajo cuando la cabina del ascensor baja. Los bloques que se crean o se modifican son los siguientes:


Suavizando el paso por el segundo piso

Con este pequeño código añadido se suaviza el paso por el Primer piso cuando va desde la Planta baja hacia el Segundo piso o viceversa. De esta forma se impide que se borre el display, cosa que también se nota en el funcionamiento del motor. Lo mismo se consigue a la salida del Segundo y de la Planta baja, mientras aun están presionados sus correspondientes finales de carrera. El bloques que se modifica es el siguiente:

Añadiendo los números de piso

En este momento añadimos el código para que se visualicen los números del piso en cuanto la cabina llega a él. Este programa lo podemos encontrar en ArduinoBlocks.







Inicio con animación

En el programa definitivo que podemos encontrar en ArduinoBlocks se incluye una pequeña animación en la puesta a cero del inicio.

Generación de los gráficos del display con Arduino Blocks

El código utilizado en el display permite encender y apagar todos sus LEDs, individualmente, en líneas rectas, formando texto, o con Bitmap. También hay un comando que permite borrar todo el display. Al presionar con el botón derecho sobre el bloque Bitmap se abre un cuadro de diálogo y usando la opción Ayuda se nos abre el editor de pixeles.


Para realizar los gráficos manualmente se han de tener en cuenta las coordenadas de los píxeles. El Led de la esquina superior izquierda es el 0, 0. Si bajamos una fila, el primero de la izquierda es el 0, 1. En la esquina inferior derecha está el led 7, 7. En la esquina inferior izquierda el 0, 7. En la esquina superior derecha el 7, 7. 










 


No hay comentarios: