[MUSIC] En los videos anteriores explicamos el armado, funcionamiento y la programación de varios elementos. Necesarios para la implementación de un pastillero inteligente. Recordemos cuáles han sido estos elementos. [MUSIC] Primero armamos el prototipo del pastillero que está formado por piezas de MDF. Que se cortaron y ensamblaron para construir una caja con tapa. La parte saliente a donde caerán las pastillas. Y el carrusel en su interior, en donde se colocarán los medicamentos de manera que salgan a la hora programada. Se colocó un interruptor de lámina que detectará cuándo el carrusel pide un compartimento, y luego detenga su movimiento. Y acoplado al carrusel, un motor de corriente directa que está fijado a la base intermedia de la caja. Luego alambramos un buzzer y dos leds. [SOUND] Con objeto de que funcionaran como alarmas. E indicaran al usuario tanto auditiva como visualmente el momento de tomar los medicamentos. Como recordarás, tenemos el programa que hace que el buzzer y los leds se enciendan intermitentemente. Agregamos un push button, el cual usamos como señal de interrupción para apagar la alarma. [SOUND] [MUSIC] La rutina de control de encendido del buzzer y los leds la escribimos como la función alarma. Y a la función de la rutina de servicio de interrupción la denominamos interruptor. Después hicimos funcionar un motor de corriente directa. De manera que fuera posible controlar su velocidad de rotación. Enseguida, añadimos al programa de control del motor de corriente directa la lectura de la señal de un interruptor de lámina. Para que el carrusel del pastillero gire un compartimento. La rutina de control del motor de corriente directa con el interruptor de lámina la escribimos como la función activaMotor. Anteriormente te mostramos cómo se usa un despliegue de cristal líquido o LCD. Y el programa para que funcione como un reloj que despliegue horas, minutos y segundos con formato de 24 horas. [MUSIC] Para la operación de LCD como reloj necesitamos realizar conversiones de tiempo. De horas y minutos a milisegundos. Para la que empleamos la función ConversionHminMs. Y también de milisegundos a horas y minutos. Función que denominamos ConversionMsHmin. Para mostrar el tiempo actual en el LCD, creamos la función que denominamos Despliegue. [MUSIC] Dado que para el funcionamiento del pastillero es suficiente con conocer el tiempo actual sólo con horas y minutos. Haremos pequeñas modificaciones a las funciones ConversionMsHmin y despliegue. Para ello abrimos el programa de relojLCD.ino. En el que eliminaremos tanto la variable segActual. Como las sentencias relacionadas con la obtención y escritura de los segundos. Luego de que realicemos las modificaciones, la función ConversionMsHmin quedará así. [MUSIC] Y la parte final de despliegue quedará como se observa. Para conservar las modificaciones realizadas, es necesario guardarlas. Simplemente seleccionando el menú Archivo y la opción Guardar Como. Te sugerimos el nombre de relojLCDVersion2. Como recordarás, la función despliegue hora toma muestra en el segundo renglón del LCD el identificador de la toma de medicinas. Y la hora a la que está programada. Esta función debió quedar como se muestra a continuación. [MUSIC] Ahora, integraremos todas las funciones anteriores para conformar el programa de control del pastillero. Escribimos como comentario el nombre que le daremos a este programa. Pastillero, junto con una descripción de lo que hará. Luego, ingresamos las variables a emplear. Las cuales podemos copiar primero del programa Alarma.ino. Luego del ActivaMotor.ino, y finalmente del programa relojLCDVersion2.ino. Dado que en estos dos últimos programas se repite la variable tiempoActual. Debemos eliminar una de ellas para no incurrir en un error de compilación. A continuación se escribirá el comentario. Se incluye el código de la biblioteca del LCD. Y debajo la sentencia #include<LiquidCrystal.h>. Después, el comentario incializa la biblioteca con el número de los pines. Y en la siguiente línea, LiquidCrystal LCD(4,6,11,12,13,14). En este punto, conviene guardar lo que llevamos del programa Pastillero.ino. Que como recordarás, se hace seleccionando el menú Archivo, luego la opción Salvar. Se escoge la carpeta en la que se desea guardar el archivo. Y se escribe en la caja de texto el nombre sugerido, Pastillero. [MUSIC] Ahora, escribimos la función setup. Para ello copiamos del programa relojLCDv2.ino todas las sentencias de dicha función. Y las pegamos en el programa Pastillero.ino. Luego escribimos el comentario Configuración terminales buzzer, leds y botón alarma. Después copiamos del programa Alarma.ino todas las líneas del setup para pegarlas en Pastillero.ino. Posteriormente, escribimos el comentario Configuración terminales del puente H y del interruptor. Enseguida, copiamos del programa ActivaMotor.ino las primeras tres sentencias de su setup. Para pegarlas en nuestro programa. Para concluir el código del setup, escribimos el comentario Cálculo tiempos de activación del motor. En este ejemplo, consideramos que habrá cuatro tomas de medicamento. Por lo que en la declaración de la variable tiempoActivacion escribimos tiempoActivacion[4]. Con un máximo de siete tomas. En cuyo caso la declaración de la variable quedaría tiempoActivacion[7]. Enseguida incluimos el comentario Hora de la primera toma. Y luego el nombre de las variables hora y minuto, igualadas a la hora y minuto de la primera toma. Seguido de la llamada a la función conversionHminMs(). Y la asignación del resultado de la conversión de tiempo Ms a la variable tiempoActivacion[0]. Continuamos escribiendo el comentario Hora de la segunda toma. Y la posterior asignación de la hora y minuto de dicha toma. Junto con la llamada a la misma función conversionHminMs(). Y la asignación de Tiempo Ms a tiempo activación [1]. Así sucesivamente ingresamos la hora y minuto de todas las demás tomas. Realizando su conversión a milisegundos y asignando el resultando a Tiempo Activación [toma-1]. Donde toma es el identificador de la toma correspondiente. [MUSIC] Por último, agregamos el comentario Hora final. Y luego las sentencias hora=23, minuto=59, conversionHminMs() tiempoActivacion[4]. En este punto será conveniente volver a guardar lo que llevamos escrito de nuestro programa. A continuación, escribimos la función loop del programa Pastillero.ino. Primero escribimos las líneas void loop(), abrimos llave. Luego el comentario Envío señales iniciales al puente H: motor detenido. Seguido de las sentencias digitalWrite(pinIN1,0). digitalWrite(pinIN2,0). analogWrite(pinPWM,valorPWM). Despliegue(), delay(tiempoRet). Posteriormente el comentario Mientras el tiempoActual sea menor que el tiempoActivacion[toma] + [tiempoBase], sólo despliega la hora. Y luego la estructura do-while, do { Despliegue(); delay(tiempoRet); tiempoActual=a millis[] + tiempoBase. Se cierran las llaves. while(tiempoActual< tiempoActivacion[toma]). Después escribimos el comentario Cuando el tiempo actual es mayor que el tiempoActivacion[toma]. Se sale de la estructura do-while, activa el motor, despliega la hora de toma, y enciende la alarma. Y enseguida las sentencias activaMotor(). banderaAlarma=HIGH. Y la estructura do-while, do {, despliegue de la hora de toma DespliegueHoraToma(), Alarma(), cerramos }. while(banderaAlarma==HIGH). Por último, escribimos el comentario La alarma se apagará cuando se oprima el botón de apagado. El cual hará que la variable banderaAlarma tome el valor LOW. De manera que se saldrá de la estructura do-while anterior. Borra lcd. Seguido de las sentencias lcd.clear(), toma++, y se cierra la } de la función loop. [MUSIC] Para concluir con la escritura de este programa, sólo necesitamos copiar las funciones ConversionHminMs(), ConversionMsHmin(), y Despliegue(). Del programa relojLCDv2.ino. La función ActivaMotor() del programa ActivaMotor.ino. La función Alarma(), y la rutina servicio de interrupción Interruptor() del programa Alarma.ino. Y agregar la función DespliegueHoraToma(). Guardamos nuevamente nuestro programa Pastillero.ino. Y posteriormente lo compilamos haciendo clic en el primer ícono circular del lado izquierdo con la paloma. En caso de que en la compilación se hubiera generado errores, requerimos leer dichos errores en la zona de mensajes. En la parte inferior de la ventana del ID. Ubicar el número de línea en el que se encuentran y corregirlos uno por uno. Por ejemplo, en la imagen de la ventana del ID de Arduino que se muestra. Podemos identificar en la zona de mensajes que existe un error en la función void loop(), línea 101. Que dice que la sentencia AnalogWrite no está declarada. La equivocación consiste en que se debe escribir analogWrite con la primera a minúscula. [MUSIC]. En la siguiente imagen podemos leer que la línea 111 de la función void loop() dice que se espera ; antes de la llave. Y efectivamente en la línea 110 la sentencia está escrita sin ; al final. [MUSIC] De forma similar, en esta otra imagen podemos verificar que la función void ActivaMotor(), línea 186, dice que se espera while antes de wihle. Lo que nos indica que la palabra wihle está mal escrita, y en su lugar debemos escribir while. [MUSIC]. Luego de corregir estos errores, si la compilación es exitosa, aparecerá una imagen como la que se muestra. Si se te dificulta el proceso de corrección de errores, te recomendamos que verifiques con detenimiento y mucha paciencia el código del programa completo. Línea por línea, como se muestra. Así hemos concluido la integración del programa de control del pastillero inteligente. Los elementos principales que lo componen son la alarma, formada por el buzzer, los ledss, y el push button para apagarla. El motor de corriente directa con el interruptor de lámina para el control del movimiento del carrusel. [SOUND]. Y el LCD para el despliegue del tiempo actual con el identificador y la hora de toma cuando corresponde. Y cuidar rutinas de control combinamos para integrar el programa completo Pastillero.ino. [MUSIC] Ahora you sabes cómo enviar señales digitales de encendido-apagado para hacer funcionar elementos como LEDs. Cómo recibir señales digitales de interruptores. Cómo leer señales analógicas de un potenciómetro, así como su voltaje. Cómo controlar la velocidad de giro de un motor de corriente directa con señales PWM. Y su sentido de giro empleando un puente H. Y también cómo funciona un despliegue de cristal líquido o LCD para escribir mensajes y valores numéricos. Deseamos que a lo largo de este curso hayas aprendido lo suficiente para ser capaz de emplear la tarjeta Arduino. Y puedas hacer funcionar aquellos dispositivos que te interese controlar. Recuerda que tienes en la referencia de Arduino una magnífica fuente de información para el desarrollo de tus futuros proyectos. Y también es importante emplear el foro de la comunidad de Arduino para consultar tus dudas y publicar tus aportaciones. Muchas gracias por la atención y el esfuerzo que dedicaste a este curso. [MUSIC]