Вы находитесь на странице: 1из 32

UNIVERSIDADE FEDERAL DE PERNAMBUCO

CENTRO DE TECNOLOGIA E GEOCIÊNCIAS


CURSO DE ENGENHARIA ELETRÔNICA
Disciplina: Microcomputadores
Professor: Mauro Rodrigues dos Santos

Grupo:

Dennis Victor Soares Lima

Mozart Castro Melo

Pedro Lyra Pereira Cabral

Ulisses Santiago Rodrigues Batista

Relatório do Projeto Final:


Aplicação em Hotelaria

RECIFE,

27 DE JUNHO DE 2010
SUMÁRIO

1 INTRODUÇÃO ....................................................................................................................... 3
2 OBJETIVO .............................................................................................................................. 4
3 DESENVOLVIMENTO.......................................................................................................... 5
3.1 Visão Geral do Projeto ...................................................................................................... 5
3.2 Controlador ....................................................................................................................... 6
3.3 Sensor de Luminosidade ................................................................................................... 8
3.4 Sensor de Temperatura ................................................................................................... 10
3.5 Motor DC ........................................................................................................................ 12
3.6 Ponte-H ........................................................................................................................... 13
3.7 PWM ............................................................................................................................... 15
3.8 Capture ............................................................................................................................ 16
3.9 Comunicação Serial ........................................................................................................ 17
3.10 Programa ....................................................................................................................... 18
4 CONCLUSÃO ....................................................................................................................... 20
5 REFERÊNCIAS .................................................................................................................... 21
APÊNDICE A – ESQUEMA COMPLETO DO CIRCUITO .................................................. 22
APÊNDICE B – CÓDIGO DO PROGRAMA ......................................................................... 23
APÊNDICE C – LISTA DE COMPONENTES E CUSTOS ................................................... 32
3

1 INTRODUÇÃO

A disciplina de Microcomputadores, obrigatória no curso de Engenharia Eletrônica da


Universidade Federal de Pernambuco, é muito importante para o futuro engenheiro em sua
formação, pois permite, além de um maior conhecimento da estrutura geral de um microcom-
putador, nos permite conhecer e ter uma boa visão do que os microcontroladores PIC são ca-
pazes de fazer. Ao final do curso de Microcomputadores, foi proposto o desenvolvimento de
uma aplicação prática. O grupo ficou com o tema Aplicação em Hotelaria.

Após uma fase inicial de estudos optou-se por utilizar a linguagem C, pois a mesma
possibilita um maior nível em comparação com o Assembly RISC do PIC, facilitando o de-
senvolvimento do programa com várias funções prontas.

Como o projeto propunha apenas os requisitos mínimos a serem utilizados, foi criada a
ideia de um sistema de controle em um hall de um hotel, pois seria necessário utilizar sensores
de luminosidade, temperatura, de presença, motor DC, assim como as funções de PWM e
Capture do PIC.

Este relatório está dividido em cinco partes. A Introdução mostra uma visão simplifi-
cada do projeto e o que ele representa a esta disciplina, no item Objetivo é mostrada a finali-
dade do relatório, na seção de Desenvolvimento apontamos passo-a-passo as etapas de reali-
zação do projeto, na Conclusão são apresentados os conhecimentos adquiridos e por fim as
referências.
4

2 OBJETIVO

Este projeto tem como objetivo o desenvolvimento de um sistema que controle o hall
de um hotel, com a função de garantir um maior conforto para os hóspedes e um melhor aten-
dimento por parte dos funcionários do estabelecimento em questão.

Através do controle de itens como a luminosidade, temperatura e presença, garante-se


uma recepção mais eficiente ao cliente e também se evita desperdícios financeiros para o do-
no do hotel, garantindo que lâmpadas e aparelhos de ar-condicionado só estejam ligados
quando necessário.

Também foi utilizado um controle manual de lâmpadas, ar-condicionado e porta, para


caso seja necessário ou até pedido por um dos clientes uma mudança de situação, o recepcio-
nista poderá ter o comando sobre estas variáveis.
5

3 DESENVOLVIMENTO

3.1 Visão Geral do Projeto

O sistema desenvolvido funciona da seguinte forma: o cliente ao chegar ao hotel, ati-


vará um sensor de presença. Com isso, deve se abrir a porta automática do hotel. Assim será
acionado um motor DC responsável pela abertura e fechamento da porta deste hall.

Constantemente, serão obtidas informações através dos sensores de luminosidade e


temperatura (localizados no interior do hall) para que, quando necessário, sejam ligadas as
lâmpadas e os aparelhos de ar-condicionado manualmente ou automaticamente.

As informações de quantas lâmpadas estão acesas, o número de aparelhos de ar-


condicionado ligados e os valores da temperatura e da luminosidade serão mostrados na tela
do computador localizado na recepção, assim como as mudanças que poderão ser realizadas
serão feitas através do computador.

A conexão do computador com o microcontrolador se dará através da comunicação


pela porta serial RS-232.

Figura 1 - Planta simplificada do hall do hotel, mostrando componentes do sistema


6

Figura 2 - Visão geral da estrutura de controle

3.2 Controlador

O modelo de controlador escolhido foi o PIC 16F877A da empresa Microchip. Este


modelo possui 40 pinos, sendo que destes 40 pinos, 7 pinos são usados para alimentação e
controle do mesmo.

Figura 3 - Foto do PIC 16F877A

 PINO 1: Suporta 3 níveis de tensão. Quando este pino estiver recebendo 5V, o micro-
controlador estará em condições de executar o programa. Quando este pino receber 0V
(GND), o PIC será “resetado”. Quando este pino receber tensão de 13,4V, o PIC irá
entrar em modo gravação.
 PINOS 11 e 32: Alimentação (máximo 5V)
 PINOS 12 e 31: Referência (GND)
 PINOS 13 e 14 : Onde estará ligado o resonador externo (cristal de clock).
7

Os demais pinos são conhecidos por I/Os (Inputs/Outputs). Estas I/Os são agrupadas
em PORTs (portas), de no máximo 8 pinos cada (limitação pois o componente possui um nú-
cleo de 8 bits).

Há um total de 33 I/Os disponíveis, que podem ser configuradas como entradas ou


saídas em tempo de execução.

Figura 4 - Esquema de Pinos do PIC 16F877A

Quando um pino é configurado como ENTRADA, ele pode ser conectado a algum
sensor para detectar sinais digitais através de variação da tensão de 0 e 5V. Quando um pino é
configurado como saída, o programa poderá acioná-lo, e com isso gerar uma corrente baixa
(max. 20 mA) com os níveis de tensão de 0V ou 5V.

Alguns pinos, porém, possuem outras funções além de serem entradas ou saídas digi-
tais. Por exemplo, pode-se observar que os pinos 2 a 10 (exceto o pino 6) são entradas analó-
gicas, e podem ser usados para detectar uma variação de tensão entre 0V e 5V, transformando
esta variação em uma informação binária de 10 bits. Os pinos 39 e 40 também são pinos usa-
dos na gravação do microcontrolador, e os pinos 25 e 26 são usados para comunicação SERI-
AL padrão RS232. Os pinos 16 e 17 são pinos geradores de pulso (PWM), que é similar a
uma saída analógica. Muito útil para controle de velocidade de motores, por exemplo. O pino
6 é um pino usado para contagem rápida.
8

3.3 Sensor de Luminosidade

Como sensor de luminosidade foi utilizado um fotoresistor, ou LDR (Light Dependent


Resistor). O LDR possui a interessante característica de ser um componente eletrônico cuja
resistência elétrica diminui quando sobre ele incide energia luminosa. Isto possibilita a utili-
zação deste componente para desenvolver um sensor que é ativado (ou desativado) quando
sobre ele incidir energia luminosa.

Figura 5 - Aspecto de um LDR

A resistência do LDR varia de forma inversamente proporcional à quantidade de luz


incidente sobre ele, isto é, enquanto o feixe de luz estiver incidindo, o LDR oferece uma re-
sistência muito baixa. Quando este feixe é cortado, sua resistência aumenta.

É composto de um material semicondutor, o sulfeto de cádmio, CdS, ou o sulfeto de


chumbo. O processo de construção de um LDR consiste na conexão do material fotossensível
com os terminais, sendo que uma fina camada é simplesmente exposta à incidência luminosa
externa.

Com o LDR pode-se fazer o controle automático de porta, alarme contra ladrão, con-
trole de iluminação em um recinto, contagem industrial, todos estes fotocontrolados para a
operação de um relé, por exemplo.

Também chamado de célula fotocondutiva, ou ainda de fotoresistência, o LDR é um


dispositivo semicondutor de dois terminais, cuja resistência varia linearmente com a intensi-
dade de luz incidente, obedecendo à equação R = C.L.a , onde L é a luminosidade em Lux, C
e a são constantes dependentes do processo de fabricação e material utilizado.

Como foi dito anteriormente o LDR tem sua resistência diminuída ao ser iluminado. A
energia luminosa desloca elétrons da camada de valência para a de condução (mais longe do
núcleo), aumentando o número destes, diminuindo a resistência.
9

Conforme aumenta a intensidade de luz incidente no LDR, um número maior de elé-


trons na estrutura tem também seu nível de energia aumentado, devido à aquisição da energia
entregue pelos fótons. O resultado é o aumento de elétrons livres e elétrons fracamente presos
ao núcleo.

Foram feitas medidas da resistência do LDR variando a intensidade de luz. Como não
se dispunha de equipamentos sofisticados para medição de intensidade luminosa, foram utili-
zados quatro níveis de luminosidade: totalmente coberto, parcialmente coberto, fracamente
iluminado e diretamente iluminado. Foram medidas as resistências para cada caso.

Figura 6 - Divisor de tensão com o LDR

Após isso montou-se um divisor de tensão com um resistor de 47kΩ. A partir disso
foram encontrados os níveis de tensão para cada caso. Sabe-se que para a conversão analógica
digital do PIC com 8 bits, de 0 a 5V corresponde a 0 a 255 em binário. Neste caso foram en-
contrados valores e determinados os níveis de luminosidade correspondentes a serem usados
no programa.

Nível de luminosidade Resistência (Ω) Tensão (V) Valor digital


Coberto 200k 1,0 51
Sombra 70k 2,0 102
Luz ambiente 25k 3,3 168
Luz direta 5k 4,5 229
Tabela 1 – Valores encontrados para o LDR

No caso da sua colocação no hall do hotel teria que se ter cuidado de que ele ficasse
em uma posição que recebesse a luz natural, mas que não fosse iluminado pelas luminárias, já
que neste caso estaria ocorrendo uma realimentação indesejada e o sistema poderia ficar a-
cendendo e apagando lâmpadas seguidamente.
10

3.4 Sensor de Temperatura

Como sensor de temperatura foi utilizado um termistor.

Termistores são resistores sensíveis a temperatura cuja função principal é exibir uma
mudança grande, previsível e precisa em resistência elétrica quando um equipamento ou pro-
duto sofrer uma mudança na temperatura de corpo.

Figura 7 - Aspecto de um termistor

Os de Coeficiente de Temperatura negativo (NTC) (Negative Temperature


Coefficient) exibem uma diminuição em resistência elétrica quando submetido a um aumento
em temperatura do equipamento e Coeficiente de Temperatura Positivo (PTC) (Positive
Temperature Coefficient) exibem um aumento em resistência elétrica quando acontece um
aumento da temperatura do termistor.

A desvantagem do termistor é que para grandes faixas de temperatura observa-se uma


não linearidade entre temperatura e resistência.

O termistor utilizado foi o 103 AT-5-TP, que tem 10kΩ a 25ºC com uma faixa de ope-
ração de -50ºC a 110ºC.

Figura 8 - Aspecto do AT-5 comercializado


11

Foi observado no data sheet do produto a tabela de valores correspondente a tempera-


turas. Como o sensor deve ser utilizado em um hotel, a faixa de operação deve ser pequena.
Escolheram-se valores entre 0ºC e 50ºC.

Figura 9 - Tabela do data sheet do termistor

Foi montado um divisor de tensão com um resistor de 10kΩ e foram encontrados os


respectivos valores de tensão.

Figura 10 - Divisor de tensão com o termistor

A partir disso foram determinados os valores correspondentes da conversão A/D e


encontrou-se uma fórmula de linearização para a faixa de operação.

Temperatura (ºC) Tensão (V) Valor Digital


0 1,3 66
10 1,8 91
25 2,5 127
40 3,1 158
50 3,5 178
Tabela 2 - Tabela de valores encontrados para o termistor
12

3.5 Motor DC

Um dos itens sugeridos para o projeto foi um motor DC, que é uma máquina elétrica
capaz de converter elétrica em energia mecânica.

Foi decidido pelo grupo que o mesmo seria utilizado para a abertura e fechamento da
porta do hotel. O motor utilizado foi o de 9V MMI-659RK (Singapore).

Figura 11 - Aspecto de um motor DC

Foram feitas medidas com o motor e observou-se que ele não é simétrico em relação a
velocidade, tensão e corrente. Os valores obtidos estão em tabelas a seguir.

VDC (V) I (mA)


1 0
2 4
3 32
4 38
5 44
6 44,2
7 44,3
8 44,3
9 44,3
Tabela 3 - Tabela com valores positivos de alimentação, motor girando no sentido anti-horário
13

VDC (V) I (mA)


-1 -30
-2 -39
-3 -48
-4 -60
-5 -85
-6 -110
-7 -120
-8 -135
-9 -160
Tabela 4 - Tabela com valores negativos de alimentação

3.6 Ponte-H

Como a ideia é controlar a abertura e fechamento de uma porta, torna-se necessário


que se possa girar o motor para os dois lados. Para isso pode-se utilizar uma ponte-h.

Apesar de não ser tão conhecida, um dos circuitos mais importantes na elaboração de
sistemas automatizados é a ponte H. Trata-se de um circuito utilizado para controlar um motor
DC a partir de sinais gerados por um microcontrolador.

Devido à disposição dos seus componentes, torna-se extremamente fácil selecionar o


sentido da rotação de um motor, apenas invertendo a polaridade sobre seus terminais.

Figura 12 - Esquema de uma ponte-h


14

Também é importante para a utilização com circuitos digitais, pois como os sinais de
saída dos microcontroladores não suportam a corrente necessária e nem possuem a tensão
adequada para acionar um motor, é necessária uma unidade de potência que possa alimentá-lo
convenientemente.

Quando ligamos um motor DC com uma bateria, observamos que ele gira numa velo-
cidade constante e numa única direção. Para alterarmos o sentido da rotação do motor, basta
apenas ligar os terminais do motor de forma invertida.

Para que não seja necessário fazer essa operação manualmente, podemos utilizar uma
ponte H. Pode-se criá-la facilmente com a finalidade de controlar o sentido da rotação de um
motor utilizando chaves simples, relés ou transistores, bastando apenas entender o seu funcio-
namento.

Uma ponte H básica é composta por 4 chaves mecânicas ou eletrônicas posicionadas


formando a letra “H”, sendo que cada uma localiza-se num extremo e o motor é posicionado
no meio.

Dependendo de como essas chaves são abertas a corrente irá fluir em um sentido ou
outro. No caso são utilizados transistores bipolares de junção dos tipos NPN e PNP como
chaves. Assim garante-se que a corrente flui no sentido desejado.

Figura 13 - Esquema de funcionamento da ponte-H

No caso da montagem percebeu-se que seria necessário utilizar transistores de maior


ganho, pois a corrente de base deve ser pequena, pois estará ligada ao PIC. Além disso o tran-
sistor deve suportar uma alta corrente de coletor, já que como visto o motor pode puxar até
160mA de corrente. Foi escolhida então uma ponte-H utilizando os transistores TIP31(NPN)
e TIP32 (PNP), como no esquema mostrado a seguir.
15

Figura 14 - Esquemático da ponte-h utilizada

3.7 PWM

Uma das vantagens de utilizar o microcontrolador 16F877A da empresa Microchip é


exatamente que ele já tem embutido um periférico de PWM, ou Pulse Width Modulation. Ele
pode ser utilizado para controlar a velocidade de um motor DC, e juntamente com a ponte-h
controlar a velocidade.

Como o PWM pode controlar a velocidade de um motor DC é mostrado a seguir. De-


pendendo de quanto tempo o ciclo fica ativo (Duty Cycle) é variado o nível DC médio e assim
controla-se a velocidade.

Figura 15 - Diagrama de tempo de um PWM


16

O controle do período do PWM é feito a partir do timer 2 do PIC, enquanto que o


tempo ativo, o Duty Cycle, pode ser controlado por uma função específica.

Figura 16 - Saída do PWM

No caso do circuito utilizado, o PWM foi colocado na base de um CI Darlington


TIP131, que suporta uma alta corrente (8 A) e tem um alto ganho (mínimo de 500). Este esta-
va ligado aonde ficaria o terra da ponte-h, de forma a controlar a corrente total que flui pelo
motor.

3.8 Capture

Este módulo tem como objetivo a contagem de tempo entre dois eventos ocorridos em
um dos pinos CCP. Para isso será utilizado como base de tempo o Timer 1 e no momento do
evento seu valor será capturado, daí o nome capture. Como o Timer 1 é de 16 bits, a captura
será feita em dois registradores: CCPRxH e CCPRxL.

Com esse recurso é possível criar um medidor de período, contando o tempo gasto, por
exemplo, entre duas bordas de subida da onda ligada ao pino CCP. É importante observar que
a captura de valor de Timer 1 não reseta o mesmo, e por isso, para definir-se o tempo real
entre duas leituras será necessário uma conta de subtração entra a última leitura e a anterior.
Esta conta deverá ser implementada pelo programa.

No programa a idéia inicial seria utilizar o captura para medir o tempo que demora até
um cliente ser atendimento no balcão da recepção do hotel, porém não foi possível implemen-
tar essa função no programa.
17

3.9 Comunicação Serial

A comunicação entre o usuário e o sistema implementado se dá através do software


RComSerial e da utilização do padrão RS-232, como mostra a figura a seguir:

Figura 17 - Esquema de ligação da porta serial do computador com ci MAX 232

Para controlar essa comunicação foi utilizado o programa RogerCom, que pode ser
encontrado na pagina HTTP://www.rogercom.com.

Figura 18 - Tela do programa RcomSerial v1.2


18

3.10 Programa

O sistema implementado tem as seguintes entradas: sensor de luminosidade (analógi-


ca), sensor de temperatura (analógica) e sensor de presença (digital) e consta com as seguintes
saídas: motor DC, luminárias e ar-condicionados.

O programa funciona da seguinte forma no modo automático: é obtido o valor da lu-


minosidade através da conversão analógica/digital e dependendo do nível de luminosidade
serão acendidas a quantidade de luminárias necessárias para o ambiente ter uma boa ilumina-
ção serão acesas.

O mesmo procedimento vale para os aparelhos de ar-condicionado, o valor da tempe-


ratura é adquirido através da conversão analógica/digital do sinal do sensor e dependendo do
nível de temperatura ele liga um ou dois ar-condicionados.

Quando o sensor de presença é ativado, ativa o maotor DC, abre a porta, verifica se o
sensor ainda está ativado, para a prevenção de acidentes e depois fecha a porta. Através do
computador, devidamente conectado ao sistema através da porta serial, padrão RS-232, o usu-
ário poderá obter o valor da temperatura, o número de luminárias acesas, o estado da porta e o
número de ar-condicionados ligados.

Já no modo manual, o recepcionista, através do computador, pode decidir o número de


ar-condicionados ligados, o número de lâmpadas acesas, abrir e fechar a porta, além de esco-
lher a velocidade da porta.

Figura 19 - Fluxograma - parte 1


19

Figura 20 - Fluxograma - parte 2


20

4 CONCLUSÃO

Este trabalho serve para complementar o aprendizado da disciplina de microcomputa-


dores. Inicialmente na cadeira foi estudado o funcionamento básico e a arquitetura de um mi-
crocomputador em geral, e após isso foi estudado o PIC, que é um microcontrolador que já
tem embutido vários componentes do microcomputador.

Foi muito importante ter um projeto de engenharia proposto e desenvolver todas as


etapas deste projeto, desde os estudos iniciais, passando pela descrição do sistema, apresenta-
ção do pré-projeto, desenvolvimento do circuito, pesquisas adicionais, compra e montagem de
componentes, testes diversos, programar o PIC, fazer a comunicação serial e finalmente ob-
servar o sistema funcionando como um todo.

Um aspecto essencial de um grande projeto como esse é dividir o projeto em blocos e


trabalhar neles de forma separada para depois juntar tudo no circuito completo. No caso, foi
necessário aprender a linguagem C aplicada a microcontroladores PIC, para em seguida de-
senvolver os blocos, como ponte-h, motor dc, sensor de temperatura, sensor de luminosidade,
comunicação serial, controle de luminárias e ar-condicionado.

Este trabalho foi muito importante, graças a ele, podemos obter um maior conheci-
mento sobre o funcionamento de microcontroladores na prática e como eles podem ser aplica-
dos no cotidiano de um hotel. Também foi importante lidar com o enorme desafio de fazer um
projeto que atendesse as especificações necessárias e ao mesmo tempo resolver, de maneira
criativa, os problemas que foram surgindo durante a realização do trabalho.

Enfim, a arquitetura genérica dos microcomputadores presente nos microcontroladores


PIC torna possível o desenvolvimento de sistemas de controle complexos, com aplicações
práticas e comerciais diversas na engenharia.
21

5 REFERÊNCIAS

ALVES, R. et al. Sistemas Digitais: Projeto Contador de Passagem. Disponivel em:


<http://www.gta.ufrj.br/grad/01_1/contador555/ldr.htm>.

BESINGA, R. W. H-Bridge Microchip PIC Microcontroller PWM Motor Controller.


Ermicroblog, 2009. Disponivel em: <http://www.ermicro.com/blog/?p=706>.

CUSTOM COMPUTER SERVICES. C Compiler Reference Manual. Brookfield. 2009.

MESSIAS, A. R. Comunicação com a Porta Serial. RogerCom, 2006. Disponivel em:


<http://www.rogercom.com/PortaSerial/PortaSerial.htm>.

PATSKO, L. F. Tutorial Montagem da Ponte H. Maxwell Bohr Instrumentação Eletrônica,


Londrina, 2006. Disponivel em:
<http://www.maxwellbohr.com.br/downloads/robotica/mec1000_kdr5000/tutorial_eletronica_
-_montagem_de_uma_ponte_h.pdf>.

PEREIRA, F. Microcontroladores PIC: Programação em C. São Paulo: Érica, 2003.

SEMITEC ISHIZUKA ELECTRONICS CORPORATION. Product Catalog. Tokyo. 2005.

SILVA JUNIOR, V. P. Linguagem C para microcontroladores PIC. [S.l.]: Vidal Projetos


Personalizados, 1999.

SOUZA, D. J.; LAVINIA, N. C. Conectando o PIC 16F877A: Recursos Avançados. São


Paulo: Érica.
22

APÊNDICE A – ESQUEMA COMPLETO DO CIRCUITO


23

APÊNDICE B – CÓDIGO DO PROGRAMA

/*
Universidade Federal de Pernambuco
Centro de Tecnologia e Geociências
Curso de Engenharia Eletrônica
Projeto Final de Microcomputadores
Professor: Mauro

Grupo:
Dennis Victor Soares Lima
Mozart Castro Melo
Pedro Lyra Pereira Cabral
Ulisses Santiago Rodrigues Batista
--------------------------------------------------
Projeto proposto:

Aplicação em Hotelaria:
1- Pelo menos duas variáveis analógicas (Temperatura e Luminosidade);
2- Função do PIC – PWM e Capture;
3- Sensor de Presença (Digital);
4- Motor DC;

--------------------------------------------------
Lê o valor da luminosidade através da conversão analógica/digital;

Dependendo do nível de luminosidade (determinado experimentalmente) serão acendidas 1,2,3 ou 4 luminárias;

Lê o valor de temperatura através da conversão analógica/digital do sinal do sensor;

A partir de uma fórmula experimental se encontra o valor real de temperatura;

Dependendo do nível de temperatura ele liga um ou dois ar-condicionados;

Quando o sensor de presença é ativado, ativa o motor o DC, abre a porta, verifica o sensor e depois fecha a porta;

O sistema deve ter uma interface com o computador através da porta serial, padrão RS-232;

O usuário pode observar valor de temperatura, número de luminárias acesas, número de ar-condicionados acesos,
estado da porta;

Deve ter um sistema que captura o estado do tempo para ver o tempo que demora ao cliente ser atendido;

---------------------------------------------------------------------
*/

#include <16F877A.h>

#device adc=8

#FUSES NOWDT //No Watch Dog Timer


#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
24

#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
//#FUSES WRT_50% //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#include <stdio.h>

//Define nomes de Pinos e constantes


#define nivel_luz_1 75 //CONSTANTE DE ILUMINAÇÃO 1
#define nivel_luz_2 135 //CONSTANTE DE ILUMINAÇÃO 2
#define nivel_luz_3 200 //CONSTANTE DE ILUMINAÇÃO 3
#define nivel_temperatura 21 //Define o nivel de temperatura
#define ar1 pin_b2 //AR CONDICIONADO 1
#define ar2 pin_b1 //AR CONDICIONADO 2
#define lamp1 pin_d0 //LÂMPADA 1
#define lamp2 pin_d1 //LÂMPADA 2
#define lamp3 pin_d2 //LÂMPADA 3
#define lamp4 pin_d3 //LÂMPADA 4
#define fimdecurso_abre pin_d4 //Sensor de fim de curso que mostra quando a porta abre
#define fimdecurso_fecha pin_d5 //Sensor de fim de curso que mostra quando a porta fecha
#define ponteh1 pin_d6 //abre a ponte-h em um sentido
#define ponteh2 pin_d7 //abre a ponte-h em outro sentido
#define operacao pin_e0 //indicador de operacao (ligado/desligado)
#define presenca pin_b0 //pino RB0 ligado ao sensor de presença

//Prototipos de rotinas

void detecta_presenca(void);
void abre_porta(void);
void espera_porta(void);
void fecha_porta(void);
void verifica_luminosidade(void);
void compara_luminosidade (void);
void verifica_temperatura (void);
void compara_temperatura (void);
void controle_luminosidade (void);
void controle_ar (void);
void controle_porta (void);
void controle_pwm (void);

//Definicao de variaveis
unsigned int temperatura;
unsigned int luminosidade;
unsigned int N_lampada=0,N_ar=0;
int modo_operacao;

//define a interrupção externa pelo pino RB0


#int_ext
void detecta_presenca() //funcao ativada pela interrupcao
{
int sensor=0; //define variaveis locais
int porta_aberta=0;
25

int porta_fechada=0;

printf("\r\nInicio de interrupcao externa\r\n");


sensor=input_state(presenca); //sensor igual a 1 quando o pino rb0 esta ativo

do
{
abre_porta(); //chama a funcao abre porta
porta_aberta=input_state(fimdecurso_abre); //pega o valor do fim de curso
}while(porta_aberta==0); //continua abrindo ate atingir o fim de curso
do
{
espera_porta(); //apos abrir aguarda
sensor=input_state(presenca); //espera que o sensor de presenca fique baixo
}while(sensor==1);
do
{
fecha_porta(); //fecha porta
porta_fechada=input_state(fimdecurso_fecha); //pega o valor do fim de curso
}while(porta_fechada==0); //continua fechando ate atingir o fim de curso
espera_porta();
}

//interrupcao serial
#INT_RDA
void recebe_serial()
{
modo_operacao=getc();
printf("\r\nInterrupcao serial\r\n");
}

//funcao abre porta, gira motor em um sentido


void abre_porta()
{
output_high(ponteh1);
output_low(ponteh2);
}

//funcao espera porta, para motor


void espera_porta()
{
output_low(ponteh1);
output_low(ponteh2);
}

//funcao fecha porta, gira motor no outro sentido


void fecha_porta()
{
output_low(ponteh1);
output_high(ponteh2);
}

//funcao converte A/D de luminosidade


void verifica_luminosidade()
{
setup_adc(ADC_CLOCK_INTERNAL); //CONFIGURA A CONVERSÃO AD
set_adc_channel(3); //HABILITA A CONVERSÃO PELO PINO A3
delay_ms(100); //TEMPO NESCESSÁRIO PARA CONVERSÃO AD
26

luminosidade=read_adc(); //VARIÁVEL QUE MOSTRA A LUMINOSIDADE


}

//Compara o nivel de luminosidade e acende lampadas


void compara_luminosidade()
{
if(luminosidade<nivel_luz_1) //Se o nivel de luz for menor que o nivel de luz 1
{
output_high(lamp1); //acende 4 lampadas
output_high(lamp2);
output_high(lamp3);
output_high(lamp4);
N_lampada=4;
}
else if ((luminosidade<=nivel_luz_2)&&(luminosidade>nivel_luz_1))
//se o nivel de luz estiver entre o nivel 1 e o nivel 2
{
output_high(lamp1); //acende 3 lampadas
output_high(lamp2);
output_low(lamp3);
output_high(lamp4);
N_lampada=3;
}
else if ((luminosidade<=nivel_luz_3)&&(luminosidade>nivel_luz_2))
//se o nivel de luz estiver entre o nivel de luz 2 e o 3
{
output_low(lamp1); //acende 2 lampadas
output_high(lamp2);
output_low(lamp3);
output_high(lamp4);
N_lampada=2;
}
else
//caso contrario, se estiver acima do nivel 3
{
output_low(lamp1); //acende 1 lampada apenas
output_low(lamp2);
output_high(lamp3);
output_low(lamp4);
N_lampada=1;
}
}

//funcao converte A/D sinal de temperatura


void verifica_temperatura()
{
unsigned int temporario;
setup_adc(ADC_CLOCK_INTERNAL); //CONFIGURA A CONVERSÃO AD
set_adc_channel(1); //HABILITA A CONVERSÃO PELO PINO A1
delay_ms(100); //TEMPO NESCESSÁRIO PARA CONVERSÃO AD
temporario=read_adc(); //Variavel temporario
temperatura=0.42*(temporario-66); //Formula para conversao da temperatura
//Determinada Experimentalmente
}

//funcao para comparar temperatura com nivel e ligar ar-condicionados


void compara_temperatura() //funcao para testar a temperatura
27

{
if (temperatura>nivel_temperatura) //se a temperatura for maior que certo nivel
{
OUTPUT_high(ar1); //liga o ar1 e ar2
OUTPUT_high(ar2);
N_ar=2;
}
else
{
OUTPUT_high(ar1); //caso contrario, liga ar1 e desliga ar2
OUTPUT_low(ar2);
N_ar=1;
}
}

//funcao para controle manual das lampadas


void controle_luminosidade()
{
printf("\r\nDigite o numero de lampadas que deseja acender (0, 1, 2, 3 ou 4).\r\n");
switch(getch())
//funcao que recebe um valor e acende o numero correspondente de lampadas
{
case '4':
{
output_high(lamp1); //acende 4 lampadas
output_high(lamp2);
output_high(lamp3);
output_high(lamp4);
N_lampada=4;
break;
}
case '3':
{
output_high(lamp1); //acende 3 lampadas
output_high(lamp2);
output_low(lamp3);
output_high(lamp4);
N_lampada=3;
break;
}
case '2':
{
output_low(lamp1); //acende 2 lampadas
output_high(lamp2);
output_low(lamp3);
output_high(lamp4);
N_lampada=2;
break;
}
case '1':
{
output_low(lamp1); //acende 1 lampada
output_low(lamp2);
output_high(lamp3);
output_low(lamp4);
N_lampada=1;
break;
}
case '0':
28

{
output_low(lamp1); //apaga todas as lampadas
output_low(lamp2);
output_low(lamp3);
output_low(lamp4);
N_lampada=0;
break;
}
}
}

//funcao para controle manual do ar-condicionado


void controle_ar()
{
printf("\r\nDigite o numero de ar-condicionados que deseja ligar (0,1 ou 2):\r\n");
switch(getch()) //recebe um valor e acende o numero correspondente de ar-condicionado
{
case '2':
{
OUTPUT_high(ar1); //liga o ar1 e ar2
OUTPUT_high(ar2);
N_ar=2;
break;
}
case '1':
{
OUTPUT_high(ar1); //caso contrario, liga ar1 e desliga ar2
OUTPUT_low(ar2);
N_ar=1;
break;
}
case '0':
{
output_low(ar1); //desliga ar1 e ar2
output_low(ar2);
N_ar=0;
break;
}
default:
{
printf("\r\nNumero invalido\r\n");
}
}
}

//funcao para controle manual da porta


void controle_porta()
{
int porta_aberta=0; //define variaveis locais
int porta_fechada=0;
printf("\r\nVoce deseja abrir (a) ou fechar (f) a porta?\r\n");

switch (getch()) //recebe um comando para abrir ou fechar


{
case 'a': //caso for a
{
do //faz enquanto não atinge o fim de curso
{
abre_porta(); //chama a funcao abre porta
29

porta_aberta=input_state(fimdecurso_abre); //pega o valor do fim de curso


}while(porta_aberta==0); //continua abrindo ate atingir o fim de curso
espera_porta(); //desliga o motor
break;
}
case 'f': //caso for f
{
do //faz enquanto não atinge o fim de curso
{
fecha_porta(); //fecha porta
porta_fechada=input_state(fimdecurso_fecha); //pega o valor do fim de curso
}while(porta_fechada==0); //continua fechando ate atingir o fim de curso
espera_porta(); //desliga motor
break;
}
default:
{
printf("\r\nOperacao Invalida\r\n");
break;
}
}
}

//controle do PWM
void controle_pwm()
{
long int ciclo=0; //cria a variavel long int ciclo
long int porcentagem=0; // variavel porcentagem

setup_ccp1(CCP_PWM); //Coloca o CCP1 (RC2) como PWM


set_pwm1_duty(0); //Determina o duty cicle inicial
setup_timer_2(T2_DIV_BY_4, 250, 1); //Ajusta o timer 2
//uma observacao importante: O set_pwm1_duty() deve ir antes do setup_timer_2
//Caso contrario, nao funciona e fica em zero o pino

printf("\r\nDigite o nivel de velocidade desejado (0-4)\r\n");


switch (getch()) //recebe um comando numerico pela serial
{
case '0': ciclo=0; break;
case '1': ciclo=102; break;
case '2': ciclo=256; break;
case '3': ciclo=512; break;
case '4': ciclo=1000; break;

}
set_pwm1_duty(ciclo); //seta o duty do pwm como valor do ciclo
setup_timer_2(T2_DIV_BY_4, 250, 1); //Deve ajustar o timer 2 apos isso
porcentagem=ciclo/10.24; //Da o valor do duty em percentual do tempo
printf("\r\nO Duty Cicle esta em %Lu %c\r\n",porcentagem,'%');
}

//funcao main do programa


void main()
{
Output_high(operacao); //LED INDICATIVO DE FUNCIONAMENTO DO SISTEMA
setup_adc_ports(AN0_AN1_AN3); //HABILITA A CONVERSÃO AD-DA
setup_adc(ADC_CLOCK_DIV_8); //CONFIGURA O TIMER DE CONTROLE DA CONVERSÃO
30

enable_interrupts(int_ext); //habilita a interrupcao externa do pin_b0


enable_interrupts(global); //habilita interrupcao global
enable_interrupts(int_rda); //habilita interrupcao serial
ext_int_edge(L_TO_H); //interrupcao externa na subida

printf("\r\nSistema inicializado.\r\n");
modo_operacao='m';
while(modo_operacao=='m')
{
disable_interrupts(int_ext);
disable_interrupts(int_rda);

printf("\r\nModo manual ativado.\r\n");


printf("\r\nOpcoes:\r\n");
printf("\r\nVerificar dados (d)\r\n");
printf("\r\nAcender Lampadas (l)\r\n");
printf("\r\nControle de ar-condicionado (c)\r\n");
printf("\r\nControle de Porta (p)\r\n");
printf("\r\nControle de Velocidade (v)\r\n");
printf("\r\nAtiva o automatico (a)\r\n");
switch(getch())
{
case 'd':
{
verifica_luminosidade ();
verifica_temperatura();
printf("\r\nTemperatura atual:%u",temperatura);
printf("\r\nLuminosidade atual:%u",luminosidade);
printf("\r\nNumero de lampadas:%u",N_lampada);
printf("\r\nNumero de ar-condicionados ligados: %u\r\n",N_ar);
break;
}
case 'l':
{
controle_luminosidade();
break;
}
case 'c':
{
controle_ar();
break;
}
case 'p':
{
controle_porta();
break;
}
case 'a':
{
modo_operacao='a';
break;
}
case 'v':
{
controle_pwm();
}
default:
{
printf("\r\nCaracter invalido\r\n");
31

break;
}

}
while((modo_operacao=='a')||(modo_operacao!='m'))
{
setup_ccp1(CCP_OFF);
output_high(pin_c2);

enable_interrupts(int_rda); //habilita interrupcao serial


enable_interrupts(int_ext);

verifica_luminosidade();
compara_luminosidade();
verifica_temperatura();
compara_temperatura();
printf("\r\nTemperatura atual:%u \r\n",temperatura);
printf("\r\nLuminosidade atual:%u \r\n",luminosidade);
printf("\r\nNumero de lampadas:%u \r\n",N_lampada);
printf("\r\nNumero de ar-condicionados ligados: %u\r\n",N_ar);
printf("\r\nPressione 'm' para ativar o modo manual.\r\n");

delay_ms(5000); //da um atraso de 5s


}
}

}
32

APÊNDICE C – LISTA DE COMPONENTES E CUSTOS

Componente Quantidade Preço por unidade Preço Total


Resistores 1/8W
10k 4 0,11 0,44
1k 3 0,11 0,33
100 2 0,11 0,22
56k 2 0,11 0,22
220 6 0,11 0,66
470 1 0,11 0,11

Capacitores
Eletrolítico 1uF 4 0,60 2,4

PIC16F877A 1 27,78 27,78

Transistores
BC547 - NPN 4 0,21 0,84
TIP31 - NPN 2 1,57 3,14
TIP32 - PNP 2 1,82 3,64
TIP132 - Darlington - NPN 1 2,81 2,81

Cristal 4MHz 1 2,60 2,6

Chave 5 1,96 9,8

LED 7 0,20 1,4

LDR 1 2,11 2,11

Termistor NTC 10k 1 3,03 3,03

CI MAX 232 1 3,79 3,79

Motor DC 9V 1 4,75 4,75

TOTAL 70,07