void setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(3,OUTPUT);pinMode(3,OUTPUT);}
void loop(){digitalWrite(5,LOW);digitalWrite(3,LOW);
if(digitalRead(4)==HIGH){digitalWrite(3,HIGH);delay(100);}
if(digitalRead(2)==HIGH){digitalWrite(5,HIGH);delay(100);}
}
void setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(3,OUTPUT);pinMode(3,OUTPUT);}void loop(){if(digitalRead(4)==HIGH){digitalWrite(5,HIGH);delay(100);}if(digitalRead(2)==HIGH){digitalWrite(3,HIGH);delay(100);}if(digitalRead(8)==HIGH){digitalWrite(5,LOW);delay(100);}if(digitalRead(7)==HIGH){digitalWrite(3,LOW);delay(100);}}
void setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(3,OUTPUT);pinMode(3,OUTPUT);}void loop(){if((digitalRead(4)==HIGH)&&(digitalRead(7)==HIGH)){digitalWrite(5,HIGH);delay(100);}if((digitalRead(2)==HIGH)&&(digitalRead(8)==HIGH)){digitalWrite(3,HIGH);delay(100);}if(digitalRead(8)==HIGH){digitalWrite(5,LOW);delay(100);}if(digitalRead(7)==HIGH){digitalWrite(3,LOW);delay(100);}}
int pisoorigen = 0;int pisodestino = 1; //Este valor hace que al iniciar el programa el ascensor baje al primer pisovoid setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(3,OUTPUT);pinMode(3,OUTPUT);}void loop(){if(digitalRead(2)==HIGH){pisodestino = 1;}if(digitalRead(4)==HIGH){pisodestino = 2;}if(digitalRead(6)==HIGH){pisodestino = 3;}if(digitalRead(7)==HIGH){pisoorigen = 1;}if(digitalRead(8)==HIGH){pisoorigen = 2;}if(digitalRead(9)==HIGH){pisoorigen = 3;}if(pisoorigen==pisodestino){digitalWrite(3,LOW);digitalWrite(5,LOW);delay(100);}if(pisoorigen<pisodestino){digitalWrite(3,LOW);digitalWrite(5,HIGH);delay(100);}if(pisoorigen>pisodestino){digitalWrite(3,HIGH);digitalWrite(5,LOW);delay(100);}}
Para poder incorporar las conexiones de un altavoz de 8 Ω y 2 watios (Comprado en Aliexpress por 3,6 euros) y un zócalo para tarjetas de memoria MicroSD se han de modificar algunas de las conexiones en el modelo de ascensor original. Los finales de carrera que detectan la llegada de la cabina a los distintos pisos están conectados a los pines analógicos A0 (Planta baja), A1 (Primer piso) y A2 (Segundo piso). Los pulsadores utilizados para solicitar el ascensor en los distintos pisos siguen estando conectados a los pines 2 (Planta baja), 4 (Primer piso) y 6 (Segundo piso).
En el driver del motor L298N se conectan de la misma forma el pin 3 de Arduino a la entrada N1 y el pin 5 a la entrada N2 del driver, que corresponden al motor A.
El positivo del altavoz está conectado al pin digital 9 y el negativo a GND.
El tarjetero para la MicroSD tiene 6 conexiones, dos para la alimentación a 5 voltios y 4 de señal, CS (El pin de Arduino al que está conectado es el que se debe definir en el programa), SCK, MOSI y MISO. Si se utiliza la librería SD.h el pin 11 está conectado a MOSI, el 12 a MISO y el 13 a SCK. En este caso CS está conectado al pin 10.
El programa para el ascensor con sonido se puede encontrar en SteamakersBlocks.
Este programa utiliza el Intérprete de código ASCII que también se puede descargar en SteamakersBlocks.
Salvo la función ASCII que tiene un conjunto de bloques muy grande, ya que tiene una estructura condicional para cada código ASCII, todas las demás funciones se muestran a continuación.
Programas con sonido y el IDE de Arduino
Subir y bajar para hacer pruebas
Este programa permite subir la caja del ascensor mientras se aprieta el pulsador del segundo piso y bajarla mientras se aprieta el pulsador de la Planta Baja.
void setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(6,INPUT);pinMode(3,OUTPUT);pinMode(5,OUTPUT);}
void loop(){
if(digitalRead(6)==HIGH){digitalWrite(3,LOW);digitalWrite(5,HIGH);delay(100);}else{digitalWrite(3,LOW);digitalWrite(5,LOW);}
if(digitalRead(2)==HIGH){digitalWrite(3,HIGH);digitalWrite(5,LOW);delay(100);}else{digitalWrite(3,LOW);digitalWrite(5,LOW);}
}
Programa básico de movimiento
El programa básico de subida y bajada para los tres pisos es el siguiente:
int pisoorigen = 0;int pisodestino = 1; //Este valor hace que al iniciar el programa el ascensor baje al primer piso
void setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(6,INPUT);pinMode(3,OUTPUT);pinMode(5,OUTPUT);}
void loop(){if(digitalRead(2)==HIGH){pisodestino = 1;}if(digitalRead(4)==HIGH){pisodestino = 2;}if(digitalRead(6)==HIGH){pisodestino = 3;}if(analogRead(A0)>150){pisoorigen = 1;}if(analogRead(A1)>150){pisoorigen = 2;}if(analogRead(A2)>150){pisoorigen = 3;}if(pisoorigen==pisodestino){digitalWrite(3,LOW);digitalWrite(5,LOW);delay(100);}if(pisoorigen<pisodestino){digitalWrite(3,LOW);digitalWrite(5,HIGH);delay(100);}if(pisoorigen>pisodestino){digitalWrite(3,HIGH);digitalWrite(5,LOW);delay(100);}}
Programa con movimiento y sonido
El programa siguiente integra movimiento y sonido. Al poner en marcha el programa en el setup se ejecuta la función sonido3() que pone en marcha una melodía de inicio. Cuando se presiona un pulsador emite la sintonía correspondiente a la función sonido1() y cuando la caja del ascensor llega a presionar el final de carrera correspondiente emite otra sintonía correspondiente a la función sonido2().
El contenido del archivo inicio.txt es: Ericcson:d=4,o=5,b=355:16b4,16d,16b4,16d,16b4,16d,16b4,16d,16d,16f,16d,16f,16d,16f,16d,16f,16f,16a,16f,16a,16f,16a,16f,16a,1p
El contenido del archivo piso.txt es: Sos:d=16,o=6,b=160:g,p,g,p,g,4p,8g.,p,8g.,p,8g.,4p,g,p,g,p,g,1p,g,p,g,p,g,4p,8g.,p,8g.,p,8g.,4p,g,p,g,p,g
El contenido del archivo llegada.txt es: :d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p
#include <SPI.h>#include <SD.h>#include <PlayRtttl.hpp>const int pinCS = 10; // Pin CS de la tarjeta SDint longitud;int pisoorigen = 0;int pisodestino = 1; //Este valor hace que al iniciar el programa el ascensor baje al primer pisoboolean Control = false;File archivo;void setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(6,INPUT);pinMode(3,OUTPUT);pinMode(5,OUTPUT);Serial.begin(9600);Serial.println("Inicializando tarjeta SD...");if (!SD.begin(pinCS)) {Serial.println("Error: No se pudo inicializar la tarjeta SD");while (true); // Detener ejecución}Serial.println("Tarjeta SD inicializada correctamente");sonido3();}void sonido1(){archivo = SD.open("inicio.txt");if (archivo) {Serial.println("Leyendo archivo...");longitud = archivo.size();char contenido[longitud]; // Variable para guardar el contenidoint i = 0;while (archivo.available() && i < longitud) {contenido[i] = archivo.read(); // Guardar cada carácteri++;}contenido[i] = '\0'; // Final de cadenaarchivo.close();Serial.println(contenido); // Imprimir todo el contenido guardado en la variableplayRtttlBlocking(9, contenido);} else {Serial.println("Error: No se pudo abrir datos.txt");}}void sonido2(){archivo = SD.open("piso.txt");if (archivo) {Serial.println("Leyendo archivo...");longitud = archivo.size();char contenido1[longitud]; // Variable para guardar el contenidoint i = 0;while (archivo.available() && i < longitud) {contenido1[i] = archivo.read(); // Guardar cada carácteri++;}contenido1[i] = '\0'; // Final de cadenaarchivo.close();Serial.println(contenido1); // Imprimir todo el contenido guardado en la variableplayRtttlBlocking(9, contenido1);} else {Serial.println("Error: No se pudo abrir datos.txt");}}void sonido3(){archivo = SD.open("llegada.txt");if (archivo) {Serial.println("Leyendo archivo...");longitud = archivo.size();char contenido2[longitud]; // Variable para guardar el contenidoint i = 0;while (archivo.available() && i < longitud) {contenido2[i] = archivo.read(); // Guardar cada carácteri++;}contenido2[i] = '\0'; // Final de cadenaarchivo.close();Serial.println(contenido2); // Imprimir todo el contenido guardado en la variableplayRtttlBlocking(9, contenido2);} else {Serial.println("Error: No se pudo abrir datos.txt");}}void loop(){if(digitalRead(2)==HIGH){pisodestino = 1;sonido1();}if(digitalRead(4)==HIGH){pisodestino = 2;sonido1();}if(digitalRead(6)==HIGH){pisodestino = 3;sonido1();}if(analogRead(A0)>150){pisoorigen = 1;}if(analogRead(A1)>150){pisoorigen = 2;}if(analogRead(A2)>150){pisoorigen = 3;}if(pisoorigen==pisodestino){digitalWrite(3,LOW);digitalWrite(5,LOW);if(Control==true){sonido2();Control = false;}delay(100);}if(pisoorigen<pisodestino){digitalWrite(3,LOW);digitalWrite(5,HIGH);Control = true;delay(100);}if(pisoorigen>pisodestino){digitalWrite(3,HIGH);digitalWrite(5,LOW);Control = true;delay(100);}}
Añadiendo una pantalla OLED
Para añadir la pantalla OLED usaré la librería SSD1306Ascii.h, ya que parece que la librería Adafruit_SSD1306.h resulta incompatible con las librerías que gestionan la tarjeta MicroSD. De todas formas con los dos elementos el programa se vuelve muy lento y la pantalla solamente trabaja al principio del programa.
#include <SPI.h>#include <SD.h>#include <PlayRtttl.hpp>#include "SSD1306Ascii.h"#include "SSD1306AsciiAvrI2c.h"// 0X3C+SA0 - 0x3C or 0x3D#define I2C_ADDRESS 0x3C// Define proper RST_PIN if required.#define RST_PIN -1SSD1306AsciiAvrI2c oled;const int pinCS = 10; // Pin CS de la tarjeta SDint longitud;int pisoorigen = 0;int pisodestino = 1; //Este valor hace que al iniciar el programa el ascensor baje al primer pisoboolean Control = false;boolean Control1 = false;File archivo;void setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(6,INPUT);pinMode(3,OUTPUT);pinMode(5,OUTPUT);Serial.begin(9600);Serial.println("Inicializando tarjeta SD...");if (!SD.begin(pinCS)) {Serial.println("Error: No se pudo inicializar la tarjeta SD");while (true); // Detener ejecución}Serial.println("Tarjeta SD inicializada correctamente");sonido3();#if RST_PIN >= 0oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);#else // RST_PIN >= 0oled.begin(&Adafruit128x64, I2C_ADDRESS);#endif // RST_PIN >= 0oled.setFont(Callibri15);// oled.setFont(Arial14);// oled.setFont(Callibri11_bold);// oled.setFont(TimesNewRoman13);// Increase space between letters.oled.setLetterSpacing(2);oled.clear();oled.setStartLine(2);oled.println("ASCENSOR");oled.setStartLine(1);oled.println("Suba con nosotros");oled.println("Bienvenido");}void sonido1(){archivo = SD.open("inicio.txt");if (archivo) {Serial.println("Leyendo archivo...");longitud = archivo.size();char contenido[longitud]; // Variable para guardar el contenidoint i = 0;while (archivo.available() && i < longitud) {contenido[i] = archivo.read(); // Guardar cada carácteri++;}contenido[i] = '\0'; // Final de cadenaarchivo.close();Serial.println(contenido); // Imprimir todo el contenido guardado en la variableplayRtttlBlocking(9, contenido);} else {Serial.println("Error: No se pudo abrir datos.txt");}}void sonido2(){archivo = SD.open("piso.txt");if (archivo) {Serial.println("Leyendo archivo...");longitud = archivo.size();char contenido1[longitud]; // Variable para guardar el contenidoint i = 0;while (archivo.available() && i < longitud) {contenido1[i] = archivo.read(); // Guardar cada carácteri++;}contenido1[i] = '\0'; // Final de cadenaarchivo.close();Serial.println(contenido1); // Imprimir todo el contenido guardado en la variableplayRtttlBlocking(9, contenido1);} else {Serial.println("Error: No se pudo abrir datos.txt");}}void sonido3(){archivo = SD.open("llegada.txt");if (archivo) {Serial.println("Leyendo archivo...");longitud = archivo.size();char contenido2[longitud]; // Variable para guardar el contenidoint i = 0;while (archivo.available() && i < longitud) {contenido2[i] = archivo.read(); // Guardar cada carácteri++;}contenido2[i] = '\0'; // Final de cadenaarchivo.close();Serial.println(contenido2); // Imprimir todo el contenido guardado en la variableplayRtttlBlocking(9, contenido2);} else {Serial.println("Error: No se pudo abrir datos.txt");}}void loop(){if(digitalRead(2)==HIGH){pisodestino = 1;oled.clear();oled.setStartLine(2);oled.println("PLANTA BAJA");sonido1();}if(digitalRead(4)==HIGH){pisodestino = 2;oled.clear();oled.setStartLine(2);oled.println("PRIMERO");sonido1();}if(digitalRead(6)==HIGH){pisodestino = 3;oled.clear();oled.setStartLine(2);oled.println("SEGUNDO");sonido1();}if(analogRead(A0)>150){pisoorigen = 1;}if(analogRead(A1)>150){pisoorigen = 2;}if(analogRead(A2)>150){pisoorigen = 3;}if(pisoorigen==pisodestino){digitalWrite(3,LOW);digitalWrite(5,LOW);if(Control==true){sonido2();Control = false;}delay(100);}if(pisoorigen<pisodestino){digitalWrite(3,LOW);digitalWrite(5,HIGH);Control = true;delay(100);}if(pisoorigen>pisodestino){digitalWrite(3,HIGH);digitalWrite(5,LOW);Control = true;delay(100);}}
Prescindiendo de la MicroSD para que sea operativo
Para hacer más ágil el funcionamiento del ascensor paso a prescindir del uso de la tarjeta MicroSD.
#include <PlayRtttl.hpp>#include "SSD1306Ascii.h"#include "SSD1306AsciiAvrI2c.h"// 0X3C+SA0 - 0x3C or 0x3D#define I2C_ADDRESS 0x3C// Define proper RST_PIN if required.#define RST_PIN -1SSD1306AsciiAvrI2c oled;int pisoorigen = 0;int pisodestino = 1; //Este valor hace que al iniciar el programa el ascensor baje al primer pisoboolean Control = false;char sonido11[] = "Ericcson:d=4,o=5,b=355:16b4,16d,16b4,16d,16b4,16d,16b4,16d,16d,16f,16d,16f,16d,16f,16d,16f,16f,16a,16f,16a,16f,16a,16f,16a,1p";char sonido12[] = "C:d=4,o=5,b=140:8e6,8d#6,8e6,8d#6,8e6,8b,8d6,8c6,a,8p,8c,8e,8a,b,8p,8e,8g#,8b,c6";char sonido13[] = "Sos:d=16,o=6,b=160:g,p,g,p,g,4p,8g.,p,8g.,p,8g.,4p,g,p,g,p,g,1p,g,p,g,p,g,4p,8g.,p,8g.,p,8g.,4p,g,p,g,p,g";void setup(){pinMode(2,INPUT);pinMode(4,INPUT);pinMode(6,INPUT);pinMode(3,OUTPUT);pinMode(5,OUTPUT);Serial.begin(9600);sonido3();#if RST_PIN >= 0oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);#else // RST_PIN >= 0oled.begin(&Adafruit128x64, I2C_ADDRESS);#endif // RST_PIN >= 0oled.clear();oled.setFont(Callibri15);// oled.setFont(Arial14);// oled.setFont(Callibri11_bold);// oled.setFont(TimesNewRoman13);// Increase space between letters.oled.setLetterSpacing(2);oled.clear();oled.setStartLine(2);oled.println("ASCENSOR");oled.setStartLine(1);oled.println("Suba con nosotros");oled.println("Bienvenido");}void sonido1(){playRtttlBlocking(9, sonido11);}void sonido2(){playRtttlBlocking(9, sonido12);}void sonido3(){playRtttlBlocking(9, sonido13);}void loop(){if(digitalRead(2)==HIGH){pisodestino = 1;oled.clear();oled.setStartLine(3);oled.println("");oled.println("PLANTA BAJA");sonido1();}if(digitalRead(4)==HIGH){pisodestino = 2;oled.clear();oled.setStartLine(3);oled.println("");oled.println("PRIMERO");sonido1();}if(digitalRead(6)==HIGH){pisodestino = 3;oled.clear();oled.setStartLine(3);oled.println("");oled.println("SEGUNDO");sonido1();}if(analogRead(A0)>150){pisoorigen = 1;}if(analogRead(A1)>150){pisoorigen = 2;}if(analogRead(A2)>150){pisoorigen = 3;}if(pisoorigen==pisodestino){digitalWrite(3,LOW);digitalWrite(5,LOW);if(Control==true){sonido2();Control = false;}delay(100);}if(pisoorigen<pisodestino){digitalWrite(3,LOW);digitalWrite(5,HIGH);Control = true;delay(100);}if(pisoorigen>pisodestino){digitalWrite(3,HIGH);digitalWrite(5,LOW);Control = true;delay(100);}}
Programando con SteamakersBlocks sonido y OLED
Con SteamakersBlocks he hecho un programa similar al anterior.











































No hay comentarios:
Publicar un comentario