FASE 3 (Semana 3): Proyecto Pastillero Inteligente
tarea asignada en laboratorio(link explicación)
https://www.youtube.com/watch?v=1VD-X1Zs6KM
programa
long tiempoMs;
long tiempoBase;
long tiempoActual;
long hora;
long minuto;
long horaActual;
long minActual;
long horaToma=11;
long minToma=30;
long cadaHoraTiempo=0;
long cadaMinTiempo=1;
long segActual;
int tiempoRet = 500;
int inicio=0;
int pinBuzzer = 15;
int pinLed1 = 16;
int pinLed2 = 17;
int pinBoton= 2;
boolean banderaAlarma = HIGH;
int rep;
int numRep = 2;
int numRepPastilla = 3;
int tiempoEnc = 400;
int tiempoApag = 50;
int tiempoEspera = 1000;
int pinIntLamina = 5;
int pinIN1 = 7;
int pinIN2 = 8;
int pinPWM = 9;
boolean estadoIntLamina;
int valorPWM = 230;
int iempoActual;
long tiempoActivacion[5];
int toma = 0;
// 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 = 11;
minuto = 29;
// Cálculo tiempo base
ConversionHminMs();
tiempoBase = tiempoMs;
// Configuración del número de columnas y renglones del LCD
lcd.begin(16,2);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinBoton, INPUT);
attachInterrupt(0, Interruptor, RISING);
pinMode(pinIN1, OUTPUT);
pinMode(pinIN2, OUTPUT);
pinMode(pinIntLamina, INPUT);
tiempoActivacion[0] = 30000;
tiempoActivacion[1] = 60000;
tiempoActivacion[2] = 120000;
tiempoActivacion[3] = 240000;
tiempoActivacion[4] = 24*60*60000;
}
// Función loop
void loop()
{
tiempoActual = millis() + tiempoBase;
// Conversión del tiempoActual a horas:munutos:segundos
ConversionMsHmin();
if(inicio==0)
{DespliegueSaludo();
inicio=1;
}
// Despliegue de la hora
Despliegue
();
Proximatoma();
// Deja pasar cerca de un segundo
delay(tiempoRet);
}
// Función
void DespliegueSaludo()
{
lcd.setCursor(0,0);
// Limpia el primer renglón
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Hola somos");
lcd.setCursor(0,1);
lcd.print("Ach. y Ven.");
delay(3000);
}
// Función ConversionHminMs
void ConversionHminMs()
{
minuto = minuto + hora*60;
tiempoMs = minuto*60000;
}
// Función ConversionMsHmin
void ConversionMsHmin()
{
horaActual = tiempoActual/60/60000;
minActual = tiempoActual/60000 - horaActual*60;
segActual = tiempoActual/1000 - horaActual*60*60 -
minActual*60;
}
// Función Despliegue
void Despliegue()
{
// 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:segundos
lcd.print(horaActual);
lcd.print(":");
lcd.print(minActual);
lcd.print(":");
lcd.print(segActual);
if(horaActual==horaToma && minActual==minToma){
moverMotor();
horaToma+=cadaHoraTiempo;
minToma+=cadaMinTiempo;
lcd.setCursor(0,0);
lcd.print(" Tome su ");
lcd.setCursor(0,1);
lcd.print(" pastilla!!! ");
timbrar();
}
}
void timbrar(){
banderaAlarma = HIGH;
for(int i = 0 ;i< numRepPastilla ;i++)
Alarma();
}
void Proximatoma(){
lcd.setCursor(0,1);
lcd.print("Prox toma ");
lcd.print(horaToma);
lcd.print(":");
lcd.print(minToma);
}
void moverMotor(){
digitalWrite(pinIN1, 0);
digitalWrite(pinIN2, 0);
analogWrite(pinPWM, valorPWM);
do
{
tiempoActual = millis();
} while(tiempoActual < tiempoActivacion[toma]);
activaMotor();
toma++;
if(toma==3){
toma=0;
}
}
// Función 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
void Interruptor()
{
banderaAlarma = LOW;
}
//funcion activa motor
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);
}
foto del circuito en protoboardlong tiempoBase;
long tiempoActual;
long hora;
long minuto;
long horaActual;
long minActual;
long horaToma=11;
long minToma=30;
long cadaHoraTiempo=0;
long cadaMinTiempo=1;
long segActual;
int tiempoRet = 500;
int inicio=0;
int pinBuzzer = 15;
int pinLed1 = 16;
int pinLed2 = 17;
int pinBoton= 2;
boolean banderaAlarma = HIGH;
int rep;
int numRep = 2;
int numRepPastilla = 3;
int tiempoEnc = 400;
int tiempoApag = 50;
int tiempoEspera = 1000;
int pinIntLamina = 5;
int pinIN1 = 7;
int pinIN2 = 8;
int pinPWM = 9;
boolean estadoIntLamina;
int valorPWM = 230;
int iempoActual;
long tiempoActivacion[5];
int toma = 0;
// 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 = 11;
minuto = 29;
// Cálculo tiempo base
ConversionHminMs();
tiempoBase = tiempoMs;
// Configuración del número de columnas y renglones del LCD
lcd.begin(16,2);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinBoton, INPUT);
attachInterrupt(0, Interruptor, RISING);
pinMode(pinIN1, OUTPUT);
pinMode(pinIN2, OUTPUT);
pinMode(pinIntLamina, INPUT);
tiempoActivacion[0] = 30000;
tiempoActivacion[1] = 60000;
tiempoActivacion[2] = 120000;
tiempoActivacion[3] = 240000;
tiempoActivacion[4] = 24*60*60000;
}
// Función loop
void loop()
{
tiempoActual = millis() + tiempoBase;
// Conversión del tiempoActual a horas:munutos:segundos
ConversionMsHmin();
if(inicio==0)
{DespliegueSaludo();
inicio=1;
}
// Despliegue de la hora
Despliegue
();
Proximatoma();
// Deja pasar cerca de un segundo
delay(tiempoRet);
}
// Función
void DespliegueSaludo()
{
lcd.setCursor(0,0);
// Limpia el primer renglón
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Hola somos");
lcd.setCursor(0,1);
lcd.print("Ach. y Ven.");
delay(3000);
}
// Función ConversionHminMs
void ConversionHminMs()
{
minuto = minuto + hora*60;
tiempoMs = minuto*60000;
}
// Función ConversionMsHmin
void ConversionMsHmin()
{
horaActual = tiempoActual/60/60000;
minActual = tiempoActual/60000 - horaActual*60;
segActual = tiempoActual/1000 - horaActual*60*60 -
minActual*60;
}
// Función Despliegue
void Despliegue()
{
// 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:segundos
lcd.print(horaActual);
lcd.print(":");
lcd.print(minActual);
lcd.print(":");
lcd.print(segActual);
if(horaActual==horaToma && minActual==minToma){
moverMotor();
horaToma+=cadaHoraTiempo;
minToma+=cadaMinTiempo;
lcd.setCursor(0,0);
lcd.print(" Tome su ");
lcd.setCursor(0,1);
lcd.print(" pastilla!!! ");
timbrar();
}
}
void timbrar(){
banderaAlarma = HIGH;
for(int i = 0 ;i< numRepPastilla ;i++)
Alarma();
}
void Proximatoma(){
lcd.setCursor(0,1);
lcd.print("Prox toma ");
lcd.print(horaToma);
lcd.print(":");
lcd.print(minToma);
}
void moverMotor(){
digitalWrite(pinIN1, 0);
digitalWrite(pinIN2, 0);
analogWrite(pinPWM, valorPWM);
do
{
tiempoActual = millis();
} while(tiempoActual < tiempoActivacion[toma]);
activaMotor();
toma++;
if(toma==3){
toma=0;
}
}
// Función 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
void Interruptor()
{
banderaAlarma = LOW;
}
//funcion activa motor
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);
}
Comentarios
Publicar un comentario