Anda di halaman 1dari 18

Universidad Nacional Federico Villarreal FIEI Ing.

Informtica

Escuela Profesional de Ingeniera


Informtica

Laboratorio de Electrnica II
VI Ciclo

Laboratorio N 4

Mquinas de Estado Memoria


EEPROM

Integrantes
Apellidos y Nombres Cdigo
Villena Jimenez William A. 2013011913
Quispe Vsquez Vctor R. 2013235198

Fecha de realizacin del laboratorio:

2017 - II
Ing. Rubn Gil Chacaltana 1
Universidad Nacional Federico Villarreal FIEI Ing. Informtica

Procedimiento

Caso de Estudio 1

1. Realizar un sistema de alarma de temperatura basado en el


sensor LM35.
El sistema electrnico deber presentar las siguientes
caractersticas:
El ingreso del Set Point deber ser mediante un teclado
matricial de 4X3.
El sistema electrnico deber estar en la capacidad de
almacenar el set point en la memoria EEPROM.
El usuario tendr opcin de borrar dgitos.
La temperatura deber ser mostrada en todo momento en
el LCD.
El sistema electrnico deber estar en la capacidad de
cambiar la unidad de visualizacin (C o F).

Entregables:
Cdigo.
Esquemtico.
Evidencias de funcionamiento.
Diagrama de bloques de la mquina de estados.
Circuito Funcional.
Plazo de entrega 2 semanas.

Ing. Rubn Gil Chacaltana 2


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

CODIGO ARDUINO:

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <string.h>

const byte FILAS = 4; //N de Filas


const byte COLUM = 4; //N de Columnas

//(RS, EN, D4, D5, D6, D7);


LiquidCrystal lcd(24, 26, 28, 30, 32, 34);

//Caracter de Grados
byte grado[8] =
{
0b00001100,
0b00010010,
0b00010010,
0b00001100,
0b00000000,
0b00000000,
0b00000000,
0b00000000
};

char T_Keys[FILAS][COLUM] = {
{'1','2','3','U'},
{'4','5','6','D'},
{'7','8','9','N'},
{'C','0','M','E'}
};

//Pines usados por el Teclado multiplexado


//F1, F2, F3, F4
//C1, C2, C3, C4
byte filPin[FILAS] = {38, 40, 42, 44}; // Asignacin de pines de arduino
para las filas del teclado.
byte colPin[COLUM] = {46, 48, 50, 52}; // Asignacin de pines de arduino
para las columnas del teclado.

//Inicializar Instancia E/S del Keypad


Keypad keypad = Keypad(
makeKeymap(T_Keys),filPin,colPin,FILAS,COLUM);

Ing. Rubn Gil Chacaltana 3


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

byte estado = 1; //Variable para guardar el estado


char key; //variable para obtener tecla presionada
byte poscur; //variable para posicion de cursor en menus
float temp; //variable para medir la temperatura

char ingreso[4] = ""; //variable para guardar


byte posicion;

//Variables de Configuracion
bool unidad;
bool beep = true;
byte setPoint;

byte op1; //Variable de auxilio

byte pinLM35 = 14;


byte leds = 9;
byte l_lcd = 6;

void setup() {
Serial.begin(9600);
lcd.begin(16,2);
pinMode(leds,OUTPUT);
pinMode(l_lcd,OUTPUT);
digitalWrite(l_lcd, HIGH);

//Asignando valor creado al LCD


lcd.createChar(1, grado);

simular();
inicializar(); //Inicializar las variables de configuracion desde la
EEPROM

if (setPoint > 0)
{
estado = 1;
}

pantalla(1); //Inicializando los sensores los Sensores


}

Ing. Rubn Gil Chacaltana 4


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

void loop()
{
switch(estado)
{
case 1: reset();
pantalla(2);
while(1)
{
//Mostrando Temperatura
mostrarTemp();
key = keypad.getKey();
if (key != NO_KEY)
{
//(Pin,Frecuencia(Hz),Duracion(milisegundos))
tono(beep);
if (key == 'M')
{
estado = 2;
break;
}
}
}
break;

// Estados del Menu de Configuracion

case 2:
{
pantalla(3);
bool salir = true;
while(salir)
{
key = keypad.getKey();
if (key != NO_KEY)
{
tono(beep);
switch(key)
{
case 'U': cursor('1',2);
break;
case 'D': cursor('2',2);
break;
case 'E': switch(poscur)
{

Ing. Rubn Gil Chacaltana 5


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

case 1: estado = 3;
salir = false;
continue;

case 2: estado = 4;
salir = false;
continue;
}
break;
case 'M': estado = 1;
salir = false;
continue;
}
}
}
break;
}
case 3:
{
bool salir = true;
posicion = 0;
pantalla(8);
int valor = 0;

while(salir)
{
key = keypad.getKey();
if (key != NO_KEY)
{
tono(beep);
switch(key)
{
case 'U': case 'D': break;

case 'N': posicion = 0;


//ingreso[0] = "\0";
memset(ingreso, 0, 4);
valor = 0;
lcd.setCursor(9,1);
lcd.print(" ");
break;

case 'C': posicion--;


ingreso[posicion] = "\0";

Ing. Rubn Gil Chacaltana 6


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

lcd.setCursor(posicion + 11,1);
lcd.print(" ");
lcd.setCursor(posicion + 11,1);
break;

case 'M': estado = 2;


posicion = 0;
salir = false;
continue;

case 'E': if(posicion != 0)


{
valor = atoi(ingreso);

if (valor > 150)


{
pantalla(9);
estado = 3;
posicion = 0;
salir = false;
continue;
}

if(setPoint != valor)
{
setPoint = valor;
guardar(1);
estado = 2;
posicion = 0;
salir = false;
continue;
}
else
{
estado = 2;
posicion = 0;
salir = false;
continue;
}
}
break;

default: if (posicion < 3)


{

Ing. Rubn Gil Chacaltana 7


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

ingreso[posicion] = key;
lcd.setCursor((posicion + 11),1);
lcd.print(key);
posicion++;
}
break;
}
}
}
break;
}

case 4:
{
pantalla(6);
op1 = unidad;
pantalla(7);
bool salir = true;

while(salir)
{
key = keypad.getKey();
if (key != NO_KEY)
{
tono(beep);
switch(key)
{
case 'U': op1 = !op1;
pantalla(7);
break;
case 'D': op1 = !op1;
pantalla(7);
break;
case 'E': if (op1 == unidad)
{
estado = 2;
salir = false;
continue;
}
else
{
unidad = op1;
guardar(1);
estado = 2;

Ing. Rubn Gil Chacaltana 8


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

salir = false;
continue;
}
case 'M': estado = 2;
salir = false;
continue;
}
}
}
break;
}
}
}

void reset()
{
digitalWrite(leds,LOW);
posicion = 0;
}

void inicializar()
{
unidad = EEPROM.read(7);
setPoint = EEPROM.read(8);
}

void guardar(byte lugar)


{
switch(lugar)
{
case 1: EEPROM.write(7,unidad);
break;
case 2: EEPROM.write(8,setPoint);
break;
}
}

void simular()
{
int aux;
EEPROM.write(7,0);
EEPROM.write(8,45);
}

Ing. Rubn Gil Chacaltana 9


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

void mostrarTemp()
{
//leer el sensor en A14
temp = analogRead(pinLM35);
//Calcular la temperatura con la formula
temp = (5.0 * temp * 100.0) / 1024.0;

//Convertir a Farenheit segun unidad (0 = Celsius, 1 = Farenheit)


if (unidad)
{
temp = (temp * 1.8) + 32;
}

if (temp > setPoint)


{
beep = false;
digitalWrite(leds, HIGH);
tone(12,2000);
}
else
{
beep = true;
digitalWrite(leds, LOW);
noTone(12);
}

//Dibujar en pantalla el valor de la Temperatura


if (temp > 100)
lcd.setCursor(3,1);
else
if (temp > 10)
lcd.setCursor(4,1);
else
lcd.setCursor(5,1);

lcd.print(String(temp) + " ");


lcd.write(1);

//Imprimir la unidad en base a la configuracion


if (unidad)
lcd.print("F");
else
lcd.print("C");
}

Ing. Rubn Gil Chacaltana 10


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

//Funcion para determinar si se genera um


//pitido al presionar las teclas o no

void tono(bool caso)


{
if (caso == true)
tone(12,3000,100);
}

//Funcion para escrituras en la pantalla


//LCD en general

void pantalla(byte num)


{
switch(num)
{
case 1: lcd.setCursor(1,0);
lcd.print("Inicializando");
lcd.setCursor(3,1);
lcd.print("Espere");

for (int i = 0; i < 3; i++)


{
lcd.print(".");
delay(200);
}
break;

case 2: lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Temperatura: ");
lcd.setCursor(0,1);
lcd.print("-> <-");
break;

//Mensajes de los Menus


case 3: lcd.clear();
cursor('0',4);
lcd.setCursor(1,0);
lcd.print("Conf. setPoint");
lcd.setCursor(1,1);
lcd.print("Conf. Unidad T");
break;

Ing. Rubn Gil Chacaltana 11


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

case 6: lcd.clear();
lcd.print("Unidad de Temp a");
lcd.setCursor(0,1);
lcd.print("registrar: ");
break;

case 7: if(op1 == 0)
{
lcd.setCursor(12,1);
lcd.write(1);
lcd.print("C");
}
else
{
lcd.setCursor(12,1);
lcd.write(1);
lcd.print("F");
}
break;

case 8: lcd.clear();
lcd.print("Ingrese valor de");
lcd.setCursor(0,1);
lcd.print("setPoint: ");
break;

case 9: lcd.clear();
lcd.print("Temp. fuera de");
lcd.setCursor(0,1);
lcd.print("Rango del Sensor");
delay(2000);
break;

// case XX:break;
}
}

//Funcion para mover el cursor en la seleccion


//de opciones del menu

void cursor(char dir, byte item)


{
switch(dir)

Ing. Rubn Gil Chacaltana 12


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

{
//Posicionando el Cursor al entrar al menu
case '0': lcd.setCursor(0,0);
lcd.print(">");
poscur = 1;
break;

//tecla arriba pulsada


case '1': if (poscur == 1)
{
poscur = item;
if(poscur % 2 == 0)
dibujo(false);
else
dibujo(true);
}
else
{
poscur--;
if(poscur % 2 == 0)
dibujo(false);
else
dibujo(true);
}
break;

//tecla abajo pulsada


case '2': if (poscur == item)
{
poscur = 1;
if(poscur % 2 == 0)
dibujo(false);
else
dibujo(true);
}
else
{
poscur++;
if(poscur % 2 == 0)
dibujo(false);
else
dibujo(true);
}
break;

Ing. Rubn Gil Chacaltana 13


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

}
}

//Funcin de Auxilio de Cursor


void dibujo(bool tipo)
{
if(tipo){
lcd.setCursor(0,0);
lcd.print(">");
lcd.setCursor(0,1);
lcd.print(" ");
}
else{
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(">");
}
}

PROTEUS

Ing. Rubn Gil Chacaltana 14


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

Ing. Rubn Gil Chacaltana 15


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

Pulsando M se ingresa al men de configuracin:

Las teclas U es arriba, D es abajo, E enter. Sabiendo eso ingresamos a


la configuracin de la unidad de temperatura:

Ing. Rubn Gil Chacaltana 16


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

Configuracin del setpoint:

Ing. Rubn Gil Chacaltana 17


Universidad Nacional Federico Villarreal FIEI Ing. Informtica

ARMADO FISICO:

Ing. Rubn Gil Chacaltana 18

Anda mungkin juga menyukai