Arduino se enfoca en acercar y facilitar el uso de la electrónica y programación de sistemas embebidos en proyectos multidisciplinarios.Toda la plataforma, incluyendo sus componentes de hardware (esquemáticos) y Software, son liberados con licencia de código abierto que permite libertad de acceso a ellos. El hardware consiste en una placa de circuito impreso con un microcontrolador, usualmente Atmel AVR, puertos digitales y analógicos de entrada/salida, los cuales pueden conectarse a placas de expansión (shields), que amplían los funcionamientos de la placa Arduino. Asimismo, posee un puerto de conexión USB desde donde se puede alimentar la placa y establecer comunicación con el computador.
![]() |
Placa Arduino Uno |
![]() |
Microcontrolador ATmega 328P de la familia ATMEL |
Hoja de datos de ATMEL-ATmega 328P: http://pdf1.alldatasheet.com/datasheet-pdf/view/392284/ATMEL/ATMEGA328-PU.html
1.1 PRINCIPALES CARACTERÍSTICAS:
- Microcontrolador AVR® de 8 bits de alto rendimiento y baja potencia
- Arquitectura RISC avanzada: *131 potentes instrucciones - La mayoría de ejecución de ciclo de reloj único, *32 x 8 Registros de trabajo de propósito general, *Operación completamente estática, *Hasta 20 MIPS de rendimiento a 20 MHz, *Multiplicador de 2 ciclos en chip
- Segmentos de memoria no volátil de alta resistencia: *4/8/16 / 32K Bytes de la memoria del programa Flash autoprogramable dentro del sistema, *256/512/512 / 1K Bytes EEPROM, *512 / 1K / 1K / 2K bytes SRAM internos, *Ciclos de escritura / borrado: 10,000 Flash / 100,000 EEPROM, *Retención de datos: 20 años a 85 ° C / 100 años a 25 ° C (1), *Sección de código de arranque opcional con bits de bloqueo independientes, *Programación en el sistema mediante el programa de arranque en chip, *Verdadera operación de lectura mientras se escribe, *Bloqueo de programación para seguridad de software.
- Características periféricas: *Dos temporizadores / contadores de 8 bits con preescalador independiente y modo de comparación, *Un temporizador / contador de 16 bits con preescalador independiente, modo de comparación y captura, *Modo: *Contador en tiempo real con oscilador separado, *Seis canales PWM, *ADC de 8 canales y 10 bits en el paquete TQFP y QFN / MLF.
- Medida de temperatura: *ADC de 10 canales de 10 bits en paquete PDIP, *Serie USART programable, *Interfaz serial SPI Master / Slave, *Interfaz serie de 2 hilos orientada a bytes (Philips I2C compatible), *Temporizador de vigilancia programable con oscilador separado en el chip, *Comparador analógico en el chip, *Interrumpir y despertar en el cambio de pin.
- Funciones especiales del microcontrolador: *Reinicio de encendido y detección programable de apagado, *Oscilador calibrado interno, *Fuentes de interrupción externa e interna, *Seis modos de reposo: inactivo, reducción de ruido ADC, ahorro de energía, apagado, modo de espera, y Standby extendido
- E / S y paquetes:*23 líneas de E / S programables, *PDIP de 28 pines, TQFP de 32 derivaciones, QFN / MLF de 28 almohadillas y QFN / MLF de 32 almohadillas
- Tensión de funcionamiento:1.8 - 5.5V
- Rango de temperatura: -40 ° C a 85 ° C
- Grado de velocidad: - 0 - 4 MHz@1.8 - 5.5V, 0 - 10 MHz@2.7 - 5.5.V, 0 - 20 MHz @ 4.5 - 5.5V
- Consumo de energía a 1 MHz, 1.8V, 25 ° C: *Modo activo: 0.2 mA, *Modo de apagado: 0.1 μA, *Modo de ahorro de energía: 0,75 μA (incluido RTC de 32 kHz)
![]() |
Pines de ATMEL-Atmega 328 |
Los pines I/O( Input/Output) están organizados en 3 puertos:
- Puerto B: 8 pines.
- Puerto C: 7 pines.
- Puerto D: 8 pines.
1.2 DIAGRAMA INTERNO:
![]() |
D.I de ATMEL-ATmega 328 |
![]() |
D.I de ATMEL-ATmega 328 específicado |
2. DESCRIPCIÓN DEL ÁREA DE TRABAJO DE ARDUINO:
3. COURSERA
3.1 Semana 01:
Verificar el correcto funcionamiento del Arduino con el programa Blink
![]() |
Programa Blink Compilado |
Modificar el código Blink con las especificaciones del profesor
Lista de tareas y cuestionarios de la semana 01
3.2 Semana 02: CHALECO P
Rutina Ociosa:
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int tiempoRetOciosa = 200;
int cuenta_ocio = 0;
int estePin;
// Función setup
void setup ()
{
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
digitalWrite (led[cuenta_ocio],HIGH);
digitalWrite (led[cuenta_ocio+4],HIGH);
delay (tiempoRetOciosa);
digitalWrite (led[cuenta_ocio],LOW);
digitalWrite (led[cuenta_ocio+4],LOW);
cuenta_ocio++;
if (cuenta_ocio > 3)
{
cuenta_ocio = 0;
}
}
Rutina Izquierda:
int bot = 3;
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int tiempoRet = 400;
int estePin;
int cuenta_izq = 0;
boolean bot_izq = LOW;
// Función setup
void setup ()
{
pinMode (bot,INPUT);
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
bot_izq = digitalRead (bot);
if (bot_izq==HIGH)
{
switch (cuenta_izq)
{
case 0:
digitalWrite (led[2],HIGH);
digitalWrite (led[9],HIGH);
digitalWrite (led[4],HIGH);
break;
case 1:
digitalWrite (led[1],HIGH);
digitalWrite (led[8],HIGH);
digitalWrite (led[5],HIGH);
break;
case 2:
digitalWrite (led[0],HIGH);
digitalWrite (led[7],HIGH);
digitalWrite (led[6],HIGH);
break;
default:
;
}
delay (tiempoRet);
cuenta_izq++;
if (cuenta_izq > 3)
{
cuenta_izq = 0;
}
}
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],LOW);
}
}
Rutina Derecha:
int bot = 2;
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int tiempoRet = 400;
int estePin;
int cuenta_der = 0;
boolean bot_der = LOW;
// Función setup
void setup ()
{
pinMode (bot,INPUT);
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
bot_der = digitalRead (bot);
if (bot_der ==HIGH)
{
switch (cuenta_der)
{
case 0:
digitalWrite (led[0],HIGH);
digitalWrite (led[8],HIGH);
digitalWrite (led[6],HIGH);
break;
case 1:
digitalWrite (led[1],HIGH);
digitalWrite (led[9],HIGH);
digitalWrite (led[5],HIGH);
break;
case 2:
digitalWrite (led[2],HIGH);
digitalWrite (led[3],HIGH);
digitalWrite (led[4],HIGH);
break;
default:
;
}
delay (tiempoRet);
cuenta_der++;
if (cuenta_der > 3)
{
cuenta_der = 0;
}
}
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],LOW);
}
}
Rutina Stop:
int bot[] = {1,2,3};
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int numBots = 3;
int tiempoRet = 400;
int tiempoRetOciosa = 200;
int estePin;
int cuenta_der = 0;
int cuenta_alto = 0;
int cuenta_izq = 0;
int cuenta_ocio = 0;
boolean bot_derecha = LOW;
boolean bot_alto = LOW;
boolean bot_izquierda = LOW;
// Función setup
void setup ()
{
for (estePin = 0; estePin < numBots; estePin++)
{
pinMode (bot[estePin],INPUT);
}
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin], LOW);
}
bot_derecha = digitalRead (bot[0]);
bot_alto = digitalRead (bot[1]);
bot_izquierda = digitalRead (bot[2]);
if (bot_derecha==HIGH)
{
Derecha ();
}
else if (bot_alto==HIGH
)
{
Alto ();
}
else if (bot_izquierda==HIGH
)
{
Izquierda ();
}
else
{
Ociosa ();
}
}
// Función Derecha
void Derecha () {
switch (cuenta_der)
{
case 0:
digitalWrite (led[0],HIGH);
digitalWrite (led[8],HIGH);
digitalWrite (led[6],HIGH);
break
;
case 1
:
digitalWrite (led[1],HIGH);
digitalWrite (led[9],HIGH);
digitalWrite (led[5],HIGH);
break
;
case 2
:
digitalWrite (led[2],HIGH);
digitalWrite (led[3],HIGH);
digitalWrite (led[4],HIGH);
break
;
default
:
;
}
delay (tiempoRet);
cuenta_der++;
if (cuenta_der > 3)
{
cuenta_der = 0;
}
}
// Función Alto
void Alto ()
{
if (cuenta_alto == 1)
{
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],HIGH);
}
}
else
{
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],LOW);
}
}
delay (tiempoRet);
cuenta_alto++;
if (cuenta_alto > 1)
{
cuenta_alto = 0;
}
}
// Función Izquierda
void Izquierda ()
{
switch (cuenta_izq)
{
case 0:
digitalWrite (led[2],HIGH);
digitalWrite (led[9],HIGH);
digitalWrite (led[4],HIGH);
break;
case 1:
digitalWrite (led[1],HIGH);
digitalWrite (led[8],HIGH);
digitalWrite (led[5],HIGH);
break;
case 2:
digitalWrite (led[0],HIGH);
digitalWrite (led[7],HIGH);
digitalWrite (led[6],HIGH);
break;
default:
;
}
delay (tiempoRet);
cuenta_izq++;
if (cuenta_izq > 3)
{
cuenta_izq = 0;
}
}
// Función Ociosa
void Ociosa ()
{
digitalWrite (led[cuenta_ocio],HIGH);
digitalWrite (led[cuenta_ocio+4],HIGH);
delay (tiempoRetOciosa);
cuenta_ocio++;
if (cuenta_ocio > 3)
{
cuenta_ocio = 0;
}
}
Lista de tarea y cuestionarios de la semana 02
3.3 Semana 03: PASTILLERO
Código para el pastillero:
/* Programa PastilleroV10.ino
Controla la operación del pastillero.
Contiene, además de las funciones setup() y loop(),
las funciones ConversionHminMs(), ConversionMsHmin(),
ActivaMotor(), Alarma(), Despliegue(),
DespliegueHoraToma() e Interruptor(). */
// Variables Alarma
int pinBuzzer = 15;
int pinLed1 = 16;
int pinLed2 = 17;
int pinBoton = 2;
boolean banderaAlarma = HIGH;
int rep;
int numRep = 10;
int tiempoEnc = 600;
int tiempoApag = 400;
int tiempoEspera = 9900;
// Variables ActivaMotor
int pinIntLamina = 5;
int pinIN1 = 7;
int pinIN2 = 8;
int pinPWM = 9;
boolean estadoIntLamina;
int valorPWM = 230;
long tiempoActivacion[5];
int toma = 0;
// Variables Despliegue
long tiempoMs;
long tiempoBase;
long tiempoActual;
long hora;
long minuto;
long horaActual;
long minActual;
int tiempoRet = 19000;
// Se incluye el código de la biblioteca del LCD
#include <LiquidCrystal.h>
// Inicializa la biblioteca con el número de los pines
LiquidCrystal lcd(4, 6, 11, 12, 13, 14);
// Función setup
void setup()
{
// Hora de reinicio
hora = 8;
minuto = 39;
// Cálculo tiempo base
ConversionHminMs();
tiempoBase = tiempoMs;
// Configuración del número de columnas y renglones del LCD
lcd.begin(16,2);
// Configuración terminales buzzer, led y botón alarma
pinMode(pinBuzzer, OUTPUT);
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinBoton, INPUT);
attachInterrupt(0, Interruptor, RISING);
// Configuración terminales del puente H y del interruptor
pinMode(pinIN1, OUTPUT);
pinMode(pinIN2, OUTPUT);
pinMode(pinIntLamina, INPUT);
// Cálculo tiempos de activación del motor
// Hora de la primera toma
hora = 9;
minuto = 00;
ConversionHminMs();
tiempoActivacion[0] = tiempoMs;
// Hora de la segunda toma
hora = 12;
minuto = 30;
ConversionHminMs();
tiempoActivacion[1] = tiempoMs;
// Hora de la tercera toma
hora = 15;
minuto = 00;
ConversionHminMs();
tiempoActivacion[2] = tiempoMs;
// Hora de la cuarta toma
hora = 18;
minuto = 45;
ConversionHminMs();
tiempoActivacion[3] = tiempoMs;
// En caso de que haya más tomas, agregarlas a continuación:
// Hora final
hora = 23;
minuto = 59;
ConversionHminMs();
tiempoActivacion[4] = tiempoMs;
}
// Función loop
void loop()
{
// Envío señales iniciales al puente H: motor detenido
digitalWrite(pinIN1, 0);
digitalWrite(pinIN2, 0);
analogWrite(pinPWM, valorPWM);
Despliegue();
delay(tiempoRet);
/* Mientras el tiempoActual sea menor que el tiempoActivacion[toma]
+ tiempoBase, sólo despliega la hora */
do
{
Despliegue();
delay(tiempoRet);
tiempoActual = millis() + tiempoBase;
} while(tiempoActual < tiempoActivacion[toma]);
/* Cuando el tiempoActual 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 */
ActivaMotor();
banderaAlarma = HIGH;
do
{
// Despliegue de la hora de toma
DespliegueHoraToma();
Alarma();
} while(banderaAlarma == HIGH);
/* 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
lcd.clear();
toma++;
}
/* Función ConversionHminMs
Convierte el tiempo en horas y minutos a milisegundos */
void ConversionHminMs()
{
minuto = minuto + hora*60;
tiempoMs = minuto*60000;
}
/* Función ConversionMsHmin
Convierte el tiempo en milisegundos a horas y minutos */
void ConversionMsHmin()
{
horaActual = tiempoActual/60/60000;
minActual = tiempoActual/60000 - horaActual*60;
}
/* Función Despliegue
Despliega en un LCD la hora, con formato hora:minutos 24 h
* Pin RS del LCD al pin 4
* Pin E del LCD al pin 6
* Pin D4 del LCD al pin 11
* Pin D5 del LCD al pin 12
* Pin D6 del LCD al pin 13
* Pin D7 del LCD al pin 14
* Pin R/W del LCD a tierra */
void Despliegue()
{
// Calcula el tiempoActual con respecto al tiempoBase
tiempoActual = millis() + tiempoBase;
// Conversión del tiempoActual a horas:munutos
ConversionMsHmin();
// Se inicializa el LCD
lcd.begin(16,2);
// Se coloca el cursor en el origen
lcd.setCursor(0,0);
// Limpia el primer renglón
lcd.print(" ");
// Se coloca el cursor en el origen
lcd.setCursor(0,0);
// Escribe el letrero Hora
lcd.print("Hora ");
// Escribe horas:minutos
lcd.print(horaActual);
lcd.print(":");
lcd.print(minActual);
}
/* Función Activa Motor
Controla el motor de CD del pastillero, con base en
la señal de un interruptor de lámina activa alta */
void ActivaMotor()
{
do
{
digitalWrite(pinIN1, 1);
estadoIntLamina = digitalRead(pinIntLamina);
} while(estadoIntLamina == HIGH);
delay(200);
do
{
digitalWrite(pinIN1, 1);
estadoIntLamina = digitalRead(pinIntLamina);
} while(estadoIntLamina == LOW);
digitalWrite(pinIN1, 0);
}
/* Función Alarma
Hace sonar intermitentemente un buzzer, y al mismo tiempo
prende un led intermitentemente, hasta que se oprime el
botón de apagado de la alarma */
void Alarma()
{
for (rep = 0; rep < numRep; rep++)
{
digitalWrite(pinBuzzer, HIGH);
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, HIGH);
delay(tiempoEnc);
digitalWrite(pinBuzzer, LOW);
digitalWrite(pinLed1, LOW);
digitalWrite(pinLed2, LOW);
delay(tiempoApag);
}
delay(tiempoEspera);
}
/* Función Interruptor
Rutina de servicio de interrupción */
void Interruptor()
{
banderaAlarma = LOW;
}
/* Función DespliegueHoraToma
Despliega en el segundo renglón del LCD la hora de la toma de
las pastillas, indicando también a qué toma corresponde */
void DespliegueHoraToma()
{
Despliegue();
// Calcula el tiempo de la toma con respecto al tiempoBase
tiempoActual = tiempoActivacion[toma];
// Conversión del tiempoActual a horas:munutos
ConversionMsHmin();
// Se coloca el cursor en el origen del segundo renglón
lcd.setCursor(0,1);
// Limpia el segundo renglón
lcd.print(" ");
// Se coloca el cursor en el origen
lcd.setCursor(0,1);
// Escribe el número de la toma
lcd.print(toma+1);
// Escribe el letrero "a toma "
lcd.print("a toma ");
// Escribe horas:minutos
lcd.print(horaActual);
lcd.print(":");
lcd.print(minActual);
}
Lista de tarea y cuestionarios de la semana 02:
4. INTEGRANTES:
![]() |
Programa Blink. Derivado del original |
![]() |
Coursera-Jesús Cruz |
3.2 Semana 02: CHALECO P
Rutina Ociosa:
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int tiempoRetOciosa = 200;
int cuenta_ocio = 0;
int estePin;
// Función setup
void setup ()
{
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
digitalWrite (led[cuenta_ocio],HIGH);
digitalWrite (led[cuenta_ocio+4],HIGH);
delay (tiempoRetOciosa);
digitalWrite (led[cuenta_ocio],LOW);
digitalWrite (led[cuenta_ocio+4],LOW);
cuenta_ocio++;
if (cuenta_ocio > 3)
{
cuenta_ocio = 0;
}
}
Rutina Izquierda:
int bot = 3;
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int tiempoRet = 400;
int estePin;
int cuenta_izq = 0;
boolean bot_izq = LOW;
// Función setup
void setup ()
{
pinMode (bot,INPUT);
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
bot_izq = digitalRead (bot);
if (bot_izq==HIGH)
{
switch (cuenta_izq)
{
case 0:
digitalWrite (led[2],HIGH);
digitalWrite (led[9],HIGH);
digitalWrite (led[4],HIGH);
break;
case 1:
digitalWrite (led[1],HIGH);
digitalWrite (led[8],HIGH);
digitalWrite (led[5],HIGH);
break;
case 2:
digitalWrite (led[0],HIGH);
digitalWrite (led[7],HIGH);
digitalWrite (led[6],HIGH);
break;
default:
;
}
delay (tiempoRet);
cuenta_izq++;
if (cuenta_izq > 3)
{
cuenta_izq = 0;
}
}
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],LOW);
}
}
Rutina Derecha:
int bot = 2;
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int tiempoRet = 400;
int estePin;
int cuenta_der = 0;
boolean bot_der = LOW;
// Función setup
void setup ()
{
pinMode (bot,INPUT);
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
bot_der = digitalRead (bot);
if (bot_der ==HIGH)
{
switch (cuenta_der)
{
case 0:
digitalWrite (led[0],HIGH);
digitalWrite (led[8],HIGH);
digitalWrite (led[6],HIGH);
break;
case 1:
digitalWrite (led[1],HIGH);
digitalWrite (led[9],HIGH);
digitalWrite (led[5],HIGH);
break;
case 2:
digitalWrite (led[2],HIGH);
digitalWrite (led[3],HIGH);
digitalWrite (led[4],HIGH);
break;
default:
;
}
delay (tiempoRet);
cuenta_der++;
if (cuenta_der > 3)
{
cuenta_der = 0;
}
}
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],LOW);
}
}
Rutina Stop:
int bot = 2;
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int tiempoRet = 400;
int estePin;
boolean bot_alto = LOW;
// Función setup
void setup ()
{
pinMode (bot,INPUT);
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
bot_alto = digitalRead (bot);
if (bot_alto==HIGH)
{
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],HIGH);
}
delay (tiempoRet);
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],LOW);
}
delay (tiempoRet);
}
}
Rutina Completa:int bot[] = {1,2,3};
int led[] = {4,5,6,7,8,9,10,11,12,13};
int numLeds = 10;
int numBots = 3;
int tiempoRet = 400;
int tiempoRetOciosa = 200;
int estePin;
int cuenta_der = 0;
int cuenta_alto = 0;
int cuenta_izq = 0;
int cuenta_ocio = 0;
boolean bot_derecha = LOW;
boolean bot_alto = LOW;
boolean bot_izquierda = LOW;
// Función setup
void setup ()
{
for (estePin = 0; estePin < numBots; estePin++)
{
pinMode (bot[estePin],INPUT);
}
for (estePin = 0; estePin < numLeds; estePin++)
{
pinMode (led[estePin],OUTPUT);
}
}
// Función loop
void loop ()
{
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin], LOW);
}
bot_derecha = digitalRead (bot[0]);
bot_alto = digitalRead (bot[1]);
bot_izquierda = digitalRead (bot[2]);
if (bot_derecha==HIGH)
{
Derecha ();
}
else if (bot_alto==HIGH
)
{
Alto ();
}
else if (bot_izquierda==HIGH
)
{
Izquierda ();
}
else
{
Ociosa ();
}
}
// Función Derecha
void Derecha () {
switch (cuenta_der)
{
case 0:
digitalWrite (led[0],HIGH);
digitalWrite (led[8],HIGH);
digitalWrite (led[6],HIGH);
break
;
case 1
:
digitalWrite (led[1],HIGH);
digitalWrite (led[9],HIGH);
digitalWrite (led[5],HIGH);
break
;
case 2
:
digitalWrite (led[2],HIGH);
digitalWrite (led[3],HIGH);
digitalWrite (led[4],HIGH);
break
;
default
:
;
}
delay (tiempoRet);
cuenta_der++;
if (cuenta_der > 3)
{
cuenta_der = 0;
}
}
// Función Alto
void Alto ()
{
if (cuenta_alto == 1)
{
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],HIGH);
}
}
else
{
for (estePin = 0; estePin < numLeds; estePin++)
{
digitalWrite (led[estePin],LOW);
}
}
delay (tiempoRet);
cuenta_alto++;
if (cuenta_alto > 1)
{
cuenta_alto = 0;
}
}
// Función Izquierda
void Izquierda ()
{
switch (cuenta_izq)
{
case 0:
digitalWrite (led[2],HIGH);
digitalWrite (led[9],HIGH);
digitalWrite (led[4],HIGH);
break;
case 1:
digitalWrite (led[1],HIGH);
digitalWrite (led[8],HIGH);
digitalWrite (led[5],HIGH);
break;
case 2:
digitalWrite (led[0],HIGH);
digitalWrite (led[7],HIGH);
digitalWrite (led[6],HIGH);
break;
default:
;
}
delay (tiempoRet);
cuenta_izq++;
if (cuenta_izq > 3)
{
cuenta_izq = 0;
}
}
// Función Ociosa
void Ociosa ()
{
digitalWrite (led[cuenta_ocio],HIGH);
digitalWrite (led[cuenta_ocio+4],HIGH);
delay (tiempoRetOciosa);
cuenta_ocio++;
if (cuenta_ocio > 3)
{
cuenta_ocio = 0;
}
}
![]() |
Coursera- Jesús Cruz |
3.3 Semana 03: PASTILLERO
Código para el pastillero:
/* Programa PastilleroV10.ino
Controla la operación del pastillero.
Contiene, además de las funciones setup() y loop(),
las funciones ConversionHminMs(), ConversionMsHmin(),
ActivaMotor(), Alarma(), Despliegue(),
DespliegueHoraToma() e Interruptor(). */
// Variables Alarma
int pinBuzzer = 15;
int pinLed1 = 16;
int pinLed2 = 17;
int pinBoton = 2;
boolean banderaAlarma = HIGH;
int rep;
int numRep = 10;
int tiempoEnc = 600;
int tiempoApag = 400;
int tiempoEspera = 9900;
// Variables ActivaMotor
int pinIntLamina = 5;
int pinIN1 = 7;
int pinIN2 = 8;
int pinPWM = 9;
boolean estadoIntLamina;
int valorPWM = 230;
long tiempoActivacion[5];
int toma = 0;
// Variables Despliegue
long tiempoMs;
long tiempoBase;
long tiempoActual;
long hora;
long minuto;
long horaActual;
long minActual;
int tiempoRet = 19000;
// Se incluye el código de la biblioteca del LCD
#include <LiquidCrystal.h>
// Inicializa la biblioteca con el número de los pines
LiquidCrystal lcd(4, 6, 11, 12, 13, 14);
// Función setup
void setup()
{
// Hora de reinicio
hora = 8;
minuto = 39;
// Cálculo tiempo base
ConversionHminMs();
tiempoBase = tiempoMs;
// Configuración del número de columnas y renglones del LCD
lcd.begin(16,2);
// Configuración terminales buzzer, led y botón alarma
pinMode(pinBuzzer, OUTPUT);
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinBoton, INPUT);
attachInterrupt(0, Interruptor, RISING);
// Configuración terminales del puente H y del interruptor
pinMode(pinIN1, OUTPUT);
pinMode(pinIN2, OUTPUT);
pinMode(pinIntLamina, INPUT);
// Cálculo tiempos de activación del motor
// Hora de la primera toma
hora = 9;
minuto = 00;
ConversionHminMs();
tiempoActivacion[0] = tiempoMs;
// Hora de la segunda toma
hora = 12;
minuto = 30;
ConversionHminMs();
tiempoActivacion[1] = tiempoMs;
// Hora de la tercera toma
hora = 15;
minuto = 00;
ConversionHminMs();
tiempoActivacion[2] = tiempoMs;
// Hora de la cuarta toma
hora = 18;
minuto = 45;
ConversionHminMs();
tiempoActivacion[3] = tiempoMs;
// En caso de que haya más tomas, agregarlas a continuación:
// Hora final
hora = 23;
minuto = 59;
ConversionHminMs();
tiempoActivacion[4] = tiempoMs;
}
// Función loop
void loop()
{
// Envío señales iniciales al puente H: motor detenido
digitalWrite(pinIN1, 0);
digitalWrite(pinIN2, 0);
analogWrite(pinPWM, valorPWM);
Despliegue();
delay(tiempoRet);
/* Mientras el tiempoActual sea menor que el tiempoActivacion[toma]
+ tiempoBase, sólo despliega la hora */
do
{
Despliegue();
delay(tiempoRet);
tiempoActual = millis() + tiempoBase;
} while(tiempoActual < tiempoActivacion[toma]);
/* Cuando el tiempoActual 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 */
ActivaMotor();
banderaAlarma = HIGH;
do
{
// Despliegue de la hora de toma
DespliegueHoraToma();
Alarma();
} while(banderaAlarma == HIGH);
/* 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
lcd.clear();
toma++;
}
/* Función ConversionHminMs
Convierte el tiempo en horas y minutos a milisegundos */
void ConversionHminMs()
{
minuto = minuto + hora*60;
tiempoMs = minuto*60000;
}
/* Función ConversionMsHmin
Convierte el tiempo en milisegundos a horas y minutos */
void ConversionMsHmin()
{
horaActual = tiempoActual/60/60000;
minActual = tiempoActual/60000 - horaActual*60;
}
/* Función Despliegue
Despliega en un LCD la hora, con formato hora:minutos 24 h
* Pin RS del LCD al pin 4
* Pin E del LCD al pin 6
* Pin D4 del LCD al pin 11
* Pin D5 del LCD al pin 12
* Pin D6 del LCD al pin 13
* Pin D7 del LCD al pin 14
* Pin R/W del LCD a tierra */
void Despliegue()
{
// Calcula el tiempoActual con respecto al tiempoBase
tiempoActual = millis() + tiempoBase;
// Conversión del tiempoActual a horas:munutos
ConversionMsHmin();
// Se inicializa el LCD
lcd.begin(16,2);
// Se coloca el cursor en el origen
lcd.setCursor(0,0);
// Limpia el primer renglón
lcd.print(" ");
// Se coloca el cursor en el origen
lcd.setCursor(0,0);
// Escribe el letrero Hora
lcd.print("Hora ");
// Escribe horas:minutos
lcd.print(horaActual);
lcd.print(":");
lcd.print(minActual);
}
/* Función Activa Motor
Controla el motor de CD del pastillero, con base en
la señal de un interruptor de lámina activa alta */
void ActivaMotor()
{
do
{
digitalWrite(pinIN1, 1);
estadoIntLamina = digitalRead(pinIntLamina);
} while(estadoIntLamina == HIGH);
delay(200);
do
{
digitalWrite(pinIN1, 1);
estadoIntLamina = digitalRead(pinIntLamina);
} while(estadoIntLamina == LOW);
digitalWrite(pinIN1, 0);
}
/* Función Alarma
Hace sonar intermitentemente un buzzer, y al mismo tiempo
prende un led intermitentemente, hasta que se oprime el
botón de apagado de la alarma */
void Alarma()
{
for (rep = 0; rep < numRep; rep++)
{
digitalWrite(pinBuzzer, HIGH);
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, HIGH);
delay(tiempoEnc);
digitalWrite(pinBuzzer, LOW);
digitalWrite(pinLed1, LOW);
digitalWrite(pinLed2, LOW);
delay(tiempoApag);
}
delay(tiempoEspera);
}
/* Función Interruptor
Rutina de servicio de interrupción */
void Interruptor()
{
banderaAlarma = LOW;
}
/* Función DespliegueHoraToma
Despliega en el segundo renglón del LCD la hora de la toma de
las pastillas, indicando también a qué toma corresponde */
void DespliegueHoraToma()
{
Despliegue();
// Calcula el tiempo de la toma con respecto al tiempoBase
tiempoActual = tiempoActivacion[toma];
// Conversión del tiempoActual a horas:munutos
ConversionMsHmin();
// Se coloca el cursor en el origen del segundo renglón
lcd.setCursor(0,1);
// Limpia el segundo renglón
lcd.print(" ");
// Se coloca el cursor en el origen
lcd.setCursor(0,1);
// Escribe el número de la toma
lcd.print(toma+1);
// Escribe el letrero "a toma "
lcd.print("a toma ");
// Escribe horas:minutos
lcd.print(horaActual);
lcd.print(":");
lcd.print(minActual);
}
![]() |
Curso Coursera. Jesús Cruz |
4. INTEGRANTES:
- Jesús Cruz
- Jefferson Laura
no tienen el diagrama de como se conecto el arduino
ResponderBorrarpasa las respuestas de los cuestionarios
ResponderBorrar