automaÇÃo residencial: uma anÁlise teÓrico …educatec.eng.br/engenharia/monografia de...
TRANSCRIPT
1
PONTIFÍCIA UNIVERSIDADE CATÓLICA DO RIO GRANDE DO SUL
FACULDADE DE ENGENHARIA
CURSO DE ENGENHARIA ELÉTRICA
DISCIPLINA DE TRABALHO DE INTEGRAÇÃO
AUTOMAÇÃO RESIDENCIAL: UMA ANÁLISE
TEÓRICO-PRÁTICA
BRUNO SCHWAB DE FIGUEIREDO
JÚLIO CÉSAR DE MARQUES LIMA
Porto Alegre, Novembro de 2005.
2
Dedicatória
Dedico este trabalho aos meus pais, por todo o apoio incondicional oferecido a mim
durante todo o curso de Engenharia Mecatrônica, bem como a todos os funcionários e
professores da Pontifícia Universidade Católica do Rio Grande do Sul, que muito
contribuíram para o meu crescimento intelectual bem como minha formação acadêmica.
3
Agradecimentos
Agradeço ao meu professor orientador, Júlio César Marques de Lima, por todo o
desempenho e dedicação oferecidos a mim durante a realização deste trabalho. Também
agradeço aos meus colegas de curso, sempre presentes nos momentos mais difíceis durante
esta jornada, oferecendo não só conhecimento, mas também companheirismo e
fraternidade.
Agradeço especialmente a Deus, por ter me dado todas as oportunidades e a
possibilidade de realizar escolhas, as quais me levaram a estar, neste presente momento,
apresentando este trabalho.
4
Resumo
Neste trabalho abordaremos, no contexto de Engenharia de Automação, o conceito
de um sistema de Automação Residencial, responsável por levar características como
modernidade, conforto e economia para uma determinada edificação. Para tanto,
realizaremos neste trabalho uma análise teórica sobre tais sistemas, analisaremos suas
vantagens, descreveremos conceitualmente cada um de seus componentes e por fim,
realizaremos um experimento prático visando demonstrar o comportamento de um Sistema
de Automação Residencial.
5
Sumário
1. Introdução..................................................................................................................... 6 2. Análise Inicial sobre Sistemas de Automação Residencial.......................................... 7 2.1. Sistemas de Automação: Uma análise através do tempo....................................... 7 2.2. A Necessidade da Integração entre Sistemas de Controle......................................... 9 2.3. Protocolo de Comunicação I2C: Uma Breve Análise............................................... 11 2.3.1 A Arquitetura I2C............................................................................................... 12 3. Modularização e Descrição do Hardware de Automação Residencial............................ 16 3.1. Introdução de Engenharia e Analise de Valor na fundamentação da aplicação do Produto 18 3.2.Integrando o Sensor de Temperatura ao Hardware.................................................... 22 3.3 Construção do Circuito e Medição da Luminosidade Ambiental.............................. 25 3.4 SMARTCARDS e suas aplicações............................................................................. 28 3.5 Um estudo sobre o Expansor I/O Integrado............................................................. 33 4. Integração dos módulos de Controle e Construção do Software final.......................... 35 5.Resultados ..................................................................................................................... 40 6. Conclusões ................................................................................................................... 41 7. Anexos ........................................................................................................................ 43 Anexo 1 ....................................................................................................................... 43 Anexo 2 ........................................................................................................................ 46 Anexo 3 ......................................................................................................................... 47 Anexo 4 ......................................................................................................................... 48 Anexo 5 ......................................................................................................................... 50 Anexo 6 ......................................................................................................................... 51 Anexo 7 ......................................................................................................................... 59 Anexo 8 ......................................................................................................................... 61 Anexo 9 ......................................................................................................................... 62 Anexo 10 ....................................................................................................................... 66 Anexo 11 ....................................................................................................................... 72 Anexo 12 ....................................................................................................................... 75 Anexo 13 ....................................................................................................................... 76 Anexo 14 ....................................................................................................................... 79 8.Referências Bibliográficas............................................................................................. 81
6
1. Introdução
A constante evolução da tecnologia que nos cerca torna mais acessível para a
humanidade componentes eletrônicos cada vez mais avançados, menores, mais baratos e de
fácil utilização. É dentro deste contexto que os profissionais das áreas mecânica e eletrônica
encontram com mais facilidade oportunidades de desenvolver sistemas mais eficientes e
acessíveis no mercado.
Logo, a automação residencial, antes um simples objeto de ficção e imaginação de
como seria a tecnologia em um futuro próximo, agora se torna gradualmente uma realidade
no mundo que nos cerca.
Neste trabalho abordarei tópicos referentes a um sistema de automação residencial.
Tal automação poderia estender-se a grandes edifícios, indústrias, aeroportos, hospitais,
centros comerciais, etc. Tal gama de possíveis locais supostamente e potencialmente
automatizáveis seria incontável, porém neste trabalho estudarei funções básicas para o
processo de automação de uma residência, embasando aspectos teóricos e práticos para o
desenvolvimento de um sistema de automação residencial.
7
2. Análise Inicial sobre Sistemas de
Automação Residencial
2.1. Sistemas de Automação: Uma Análise Através
do Tempo
Até poucos anos atrás, no que se refere ao conceito de automação
residencial/predial, tal sistema poderia ser considerado completamente abstrato e de difícil
concretização até mesmo para os especialistas mais otimistas. A tecnologia presente neste
tempo de nada incentivava a elaboração teórica de um sistema de automação para os fins
de tornar o comportamento de uma edificação completamente autônomo. Tal tecnologia,
desincentivada pela limitada gama de equipamentos, no que diz respeito a sensores,
controladores, sistemas de registro de dados, atuadores, etc. elevaria o custo de qualquer
sistema de automação a patamares muito elevados, tornando esta tecnologia praticamente
inacessível para a grande maioria dos consumidores em potencial.
Logo, tal tecnologia limitava-se basicamente, em sua grande maioria, à utilização de
tecnologias como câmeras de segurança (estas devendo ser monitoradas por um indivíduo),
portões eletrônicos, acionamento de equipamentos em intervalos de tempo previamente
definidos, entre outros. Estes sistemas eletrônicos, entretanto, eram quase que
8
completamente dependentes de um acompanhamento humano, tanto para sua monitoração
como para sua configuração. Tais feitos, apesar de cumprirem relativamente bem sua
designação até alguns anos atrás, pouco nos remete a conceitos muito citados hoje em dia
como sistemas de controle autônomos ou edifícios inteligentes.
É fato que esta reviravolta tecnológica que nos cerca contribui e muito para a
construção de sistemas de automação cada vez mais eficientes e de custo cada vez mais
reduzido. O avanço tecnológico crescente faz com que cada vez mais sejam criados
dispositivos mecânicos-eletrônicos de propósito geral que permitem uma integração cada
vez mais fácil e simplificada com outros dispositivos, e de funcionamento cada vez mais
visível para projetistas. Como resultado, a utilização de tais dispositivos torna-se cada vez
mais fácil, barata e simplificada.
São a partir destas considerações que os sistemas de automação hoje em dia tornam-
se cada vez mais uma realidade presente no nosso cotidiano. No que diz respeito à
automação residencial/predial, antes um artigo de luxo acessível a muito poucos, hoje se
torna um novo ramo de mercado de tecnologia inovadora muito atrativo, porém ainda
pouco explorado no Brasil. A automação residencial, hoje em dia, nos remete não só a
ganhos no que diz respeito a conforto, bem-estar, segurança, mas torna-se uma tendência
mundial na media que reduz o consumo recursos naturais como energia e água, por
exemplo. Tais sistemas, capazes de controlar com grande eficiência dispositivos como
lâmpadas, sistemas de climatização, sistemas de distribuição de água, sistemas de acesso,
segurança, etc, tornam-se uma alternativa rentável nos dias de hoje, onde problemas como
escassez de recursos naturais, desperdícios e criminalidade tornam-se cada vez mais
presentes em nosso dia-dia.
9
2.2. A Necessidade da Integração entre Sistemas de
Controle
No que diz respeito a conceitos como edifícios inteligentes e sistemas autônomos,
podemos verificar que de nada adianta a introdução de dispositivos automáticos como
sensores de temperatura, sistemas de acionamento e sistemas de registro de dados se estes
mesmos não permitirem uma perfeita comunicação e integração entre si. Torna-se inútil à
instalação de um sistema de climatização caro e potente, visando integrá-lo a um sistema de
controle, se este mesmo não dispor de ferramentas que permitam uma comunicação rápida,
fácil e eficiente com outros dispositivos. Era fato, até pouco tempo atrás quando os
primeiros sistemas automatizáveis começaram a surgir, de que estes mesmos, apesar de
prover uma disponibilidade de comunicação e integração entre dispositivos, infelizmente
limitavam-se a comunicação com outros dispositivos manufaturados pelo mesmo
fabricante. Isto era conseqüência de uma incompatibilidade entre protocolos de
comunicação, que se diferenciavam de fabricante para fabricante, ou pior, um mesmo
fabricante poderia utilizar mais de um tipo de protocolo para sua linha de produtos. Como
resultado, o profissional da área de automação se via obrigado a projetar sistemas
completamente dependentes de equipamentos de um mesmo fabricante. Quando tal
fabricante não dispunha de um componente necessário para o processo de automação,
dificilmente o projetista encontraria um dispositivo similar que pudesse vir a ser integrado
ao sistema.
Tal realidade começou a se alterar com a regulamentação de protocolos universais
de comunicação. Esta visão de integração se deu primeiramente por parte de uma empresa
chamada Echelon Corporation. Com uma visão futurista em que qualquer dispositivo
eletrônico poderia integrar-se com outro, a empresa criou um protocolo de comunicação
denominado LonWorks. Tal protocolo necessitava da introdução de um chip, denominado
Neuron Chip, responsável pela tradução e comunicação com qualquer outro dispositivo
integrado a uma rede LonWorks, de modo que o fabricante de dispositivos não mais tivesse
10
que se preocupar com protocolos de comunicação, mas com a introdução de tal chip ao seu
dispositivo. Este protocolo ainda é um dos mais difundidos e utilizados em sistemas de
automação predial.
Muitos são, hoje em dia, os protocolos disponíveis para a comunicação entre
dispositivos. E o melhor disso é que atualmente, a maioria destes pode ser facilmente
configurado de modo a integrar-se com diferentes tipos de protocolos.
Como exemplos de protocolos atualmente utilizados, podemos citar os padrões
Ethernet, CAN, DeviceNet, TCP/IP, I2C, USB, todos muito utilizados hoje em dia em
qualquer que seja o sistema de automação analisado. Entretanto, dispositivos que utilizam
estes protocolos citados acima atualmente necessitam estarem conectados fisicamente entre
si, o que pode acarretar alguns problemas como impossibilidade de comunicação a longas
distâncias, danificação das redes de comunicação, etc. Felizmente, os crescentes avanços
tecnológicos já nos proporcionam protocolos de comunicação baseados na tecnologia
wireless (sem-fio). Tal tecnologia já está presente entre nós e sua difusão está se tornando
uma nova tendência mundial, a da integração entre qualquer dispositivo sem a necessidade
de uma conexão física entre eles. Como exemplo disso, podemos citar dispositivos como
ar-condicionados, PDAs, computadores, entre centenas de outros, cujo projeto já visa à
possibilidade de comunicação sem-fio com outros dispositivos compatíveis. Logo, já
podemos considerar obsoletos sistemas fisicamente integrados, salvo ocasiões em que uma
comunicação sem-fio tornaria-se inviável. Como exemplos de protocolos wireless,
podemos citar os sistemas Bluetooth e Wi-Fi (wireless fidelity).
11
2.3. Protocolo de Comunicação I2C: Uma Breve
Análise
I2C, abreviação de Inter-IC bus, trata-se de um protocolo de comunicação
desenvolvido pela Philips, com o intuito de racionalizar a utilização de portas de
entrada/saída de um dispositivo de controle, como um micro-controlador, por exemplo.
Periféricos tradicionais, que não utilizam protocolos de comunicação como I2C, por
exemplo, geralmente necessitam conectar-se a um dispositivo por pelo menos 1 (uma) via
dedicada para este. O problema é devido a limitada quantidade de portas de entrada/saída
de dispositivos de controle. Quando muitos dispositivos necessitam a conexão direta com o
sistema, pode vir a ser fisicamente impossível realizar esta conexão, considerando uma
situação em que todas as portas deste mesmo já estarem em uso. Com a utilização do
protocolo I2C para a conexão e comunicação entre dois ou mais dispositivos, teoricamente
até 1024 dispositivos poderiam estarem interconectados em apenas 1 (uma) porta de
entrada/saída de um dispositivo de controle.
Como este trabalho visa simular um sistema genérico de automação residencial, se
faz necessária a utilização de um protocolo de comunicação, de modo a tornar o
experimento o mais fiel possível a um sistema real de controle e automação residencial.
Considerando que I2C será o protocolo de comunicação utilizado nos experimentos
práticos realizados à seguir, é importante uma boa compreensão de seu funcionamento,
para que possamos entender como é realizada a comunicação entre o circuito controlador e
os diversos dispositivos conectados à este.
12
2.3.1. A Arquitetura I2C
Basicamente, toda a comunicação feita entre dispositivos com interface I2C é
realizada através de apenas 2 (dois) cabos, chamados SCL e SDA. SCL nada mais é que o
barramento de clock, utilizado para realizar a sincronização de informações entre
dispositivos I2C conectados na mesma linha de dados. A outra linha, SDA, é o barramento
responsável pela transmissão dos dados, que são enviados ou podem ser recebidos pelos
componentes conectados na mesma linha. A figura 2.1 mostra um exemplo de construção
de uma linha de comunicação que utiliza o protocolo I2C. Vale observar que ambas linhas
de comunicação SCL e SDA estão fisicamente conectados a um dispositivo-mestre, como
um controlador, por exemplo, responsável pela construção do sinal de clock e pela leitura
das informações dos dispositivos, como será esclarecido a seguir.
Figura 2.1 – Exemplo de barramento I2C
Um fato interessante na construção do barramento de comunicação I2C é que se faz
necessária a inserção de pelo menos 2 (dois) resistores adicionais à rede. Isto se deve ao
fato de que os dispositivos I2C são capazes de definir seu estado de saída como “Baixo”
mas não podem definir este mesmo como “Alto”. Para tais dispositivos poderem definir seu
sinal de saída como “Alto”, resistores de pull-up devem ser necessariamente acrescidos ao
barramento como mostrados na figura 2.1, um para cada linha de comunicação (SCL e
SDA). A ausência destes resistores faria com que os sinais da linha sempre estivessem em
0V (ou próximo disso), e como conseqüência a rede de comunicações I2C não viria a
funcionar.
13
Outra definição importante na rede I2C é que os dispositivos conectados podem ser
denominados master (mestre) ou slaves (escravos). Mestre sempre será o dispositivo que
comanda a linha e gera o clock de sincronização na linha SCL. Por outro lado, os
dispositivos escravos são aqueles que respondem ao mestre. Dispositivos escravos não
podem iniciar uma seqüência de transmissão de dados através da linha de comunicação, tal
tarefa cabe apenas ao dispositivo mestre.
No que se refere à estrutura física do protocolo de transmissão de dados através da
rede, pelo menos dois eventos merecem uma atenção especial, as denominadas seqüências
de início de transmissão de um pacote de dados (start sequence) e as seqüências de fim
de transmissão de um pacote de dados (stop sequence). Tais eventos podem ser
claramente definidos como mostra a figura 2.2. A seqüência de início se faz necessária
(seqüência esta transmitida pela linha SDA) para avisar todos os dispositivos escravos
presentes na rede de que uma instrução de comando para algum dispositivo será dada pelo
dispositivo mestre. Para a seqüência de inicio de transmissão ser compreendida pelos
dispositivos na rede, é necessário que o sinal proveniente pelo mestre na linha SDA esteja
configurado para “Alto” e mude para “Baixo”, enquanto o sinal da linha SCL, também
proveniente pelo dispositivo mestre deve obrigatoriamente manter-se em nível lógico
“Alto”. Para a construção da seqüência de fim de transmissão de um pacote, o nível lógico
proveniente pelo dispositivo mestre no barramento SDA deve ficar em “Baixo” e mudar
para “Alto”, enquanto o nível lógico no barramento SCL deve obrigatoriamente manter-se
em “Alto”.
Figura 2.2 – Definição para seqüência de inicio e fim da transmissão de um pacote de dados
14
Todos os dispositivos I2C possuem um endereço interno único. Isto é muito útil,
pois depois de concluída a seqüência de inicio de transmissão, o dispositivo mestre envia
um pacote de dados contendo o endereço do dispositivo ao qual deseja conectar-se a fins de
executar uma instrução de comando. A grande maioria dos componentes utilizados
atualmente possuem um endereçamento interno de 7 bits, porém tais endereçamentos
podem conter até 10 bits. Quando o dispositivo mestre envia os 7 bits relacionados ao
endereço do dispositivo desejado (e considerando que o dispositivo opere com
endereçamentos de 7 bits) através do barramento SDA, deve ser acrescido ainda 1 (um) bit
extra no final da seqüência, responsável pela definição do tipo de instrução que será dada
ao dispositivo-alvo. Tal instrução pode ser read (leitura), definida pelo nível lógico “Alto”,
ou write (escrita), definida pelo nível lógico “Baixo”.
Ao final da seqüência de endereçamento, caso algum dispositivo que possua o
mesmo endereço introduzido na linha SDA identifique-se como sendo o dispositivo slave
cujo mestre está tentando conectar, este dispositivo enviará na rede um bit denominado
ACK (acknowledgement, confirmação). Este bit, disposto na linha em nível lógico “Alto”
nada mais é do que um sinal de confirmação dado pelo dispositivo escravo para o
dispositivo mestre, como forma de avisar que está pronto para receber o próximo pacote de
dados enviados na rede. A figura 2.3 esboça com clareza a etapa de endereçamento em
uma rede I2C.
Figura 2.3 – Seqüência de endereçamento e confirmação em uma arquitetura I2C
Vale lembrar que após a seqüência de endereçamento ter terminado, todos os
dispositivos que supostamente não se identificaram como sendo o dispositivo-alvo
informado pelo mestre, ignorarão todos as próximas seqüências de dados provenientes na
rede, até o momento em que outra seqüência de inicio de transmissão seja efetuada na rede.
15
Neste caso, os dispositivos passarão novamente a monitorar o próximo pacote de
endereçamento para constatar se ele é ou não o dispositivo-alvo em questão.
Em seqüência, após o termino da seqüência de endereçamento e a eventual
confirmação do dispositivo escravo, o dispositivo mestre está pronto para iniciar a
transferência de seu pacote de dados. Estes pacotes são transferidos em uma seqüência de 8
bits. Para cada pacote de 8 bits enviados, o dispositivo receptor envia 1 (um) bit extra na
linha, que nada mais é do que outro bit ACK (confirmação). Se o nível lógico deste bit for
configurado para “Baixo”, significa que o dispositivo recebeu o pacote e está pronto para
receber outro pacote. Por outro lado, se o nível lógico for configurado para “Alto”, significa
que o dispositivo receptor não pode aceitar mais nenhum pacote de dados e o dispositivo
mestre deve terminar a seqüência de transmissão enviando uma seqüência de fim de
transmissão. A figura 2.4 ilustra a seqüência de envio de um pacote de dados.
Figura 2.4 – Seqüência de transmissão de pacotes através de uma rede I2C
Basicamente, estas são as 4 fases do processo de comunicação entre dispositivos
conectados no mesmo barramento de uma rede I2C. Seqüência de inicio da transmissão,
seqüência de endereçamento, seqüência de transmissão de pacotes e seqüência de fim da
transmissão.
Sobre a velocidade do fluxo de dados que transita através de uma rede I2C, esta
mesma é definida pelos intervalos com que o clock é disposto pelo dispositivo mestre na
linha SCL, e esta velocidade pode ser definida de 3 (três) maneiras diferentes: A
velocidade Standard (100 kHz), fast (400kHz) e High Speed (3.4 MHz). Para efeitos de
teste, a velocidade de sincronização no projeto que será apresentado manterá um clock de
aproximadamente 100kHz, garantindo uma perfeita sincronização e compatibilidade entre
os dispositivos conectados na rede.
16
3. Modularização e Descrição do
Hardware de Automação
Residencial
Como vimos anteriormente, um sistema de automação residencial deve ser capaz de
atender a diversas funções. Para isto, deve-se obrigatoriamente ter um nível de flexibilidade
muito elevado, ou seja, ser capaz de receber novos periféricos, atualizações e melhorias em
geral de maneira rápida, barata, fácil e segura. Para tanto, o hardware principal, aquele que
desempenhará a função de núcleo do sistema deve dispor de um alto nível de
intercomunicação, isto é, ser completamente compatível com as novas tecnologias
assimiladas pelo mercado e dispor de recursos suficientes para gerenciar de forma ágil e
segura tais adventos.
O hardware aqui utilizado por nós para realizarmos todas validações dos
embasamentos teóricos que vimos e vamos ver logo a frente, atende perfeitamente tais
características listadas anteriormente, oferecendo uma alternativa de baixo custo e capaz de
realizar um controle de maneira ágil, confiável e flexível, requisitos indispensáveis quando
pensamos em projetar um sistema de controle residencial. Tal hardware, com um núcleo
baseado na arquitetura MSC1211 de 8 bits, operando a 11.0592MHz, é dotado de um nível
elevado de expansibilidade, podendo receber e/ou controlar praticamente qualquer
dispositivo de comunicação de interface digital em suas quatro portas digitais de 8 bits,
bem como ler sinais analógicos em um de seus oito canais analógicos que podem ser
configurados para trabalhar em uma resolução de 8, 16 ou 24 bits, bem como dispor sinais
analógicos através de seu conversor DA onboard. A figura 3.1 nos mostra nosso hardware
17
utilizado para realizar todos os experimentos, testes e validações que serão estudadas
futuramente neste trabalho.
Figura 3.1 – Hardware MSC1211
Neste capítulo, vamos analisar separadamente todos os dispositivos de expansão que
iremos utilizar futuramente em nosso experimento final. Tais dispositivos, conectados às
portas de expansão do controlador, serão capazes de desempenhar diversas funções como
aquisição de dados, sensoriamento externo, expansão entre diversas outras peculiaridades.
Também estudaremos, junto com a análise de cada dispositivo, um software exemplo,
escrito em ASSEMBLER e compatível com qualquer controlador da família 8051, que
mostrará o funcionamento do dispositivo que será futuramente integrado ao nosso projeto
final.
18
3.1. Introdução de Engenharia e Análise de Valor
na Fundamentação da Aplicação do Produto
No cenário tão competitivo que se configura o mercado no mundo atual, boas idéias,
aliadas à criatividade do projetista, são indispensáveis para o sucesso e firmamento de um
novo produto do mercado. Porém apenas grandes idéias e dedicação ao desenvolvimento
não consolidam um novo produto. Este projeto, antes, deve passar por uma pesquisa de
mercado para definirmos inicialmente os rumos que deveremos tomar ao início do
desenvolvimento, e, até mesmo, se este projeto deve ou não ser concretizado, pois nem
sempre uma grande idéia é bem aceita, a princípio, pelo público alvo. Não faz sentido
construir um grande e revolucionário produto que apesar de inovador, devido a uma série
de fatores diversos não se torna atrativo no mercado.
É neste contexto que podemos inserir, na fase de desenvolvimento conceitual do
produto, uma moderna ferramenta de qualidade denominada Análise de Valor. Tal
ferramenta consiste na elaboração de uma planilha onde são levantados aspectos decisivos
para a elaboração de um novo conceito. Esta planilha é construída, primeiramente, através
de uma pesquisa de mercado direcionada à consumidores em potencial, que podem
contribuir, em diversas maneiras, com informações importantes sobre as características
diversas do produto, indispensáveis para levar tal produto a ter uma aceitação maior no
mercado.
Para o desenvolvimento deste projeto teórico-prático apresentado ao decorrer deste
trabalho, referente ao desenvolvimento de um sistema automatizado de controle residencial,
é de suma importância que procuremos tornar tal desenvolvimento o mais real possível,
tentando realçar os aspectos mais significativos dos conceitos de desenvolvimento de
produto. Para tal, utilizaremos, de uma maneira mais simples, os conceitos de Análise de
Valor para que possamos ter uma idéia geral do que um consumidor em potencial espera
deste sistema. Claro, em condições reais de utilização, tal pesquisa seria efetuada por uma
equipe de marketing atuando conjuntamente com outros setores da empresa como pesquisa
e desenvolvimento, por exemplo, mas devido às nossas restrições, a pesquisa será
19
totalmente efetuada pelo autor deste trabalho, também responsável pelo projeto, pesquisa e
desenvolvimento do produto.
Para tal pesquisa, consideraremos inicialmente que nosso sistema de automação
residencial, desenvolvido para realizar um controle inteligente de um determinado local que
poderia ser uma sala, um domicilio, um edifício, entre muitas outras alternativas, visa
integrar modernos sistemas de controle para levar à estes ambientes praticidade, conforto,
segurança e economia de recursos naturais, como eletricidade, por exemplo. Para isto foram
sugeridos inicialmente uma série de módulos que podem ser integrados com algum trabalho
extra no sistema de controle central, como por exemplo, sistemas de segurança, sistemas de
controle de luminosidade, sistemas de interfaceamento, etc, que podem ser escolhidos
livremente de acordo com as necessidades de cada consumidor. Cada consumidor, então,
escolheria quais os módulos mais apropriados para seu projeto e também definiria uma
graduação para este módulo, que reflete o grau de aperfeiçoamento de cada módulo,
compreendendo variáveis como tecnologia utilizada, material utilizado, inovação e horas de
projeto conceitual. Com um grau que varia de 0 a 10, de acordo com a necessidade, foi
estipulada que cada aumento na unidade deste grau necessita de mais duas horas de projeto
extra, e de que foi estipulado, efetuando uma média entre opiniões de diversos engenheiros,
que um preço razoável a ser cobrado por cada hora de trabalho seria de R$50,00. Então, se
um módulo tivesse necessidade de grau 10, seria cobrado por ele R$500,00. Nesta pesquisa
não foi considerado o custo do sistema principal de controle, que será o responsável pelo
interfaceamento entre os módulos, consideramos apenas que o cliente está interessado no
resultado final do produto.
Após levantar dados suficientes que possam esboçar um valor que represente uma
tendência de consumo pelos clientes em potencial, podemos agora trabalhar com um
conceito denominado Engenharia de Valor. Tal conceito visa dar uma maior ênfase no
desenvolvimento dos módulos que despertam mais interesse nos consumidores, e que
realmente irão gerar um maior lucro com sua inclusão no sistema final, bem como reduzir
custos (refletidos em horas de pesquisa, em nosso caso) do projeto e aperfeiçoamento de
módulos de pouca aceitação pelos consumidores, ou até mesmo abandonar este módulo
caso os resultados não tenham se mostrado satisfatórios.
20
Baseando-se no estudo destes conceitos referentes à Engenharia de Produto,
poderemos então utilizar o método de Engenharia e Análise de Valor para realizar uma
pesquisa de ordem experimental de modo a verificar uma possível aceitação dos módulos
propostos à seguir pelo mercado.
Tal pesquisa consiste, inicialmente, na entrega de um formulário para alguns
possíveis clientes escolhidos pelo autor para realizar tal simulação, com níveis de poder
aquisitivo variando entre médio e alto. 10 (dez) clientes foram consultados, e lhes entregue
uma ficha com a descrição conceitual do projeto, bem como uma explicação sobre
características gerais da Engenharia e Análise de Valor e à seguir, uma lista de módulos
que descrevem características de um sistema de automação residencial para que os
pesquisados possam dar uma nota, variando de 0 (zero) a 10 (dez) sobre a importância de
cada item na elaboração final do projeto, considerando não somente a inclusão de tal item,
mas a conseqüência de tal inclusão, como aumento do preço final, tempo de
desenvolvimento, etc. Tais conseqüências foram propostas justamente para os entrevistados
refletirem se tais implementações seriam realmente necessárias, considerando que estas
mesmas agregariam valor ao produto final.
Após tal pesquisa, podemos finalmente, construir a tabela 3.1, definindo o grau de
importância de cada módulo com base na média dos dados apurados em nossa pesquisa de
mercado.
Tabela 3.1 – Resultados da Pesquisa de Mercado
CARACTERÍSTICA Média Valor Final
Segurança no fluxo de dados
Grau de importância referente à segurança do fluxo de dados referentes ao sistema de controle eletrônico. O conceito segurança está relacionado com a aplicação de algoritmos de criptografia na rede de dados do sistema como um todo de maneira a evitar que tais dados sejam capturados ou modificados por algum agente externo.
4,9 5
Facilidade de uso
Grau de importância referente a facilidade de utilizar o sistema, como configurá-lo, verificar suas configurações, acionar, desligar, etc.
9,0 9
21
Geração de registro de uso
Grau de importância referente à possibilidade deste sistema gerar automaticamente relatórios que podem ser visualizados em um computador referente às suas funções definidas. Ex: Horário que uma porta foi aberta. Horário que uma lâmpada foi acionada.
3,4 3
Acionamento eletrônico de fechaduras
Substitui a utilização de chaves ou similares em uma fechadura por um sistema eletrônico de acesso.
7,8 8
Sistema de conforto e climatização
Controle inteligente de temperatura interna, controlando o acionamento automático de ventiladores, estufas e ar condicionado quando a temperatura exceder ou baixar de uma faixa de temperatura previamente configurada.
7,0 7
Controle de iluminação
Realiza o controle automático da luminosidade em um determinado ambiente, verificando a luminosidade atual e acionando, caso seja necessário, lâmpadas ou efetuando a abertura de janelas.
6,8 7
Controle de irrigação
Realiza o controle de irrigação de um jardim, de modo a acionar automaticamente e periodicamente, mangueiras ou regadores de água.
2,8 3
Valor final do produto Grau de importância do valor final do equipamento adquirido. Impacto sobre qualidade dos componentes utilizados, por exemplo.
9,0 9
Analisando os dados levantados, podemos agora partir para uma análise individual e
detalhada dos módulos que de forma geral são de maior importância para os consumidores.
Utilizando os conceitos relacionados à Engenharia de Valor, podemos concluir que
características como controle de irrigação, segurança no fluxo de dados e geração de
registro de uso, embora tenham um conceito inovador, não despertam, pelo menos neste
presente momento, um grande interesse pelo mercado. Logo, são itens que possivelmente
seriam excluídos do projeto final.
Podemos finalmente, com maior segurança, investir um tempo maior na elaboração
final, pesquisa e aperfeiçoamento dos conceitos de maior valor, pois já temos uma idéia
inicial de que sua construção e inclusão no projeto final será responsável pelos maiores
lucros que viríamos a ter caso fossemos realmente comercializar um Sistema de Automação
Residencial
22
3.2. Integrando o Sensor de Temperatura ao
Hardware
Como o hardware utilizado para realizar o controle das diversas funções designadas
não apresenta um sensor de temperatura on-board, ou seja, construído na própria placa,
devemos, então, utilizar uma ou algumas de suas saídas de expansão para conectar ao
dispositivo um sensor de temperatura que nos forneça com certa exatidão a leitura da
temperatura interna ou externa do ambiente.
Para tanto, escolhemos como sensor TMP123, um potente conversor de temperatura
em sinais digitais que podem ser facilmente lido pelo hardware de controle. Trata-se de um
sensor de 12 bits que consegue medir com certa exatidão uma faixa de temperatura variante
entre -40°C e +125°C, com precisão de 0.0625°C. Diferente da maioria dos componentes
de expansão que podem ser conectados na placa, este sensor utiliza um protocolo de
comunicação denominado SPI, mais simples de ser utilizado, porém irá requerer saídas
dedicadas do hardware, não podendo, então, ser conectado a um barramento de
comunicação afim de economizar entradas/saídas do hardware utilizado. Desconsiderando
os pinos de alimentação (Vcc e terra), este sensor necessita conectar-se a 3 portas do
hardware, necessárias para gerar um clock de sincronia com o dispositivo, transferir os
dados e ativar/desativar o sensor.
O processo de aquisição de dados do sensor se dá de forma muito simples. Como
este mesmo se encontra em um barramento dedicado, ou seja, só ele está conectado na
porta, torna-se dispensável o processo de reconhecimento antes necessária no protocolo
I2C. Após ser dada a condição de início, o sensor inicia o processo de envio da temperatura
registrada internamente sincronizada pelo sinal de clock enviado pelo hardware de controle.
A figura 3.2 ressalta a seqüência a ser seguida para efetuar a leitura deste sensor:
23
Figura 3.2 - Seqüência de leitura do sensor TMP123
Um aspecto importante no processo de conversão de temperatura deste sensor, é que
este mesmo converte continuamente a temperatura enquanto o pino CS se mantém em nível
lógico “alto”. O sensor necessita, ainda, de pelo menos 0.25 segundos para efetuar cada
processo de leitura, então é importante durante o processo de construção do software de
leitura, que se determine este tempo mínimo de intervalo entre leituras para a obtenção de
um valor coerente com a realidade.
Para o processo de conversão do valor de temperatura lido no barramento, o
fabricante disponibiliza a tabela 3.2 com algumas leituras convertidas para valores em
graus Celsius para podermos então, montar nossa regra de conversão de temperatura:
Tabela 3.2 - Tabela de conversão de temperatura para TMP123
Verificando a tabela é possível definir matematicamente que valores positivos da
temperatura lida, em hexadecimal, pode ser obtida dividindo o valor lido, em hexadecimal,
24
por 80h. Para realizar tal divisão, foi utilizado no programa-exemplo uma rotina de divisão
de 16 bits disponibilizada no site www.8052.com, bem como as rotinas de delay da
biblioteca DELAY.INC (vide anexos) desenvolvida pelo professor Julio César Lima.
Neste exemplo, foi criada uma biblioteca com funções pré-definidas para efetuar a
leitura do sensor TMP123. Em resumo, este exemplo dispõe rotinas para efetuar a aquisição
da temperatura armazenada no sensor, registrando este valor no acumulador e
disponibilizando este valor na forma decimal para que ela possa ser impressa em algum
dispositivo de saída caso seja necessário. Tal exemplo pode ser analisado no Capítulo
Anexos, Anexo 1. Esta mesma biblioteca será utilizada quando realizarmos, de fato, a
construção da parte do software responsável pelo controle da climatização ambiental do
sistema de automação residencial.
Após este exemplo concluímos, então, a análise teórica do funcionamento do sensor
de temperatura TMP123, bem como um exemplo prático que será futuramente integrado ao
nosso hardware de controle.
25
3.3. Construção do Circuito e Medição da
Luminosidade Ambiental
Efetuar a captação e medição de valores de luminosidade é uma tarefa essencial
quando estamos projetando um sistema inteligente de controle de luminosidade ambiental.
Tal sistema deve ser capaz de detectar a luz incidente em determinado ponto, compará-lo
com um valor pré-definido e então efetuar regras de controle como o acionamento de
lâmpadas, abertura de janelas, etc. Logo, se faz necessário inicialmente elaborar um circuito
elétrico capaz de realizar a captação desta luminosidade e transformá-la em valores
analógicos ou digitais, para que sejam processadas, posteriormente, pelo hardware de
controle.
No entanto precisamos, primeiramente, definir qual o sensor que será utilizado para
realizar a aquisição da luminosidade incidente sobre a área a ser controlada. Dentre vários
disponíveis no mercado, escolhi para esta função um componente analógico denominado
LDR. Trata-se de um resistor barato e de fácil acesso, que tem sua resistência interna
variável de forma linear conforme a intensidade da luz que incide sobre sua superfície.
Basicamente, este componente apresenta uma resistência infinita quando exposto a uma
ausência de luminosidade (ambiente escuro) e uma resistência cada vez menor a medida em
que a intensidade de luz incidente sobre sua superfície aumenta. Então, para realizar a
captação de valores analógicos referentes à luminosidade ambiental, vamos utilizar o
circuito exemplificado a seguir para quantizar esta intensidade luminosa em valores
analógicos, que podem ser futuramente lidos pelo nosso hardware.
Para a construção deste circuito, consideramos que a alimentação será proveniente
do próprio hardware que fornece uma saída de 5Vcc, e de que o valor analógico de saída
deve variar entre 0 (zero) e 2.5Vcc.
26
Figura 3.3 - Circuito utilizado para captação da luminosidade ambiental
Podemos observar que os dois primeiros resistores de 1k atuam exclusivamente
como divisores de tensão, de modo a fazer a tensão resultante sobre o LDR variar entre 0 e
2.5 Vcc, necessário para a utilização correta do conversor A/D do hardware. O valor
resultante lido é relativo e varia conforme a alteração do resistor R3. O valor de 8k foi
escolhido diante uma série de alternativas, pois apresenta um sinal mais bem excursionado
quando submetido a diferentes intensidades de luminosidade.
Agora que o circuito já está montado, e tem seu sinal variando entre 0 e 2.5 Vcc,
chega a hora de conectá-lo ao hardware de controle através de uma de suas portas
disponíveis, para efetuar a leitura de valores analógicos e convertê-la posteriormente em
valores digitais. Nosso hardware apresenta 8 portas analógicas, compartilhadas com a porta
0 (zero) deste mesmo, ou seja, esta porta pode ser configurada como uma entrada/saída
digital ou como uma entrada para aquisição de valores analógicos. Para o nosso circuito,
utilizaremos apenas uma destas entradas operando em modo analógico, definida como
AD0, o canal 0 (zero) do conversor A/D. Para a configuração da entrada A/D do circuito,
devemos salientar que esta mesmo pode operar com uma resolução de 8, 16 ou 24 bits. Nos
testes de bancada realizados para ajustes do circuito e parâmetros do software, foi possível
27
observar que a utilização do conversor A/D em modo 8 bits mostrou-se bastante eficiente,
obtendo uma precisão de duas casas após a virgula, suficiente então, para realizar com certa
exatidão a leitura da luminosidade incidente sobre o sensor.
A rotina utilizada para leitura do conversor A/D, que pode ser analisada no
Capítulo Anexos, Anexo 2, foi disponibilizada pelo professor Julio César Lima. O valor de
leitura no canal 0 é registrado no acumulador em um formato de 8 bits (0-255). Tal valor
pode ser utilizado, futuramente, para comparação com outro valor pré-definido afim de
controlarmos se a taxa de luminosidade captada pelo sensor é menor ou maior do que o
configurado, acionando uma regra de controle caso necessário.
28
3.4. SMARTCARDS e suas Aplicações Cartões de memória hoje são cada vez mais introduzidos e aceitos em nosso
cotidiano, por motivos como praticidade, tamanho reduzido, segurança nos dados,
capacidade de armazenamento entre muitos outros. É comum hoje em grandes hotéis
receber ao invés de uma chave de metal, um cartão de acesso para um dormitório. Em um
restaurante, torna-se cada vez mais comum, prático e rápido substituir as tradicionais
comandas de papel por um cartão capaz de armazenar o histórico de consumo do cliente,
entre muitas outras aplicações.
Um cartão de memória, resumidamente, nada mais é do que uma memória
eletrônica (por exemplo, um chip) acoplado a um pequeno cartão de plástico, como é o caso
dos smartcards. Trata-se de uma memória re-gravável EEPROM 24LC barata e de fácil
acesso, que tem uma capacidade de armazenamento variante entre 2K, 4K, 8K e 16K
bits.Entre suas características destacam-se a confiabilidade (em média os dados gravados
não se deterioram por um período médio de 40 anos), praticidade (a transmissão de dados
entre a memória e hardware utiliza protocolo I2C), e baixo valor do produto. A figura 3.4
representa uma memória 24LC que é comumente anexada nos smartcards:
Figura 3.4 - Memória 24LC
Apesar da memória apresentar oito pinos, na maioria dos casos (e no nosso caso)
utilizaremos apenas quatro, que são os dois pinos referentes à alimentação da memória
(Terra e Vcc) e outros dois para realizar a transmissão de dados pelo protocolo I2C (um
para dados e outro para sincronia).
O soquete de leitura, comumente denominado Smartsocket, tem a simples função de
conectar firmemente o cartão e expandir estes oito pinos de forma a conectá-los
29
indiretamente, ou seja, por meio do soquete, aos seus locais apropriados como alimentação
e portas de um hardware. O soquete ainda possui um pino extra que trabalha de forma
independente ao cartão. Este pino é utilizado para sinalizar a inserção do cartão dentro do
soquete. Simplificando, quando o cartão é inserido, ele provoca o fechamento de um
contato que, quando alimentado, provoca um sinal de saída que pode ser útil para sistemas
que estejam interessados em detectar o momento que o cartão é inserido, para efetuar sua
leitura. Logo, apesar de útil, sua conexão não é necessária para efetuar a leitura/escrita do
cartão.
Como em qualquer outra memória regravável, esta memória apresenta dois
momentos distintos de trabalho. O processo de leitura, e o processo de escrita. A escrita é
necessária para efetuar processos de configuração e registro de dados. Na leitura a memória
fornece o dado armazenado na posição de memória requerida.
À seguir vamos analisar dois programas distintos. O primeiro realiza a escrita na
memória de um determinado byte em uma determinada posição de memória. O segundo
efetua a leitura de um byte armazenado em uma determinada posição, bem como a leitura
do sensor de conexão do cartão presente no soquete.
Para a escrita, vamos primeiro definir obrigatoriamente o endereço do dispositivo,
no caso a memória, para uma operação de escrita. O fabricante nos fornece a tabela 3.3 com
as definições de endereçamento para este tipo de memória.
Tabela 3.3 - Tabela de endereçamento da memória 24LC
Considerando que nem mencionamos os pinos Chip Select anteriormente, vamos
considerar que só desejamos ter uma memória 24LC02 (2K) presente no mesmo
barramento I2C, e de que estaremos trabalhando em modo Write. Logo, o endereço correto
30
pode ser definido como 10100000, ou seja, 0AH. A seguir, vamos analisar a figura 3.5 que
nos representa o processo de escrita de determinado byte em uma posição de memória:
Figura 3.5 - Processo de escrita de um byte em uma posição de memória
Fica fácil entender que após o endereçamento, o byte referente ao endereço é
enviado ao dispositivo, e após a confirmação o byte de dado é enviado à memória.
Novamente uma confirmação é enviada e uma seqüência de fim de transmissão finalizaria
o processo. Caso desejássemos escrever mais bytes de dados em seqüência, poderíamos
seguir a seqüência descrita na figura 3.6:
Figura 3.6 - Processo de escrita de bytes em seqüência em uma posição de memória
O procedimento é o mesmo para a escrita de um byte, porém a seqüência de fim de
transmissão é adiada até que todos os bytes desejados sejam escritos, seguidos, é claro,
pelo byte de confirmação que é enviado pela memória a cada escrita bem sucedida. O
software escrito como exemplo, que pode ser encontrado no Capítulo Anexos, Anexo 3,
foi escrito com o intuito de exemplificar um processo de escrita na memória. Sua função é
escrever na posição de memória 25H um byte 46H, valores ambos escolhidos de forma
aleatória para ilustrar o exemplo.
31
Vamos agora analisar o processo de leitura da memória. A figura 3.7 nos fornece a
seqüência necessária para efetuar a leitura de um byte em uma posição de memória
fornecida:
Figura 3.7 - Processo de leitura de um byte na memória
Como primeiramente vamos definir a posição de memória a ser lida, o processo de
leitura deve inicialmente começar como um processo de escrita, pois desejamos escrever
para a memória em que posição deveremos iniciar a leitura. Logo, utilizando o endereço em
forma de escrita, enviamos após a confirmação o byte referente a posição da memória que
gostaríamos de ler. Após o recebimento da confirmação, o processo deve seguir com uma
seqüência de início de transmissão, e agora sim, endereçaremos a memória como leitura
(41H). Após a confirmação, efetuamos a leitura do dado contido na posição previamente
configurada. Vale lembrar que após a leitura deste byte, a memória não envia uma
confirmação. A seqüência de fim de transmissão marca então, a conclusão do processo de
leitura. Caso fosse o caso de ler vários bytes ao invés de um, o processo seria o mesmo
descrito acima, com a diferença de que ao invés de enviar uma seqüência de fim de
transmissão para sinalizar o fim do processo, o dispositivo mestre enviaria, pelo contrário,
uma confirmação para a memória, e esta então, enviaria o próximo byte na seqüência até
que o dispositivo forneça uma seqüência de fim de transmissão finalizando o processo.A
figura 3.8 representa esta forma de leitura:
Figura 3.8 - Processo de leitura de vários bytes em seqüência na memória
32
O exemplo descrito no Capítulo Anexos, Anexo 4, efetua a leitura de em sua
posição #25h e a registra o byte recebido no acumulador. Em acréscimo, ela ainda verifica
o pino de sinalização do soquete, conectado ao pino P0.0 do hardware de controle, de forma
a efetuar a leitura somente quando o cartão estiver inserido e, conseqüentemente, disponível
para leitura.
O programa descrito no Anexo 4 será utilizado, posteriormente, para realizar um
controle de acesso controlado por smartcards, que será integrado ao nosso sistema de
automação residencial.
33
3.5 Um Estudo sobre o Expansor I/O Integrado
Como foi visto anteriormente, uma das principais limitações em um hardware de
controle é a pequena quantidade de portas de entrada/saída presentes para expansão de sua
funcionalidade. Também vimos que protocolos de comunicação como I2C ajudam a
minimizar estes problemas, oferecendo a possibilidade de conectarmos diversos
dispositivos em um mesmo barramento utilizando apenas duas portas, liberando assim,
portas que podem ser utilizadas para outros dispositivos que utilizem algum outro protocolo
de comunicação.
Porém, é possível que mesmo utilizando-se de tecnologias de comunicação que
visem uma diminuição conexões diretas ao hardware, se faça necessário utilizar-se de mais
portas de comunicação do que o hardware oferece. Para resolvermos este problema,
estudaremos a seguir a funcionalidade de expansores de saídas que podem vir a ser uma
solução fácil e econômica para suprir tais necessidades.
Para tanto, vamos utilizar em nosso circuito um expansor PCF8574. Trata-se de um
componente capaz de oferecer 8 portas de entrada/saída para o sistema utilizando para isto
o protocolo de comunicação I2C. Necessitando apenas de duas portas de conexão do
controlador (ou até de outro dispositivo de expansão) é possível integrar este ou mais
expansores em um mesmo barramento, de forma a aumentar em diversas vezes a
capacidade de comunicação do hardware analisado.
Adotando os padrões de comunicação estabelecidos pelo protocolo I2C, este
dispositivo pode operar de duas maneiras distintas: Efetuando leituras e/ou escritas, ou seja,
o dispositivo pode tanto ler dados digitais de entrada em suas portas, ou utilizar destas
como saídas extras. A comunicação com o dispositivo se dá de maneira muito simples.
Após o correto endereçamento do dispositivo, que pode ser configurado de modo a permitir
a utilização de mais de um componente PCF8574 no mesmo barramento, e a sinalização da
operação em seu bit de endereço menos significativo ( 1 = leitura, 0 = escrita), o dispositivo
expansor envia um sinal de confirmação e então lê ou envia uma seqüência de 8 bits que
no caso de leitura será o estado lógico de suas portas, ou em caso de escrita acionará suas
saídas de acordo com o estado de cada bit lido, ou seja, se os bits enviados seguirem a
seqüência “1 1 1 1 1 1 1 1, ou seja, FFH”, isto significa que o dispositivo terá todas suas
34
portas configuradas em nível lógico alto. Se a leitura retornar “1 1 1 1 1 1 1 1, ou seja,
FFH”, significa que o dispositivo está recebendo valores de nível lógico alto em todas suas
entradas. Logo após a leitura/escrita destes 8 bits, o dispositivo envia novamente um sinal
de confirmação e a operação está concluída. Funcionando como um latch, ou seja, um
retentor de dados, após recebido um comando de escrita este dispositivo mantém este valor
disposto em suas saídas até a realização de uma nova operação de escrita, ou até que sua
alimentação seja cortada.
Para o nosso hardware de controle, vamos utilizar este expansor de forma didática
para realizarmos o acionamento de dois relés. Apesar do hardware dispor de saídas não-
utilizadas que possibilitariam o acionamento direto destes relés, é importante
exemplificarmos a utilização do expansor de forma genérica, pois poderia vir a ocorrer uma
situação futura em que as portas de entrada/saída do nosso sistema viessem a ser utilizadas
por mais dispositivos tornando-se necessário, então, a utilização deste artifício de modo a
aumentar a quantidade de portas de comunicação para nós disponíveis.
O exemplo descrito no Capítulo Anexos, Anexo 5, foi escrito de modo a comandar
o acionamento de dois relés conectados em duas portas distintas do expansor de
entradas/saídas. Utilizando-se de uma posição de memória para mapear os estados dos
relés, o programa permite acionar individualmente cada porta do expansor com as rotinas
descritas no software exemplo.
Vale ressaltar que este programa será utilizado futuramente para realizar o
acionamento dos relés presentes no nosso hardware de modo a efetuar leis de controle
previamente configuradas, que serão analisadas no próximo capítulo.
35
4. Integração dos Módulos de
Controle e Construção do Software
Final
Como vimos anteriormente, o projeto de um sistema de automação residencial
compreende o estudo de diversos módulos, que vistos separadamente, são responsáveis
cada um por exercer uma função singular no processo de controle do sistema como um
todo. Analisando a pesquisa de mercado simulada previamente, podemos observar que
nosso sistema deve, além de realizar funções básicas como controle de acesso, controle de
luminosidade e controle climático, deve trabalhar com eficiência e praticidade, ou seja,
permitir uma boa interface homem-máquina de modo a facilitar processos de leitura e
configuração, requisitos muito importantes uma vez que não temos conhecimento da
formação intelectual dos nossos possíveis clientes, e até mesmo um simples processo de
configuração do nosso sistema pode tornar-se uma tarefa difícil para os mais
despreparados. É neste contexto que primeiramente iremos estudar a proposta de uma
interface gráfica que permitirá uma configuração do sistema de maneira rápida e simples.
Para o nosso sistema de automação residencial, o conceito configuração se reflete
simplesmente na determinação das variáveis de controle, ou seja, os set-points,
responsáveis pela identificação de grandezas como temperatura ideal a ser controlada, e
intensidade de luminosidade mínima que desejamos no nosso ambiente, por exemplo.
Para realizar o ajuste destas variáveis, vamos primeiramente analisar novamente
nosso hardware disponível. Constituído por cinco botões, um para reset e outros quatro para
36
funções indeterminadas, vamos definir agora quais botões utilizaremos para realizar a
configuração de nosso sistema. A figura 4.1 ajuda a identificar estes botões:
Figura 4.1 - Interface de Configuração do sistema
Como visto, podemos realizar a configuração dos parâmetros do nosso sistema
através de três botões. Todo o processo pode ser acompanhado graficamente de duas
maneiras: Através da conexão de um display LCD de no mínimo dois segmentos (16x2),
método mais simples que permite uma visualização direta do processo na própria placa, ou
conectando esta mesma, através de uma de suas portas seriais, a um micro-computador
utilizando para isto um software denominado terminal que será responsável pela aquisição
de dados provenientes do nosso hardware pelo micro-computador.
37
O processo de configuração dos set-points do software se dá da seguinte maneira:
Mantendo-se pressionado o botão “Configurar” (descrito na figura anterior), faz com que o
sistema alterne para o menu de configurações. Quando este menu é exibido, o usuário
poderá visualizar o parâmetro a ser configurado, seu valor atual e, com o auxílio das teclas
“Incrementa” e “Decrementa” (descritas na figura anterior), é possível alterar este valor de
maneira rápida e fácil, apenas mantendo pressionado o botão de função desejada. Após ter
escolhido o novo valor, o sistema automaticamente refaz sua tabela interna de registro de
variáveis alterando o valor estipulado e, então, retorna ao seu processo de controle. Para
alternar entre as funções a serem configuradas, o usuário precisa simplesmente pressionar o
botão “Configurar” até chegar ao item a ser configurado. Desta maneira conseguimos
então, com apenas três botões, realizar a configuração de maneira completa de todas as
nossas variáveis. O código fonte, que possui as funções de configuração, será exibido no
final deste capítulo.
Uma vez finalizado o módulo de configuração do software, partiremos agora para a
construção do software em si. Para isto, utilizaremos em grande parte o conhecimento
adquirido no estudo dos módulos individuais, pois estes mesmos já foram construídos e
exemplificados visando uma integração futura com o resto do sistema. Logo, com muito
poucas ou nenhuma alteração, poderemos adicionar os códigos-fonte exemplificados
anteriormente na estrutura do nosso código final.
Antes disso, devemos primeiramente analisar e definir exatamente o que cada
módulo fará e em que situação realizará o controle determinado pela sua função.
Vamos então, analisar primeiramente o módulo responsável pelo controle de
temperatura. Como este trabalho foi realizado no Brasil, em um local que normalmente a
temperatura é elevada, definimos inicialmente que este módulo será responsável pelo
conforto térmico em um ambiente de modo a manter a temperatura sempre estável. Para
isto, ele será responsável pelo acionamento de um equipamento de climatização sempre que
a temperatura ambiental ultrapassar o valor configurado previamente, ou o valor padrão
(25°C) caso o sistema ainda não tenha sido configurado. Considerando que a faixa de
temperatura de operação destes equipamentos (ar condicionados e ventiladores, por
exemplo) geralmente situa-se na faixa de 0°C a 50°C. limitamos os parâmetros de
configuração para valores dentro desta faixa de temperatura. Resumidamente, nosso
38
software realizará a leitura da temperatura ambiental através de seu sensor e acionará ou
desligará um relé responsável pelo acionamento do equipamento de climatização conectado
a ele sempre que a temperatura registrada pelo sensor ultrapassar o valor pré-definido.
Então, se a temperatura for maior, acarretará no acionamento de um ventilador, por
exemplo, e após isto, se a temperatura vier a baixar devido a circunstancias diversas como o
próprio acionamento deste ventilador, este mesmo será desligado assim que o ambiente
atingir a temperatura desejada.
Do mesmo modo, para realizarmos o controle de luminosidade, podemos partir do
principio, por exemplo, que estivéssemos interessados em acionar uma lâmpada somente no
período da noite, ou quando a luz externa não for mais suficiente para iluminar o ambiente.
Para isto, podemos posicionar o sensor de luminosidade próximo a uma janela ou até
mesmo no exterior do ambiente a ser controlado. Quando o valor de luminosidade captada
pelo sensor é menor do que o valor previamente configurado, o sistema aciona
automaticamente um relé responsável por controlar o acionamento de uma lâmpada, por
exemplo. Esta lâmpada ficará acionada até o momento em que a luminosidade captada pelo
sensor tornar-se maior do que o nível pré-determinado (quando o sol nasce, por exemplo).
Como a intensidade de luz registrada pelos sensores varia proporcionalmente conforme os
resistores montados no hardware de aquisição de dados, utilizaremos os próprios 8 bits de
resolução do sensor para realizar a configuração do set-point desejado, ou seja, a faixa de
configuração varia com valores entre 0 a 255, proporcionais a intensidade de luminosidade
(0 significa ausência total de luz, 255 significa a quantidade máxima de luz que o sensor
consegue captar).
Finalizando, vamos estudar agora o comportamento do controle de acesso realizado
por SmartCards. Vamos para isto, definir inicialmente, que na memória interna do cartão
reside uma assinatura digital responsável pela validação do acesso pelo cartão. Tal
assinatura, a título de exemplo, reside em uma posição de memória definida por 25h e
possui um valor de validação de 46h. Quando um cartão é inserido no soquete e apresenta
este valor definido na posição de memória lida, significa que o cartão foi aceito e então o
acesso foi garantido. Logo, aparecerá no display LCD e/ou no terminal a mensagem
“Acesso Garantido”. Caso o valor registrado no cartão for diferente daquele pré-definido, o
cartão é rejeitado e a mensagem “Acesso Negado” é exibida ao usuário. Obviamente, este
39
não é um dos processos mais seguros de validação, mas é bastante eficiente a titulo de
exemplo. O sistema ainda utiliza um detector de inserção do cartão no soquete, que já foi
detalhado anteriormente, e realiza a leitura do cartão somente quando este é inserido no
soquete, exibindo a mensagem “Cartão Inserido” e em seqüência, a validação ou não do
cartão. Nos outros casos, a mensagem “Cartão não Inserido” é exibida no dispositivo de
saída.
Uma vez analisadas as regras de controle de cada módulo, bem como a interface
gráfica do sistema, poderemos agora finalmente construir nosso software final, que será
responsável pelo controle de todos os módulos simultaneamente. No capítulo Anexos,
Anexo 6, é definido o corpo principal do software, ou seja, o arquivo contendo todas as
estruturas de controle, interface, procedimentos de aquisição de dados e breves comentários
sobre a estrutura do software em si. Em seqüência, nos próximos anexos, são apresentadas
todas as bibliotecas adicionadas ao projeto, que também foram utilizadas anteriormente
para a exemplificação de cada módulo em separado. Vale lembrar que estas bibliotecas
receberam pequenos ajustes para serem mais facilmente incluídas no projeto, porém
retendo ainda toda a idéia principal descrita anteriormente para a elaboração do algoritmo
utilizado para a construção destas mesmas. A lista completa de bibliotecas incluídas no
projeto final é descrita à seguir:
� Serial_IO.ASM - Anexo 7
� Config_Serial.ASM - Anexo 8
� DELAY.INC - Anexo 9
� LCD.INC - Anexo 10
� TMP123.ASM - Anexo 11
� 24LC02READ.asm - Anexo 12
� AD_DA.INC - Anexo 2
� I2C.inc - Anexo 13
� I2Csmt.inc - Anexo 14
� RELE.asm - Anexo 5
40
5. Resultados
Analisando o nosso sistema de Automação Residencial em funcionamento,
utilizando o software descrito no Capítulo Anexos, Anexo 6, ou seja, o software final que
integra todos os módulos de controle analisados nos capítulos anteriores, podemos observar
a harmonia de funcionamento entre os módulos, ou seja, o software é capaz de executar
com exatidão as funções definidas para cada módulo de controle (temperatura,
luminosidade, acesso e interface), oferecendo agora uma possibilidade real de análise do
princípio de funcionamento de um sistema real de Automação e Controle Residencial.
Obviamente, apesar da simplicidade do nosso exemplo e considerando que este mesmo foi
elaborado sem ou com muito poucos recursos financeiros, dotado principalmente de
soluções fáceis e baratas de serem elaboradas, este trabalho abre agora caminho para a
possibilidade de um estudo mais detalhado sobre Sistemas de Automação e Controle
Residencial, bem como a elaboração e aperfeiçoamento de novos módulos de controle, de
modo a que, com um certo investimento inicial, este trabalho possa dar continuidade a um
futuro investimento tornando-se então um negócio rentável de modo a penetrar neste
inovador nicho de mercado ainda pouco explorado atualmente.
41
6. Conclusões
Durante o desenvolvimento deste trabalho, tive a oportunidade de consolidar
muitas das teorias analisadas durante o curso de graduação de Engenharia de Controle e
Automação, em especial aos ramos da Engenharia Elétrica e da Engenharia de Produção. O
conceito Trabalho de Integração se faz agora presente no momento em que aplico os
conhecimentos adquiridos nos diferentes ramos da engenharia (elétrica mecânica e
produção) para o desenvolvimento do trabalho que compreende um Sistema de Automação
Residencial.
A aplicação de conceitos vistos na área de Desenvolvimento de Produto, em
especial aqueles voltados para pesquisa de mercado e satisfação do consumidor, são de
suma importância para a concretização de um novo produto no mercado, ainda mais quando
consideramos que este novo produto traz inovações tecnológicas recentes e tecnologia de
ponta, fatores estes que muitas vezes podem causar um certo receio por parte dos
consumidores em potencial, em aderir a estas novas tecnologias.
Sobre a construção do modelo final, compreendendo a fase prática deste projeto,
todos os conhecimentos adquiridos nas áreas de eletrônica analógica, eletrônica digital,
redes digitais e processadores foram decisivos para a elaboração de um modelo funcional
capaz de demonstrar o comportamento real de um Sistema de Automação Residencial.
Num futuro próximo, será comum ver a maior parte das residências, de classe
média e alta, utilizando sistemas de controle, visando segurança, conforto e economia para
seus domicílios. É com base nesta idéia que desenvolvi este projeto, visando à construção
de um protótipo que atenda estas peculiaridades, para que, futuramente, possa dar
continuidade neste trabalho visando, finalmente, o mercado brasileiro.
42
7. Anexos
Serão exibidos, à seguir, os anexos referentes aos códigos-fonte descritos
anteriormente no decorrer deste trabalho, de modo a ilustrar de maneira prática o
funcionamento de cada módulo de controle bem como o sistema final de Automação
Residencial.
Alguns dos anexos, apesar de não terem sido escritos pelo autor, foram modificados
de modo a tornar-se compatível com os módulos estudados anteriormente. Todos estes
exemplos não escritos pelo autor deste trabalho são comentados no capítulo referente a
Bibliografia deste projeto.
43
Anexo 1
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; tmp123.asm ; Autor: Bruno Schwab de Figueiredo ; ; Rotinas: ; StartTMP123 -> Rotina opcional para configurar pinos VCC e GND ; LoadTMP123 -> Faz o componente armazenar em memoria temperatura ; GetTMP123 -> Registra no acumulador o valor da temperatura em hexa ; ConvertTMP123 -> Registra em R5 R6 e R7 digitos da temperatura ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;GND EQU PX.X ;VCC EQU P2.6 SO EQU P2.4 SCL EQU P2.2 CS EQU P2.0 StartTMP123: SETB VCC CLR GND RET LoadTMP123:
SETB CS SETB SCL MOV A,#3
ACALL DELAYx100ms RET ;===================COLOCA em A valor de temp em hexa GetTMP123: MOV R7,#8 CLR SCL CLR CS MOV C,SO LOOPHTmp123:
SETB SCL LCALL DELAY2us MOV C,SO LCALL DELAY5us CLR SCL LCALL DELAY5us RLC A DJNZ R7,LOOPHTmp123;
MOV R1,A MOV R7,#8 SETB SCL LCALL DELAY2us CLR SCL MOV C,SO LOOPLTmp123:
SETB SCL
44
LCALL DELAY2us MOV C,SO LCALL DELAY5us CLR SCL LCALL DELAY5us RLC A DJNZ R7,LOOPLTmp123
MOV R3,#00h MOV R2,#80h ACALL UDIV16 MOV A,R0 RET UDIV16:
MOV R7, #0 MOV R6, #0 MOV B, #16 div_loop:
CLR C MOV A,R0 RLC A MOV R0, |A MOV A, R1 RLC A MOV R1, A MOV A, R6 RLC A MOV R6, A MOV A, R7 RLC A MOV R7, A MOV A, R6 CLR C SUBB A,R2 MOV DPL, A MOV A, R7 SUBB A,R3 MOV DPH, A CLP C INC DIV_1 MOV R7, DPH MOV R6, DPL DIV_1:
MOV A, R4 RLC A MOV R4, A MOV A, R5 RLC A MOV R5, A DJNZ B, div_loop MOV A, R5 MOV R1, A MOV A, R4 MOV R0, A MOV A, R7 MOV R3, A MOV A, R6 MOV R2, A
45
RET Convert_TMP123:
MOV B,#100 DIV AB ADD A,#'0' MOV R7,A MOV A,B MOV B,#10 DIV AB ADD A,#'0' MOV R6,A MOV A,B ADD A,#'0’ MOV R5,A RET
46
Anexo 2
; CONVERSOR A/D E D/A ; ; Estas rotinas implementam funções básicas de acesso aos conversores A/D ; e D/A do MSC1211. As rotinas do Conversor A/D foram escritas para leitura ; apenas em 8 bits. Modifique as mesmas caso necessite de uma precisão ; maior (16 ou 24 bits). Já as rotinas do Conversor D/A foram escritas para ; 8 e 12 bits. ; ; Estas rotinas necessitam das bibliotecas de Delay e LCD! ; ; ; PRIMITIVAS ; ; INITADC0() - Inicializa do Canal 0 do conversor A/D ; READAD8bits(A) - Le os 8 bits mais significativos do A/D (24 bits) ; INITDACONV() - Inicializa o Conversor D/A ; WRITEHDAC0(A) - Escreve os 8 bits mais significativos do D/A (12 bits) ; INITADC0: MOV PDCON,#37H MOV ACLK,#0AH MOV ADCON3,#06H MOV ADCON2,#22H MOV ADMUX,#08H MOV ADCON0,#30H MOV ADCON1,#41H RET ; *** READAD8bits(A) ****************************** ************************* ; ** ** ; ************************************************* ************************* READAD8bits: LCALL READADCL ; le e descarta 3x LCALL READADCL LCALL READADCL LCALL READADCH ; le 8 bits mais significativos RET READADCL: MOV A,AIE ANL A,#20H CJNE A,#20H,READADCL MOV A,ADRESL MOV AIE,#00H RET READADCH: MOV A,AIE ANL A,#20H CJNE A,#20H,READADCH MOV A,ADRESH MOV AIE,#00H RET
47
Anexo 3 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;24LC02WRITE.asm ; Autor: Bruno Schwab de Figueiredo ; ; Programa descrito para efetuar a escrita de um byte em uma determinada posição de memória em uma memória 24LCxx ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
$MOD51 ORG 0000h LJMP INICIO $include(DELAY.inc) $include(I2C.inc) INICIO: ACALL InitI2C ACALL StartI2C MOV A,#0A0h ACALL WriteI2C ACALL RecvACK MOV A,#25h ;Endereço!! ACALL WriteI2C ACALL RecvACK MOV A,#46h ;Dado!!! ACALL WriteI2C ACALL RecvACK ACALL StopI2C loop: LJMP loop END
48
Anexo 4 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;24LC02LEITURA.asm ; Autor: Bruno Schwab de Figueiredo ; ; Programa descrito para efetuar a leitura de um byte em uma determinada posição de memória em uma memória 24LCxx ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
$MOD51 org 0000h LJMP INICIO $include(DELAY.inc) $include(I2C.inc) $INCLUDE(LCD.INC) INICIO: ACALL InitLCD MAIN: ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG1 ACALL WrStr VERIFICA: JB P0.0,LEITURA LJMP VERIFICA LEITURA: ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG2 ACALL WrStr MOV A,#0 ACALL MovCur2 ACALL LE_CARTAO LOOP2: JB P0.0,LOOP2 LJMP MAIN LE_CARTAO: ACALL InitI2C ACALL Delay1000ms ACALL StartI2C MOV A,#0A0h ;slave address write ACALL WriteI2C ACALL RecvACK CONT1: MOV A,#25h ;endereço ACALL WriteI2C
49
ACALL RecvACK CONT2: ACALL StartI2C MOV A,#0A1h ;slave address read ACALL WriteI2C ACALL RecvACK CONT3: ACALL ReadI2C ACALL StopI2C RET MSG1: DB 'Insira SmartCard',0 MSG2: DB 'Leitura:',0 end
50
Anexo 5 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;RELE.asm ;Autor: Bruno Schwab de Figueiredo ; ;Rotinas; ; ;InitPCF8574: Aciona o expansor com saidas desativadas ;Envia_IO: Envia para expansor 8bits contidos em IO_STATUS ;LIGA_RELE1: Liga relé 1 ;LIGA_RELE2: Liga relé 2 ;DESLIGA_RELE1: Desliga relé 1 ;DESLIGA_RELE2: Desliga rlé 2 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IO_STATUS EQU 0F003h InitPCF8574: MOV IO_STATUS,#0FFh ACALL ENVIA_IO RET ENVIA_IO: ACALL StartI2C MOV A,#40h ACALL WriteI2C ACALL RecvAcK MOV A,(IO_STATUS) ACALL WriteI2C ACALL StopI2C RET LIGA_RELE1: MOV A,(IO_STATUS) CLR ACC.0 MOV IO_STATUS,A ACALL ENVIA_IO RET DESLIGA_RELE1: MOV A,(IO_STATUS) SETB ACC.0 MOV IO_STATUS,A ACALL ENVIA_IO RET LIGA_RELE2: MOV A,(IO_STATUS) CLR ACC.1 MOV IO_STATUS,A ACALL ENVIA_IO RET DESLIGA_RELE2: MOV A,(IO_STATUS) SETB ACC.1 MOV IO_STATUS,A ACALL ENVIA_IO RET
51
Anexo 6
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;SIMUL.ASM ;Código Fonte final sistema automação residencial ;Autor: Bruno Schwab de Figueiredo ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ $MOD51 ;===================DEFINIÇÕES INICIAIS================================== TEMP_R EQU 0F000h ;SETPOINT DE TEMPERATURA LIGHT_R EQU 0F001h ;SETPOINT DE LUMINOSIDADE CURRENT EQU 0F002h ;INTERFACE DE CONFIGURAÇÃO SMT_PIN EQU P3.4 ;PINO INSERÇÃO SMARTSOCKET SEL EQU P1.4 ;BOTÃO DE CONFIGURAÇÃO CUR_U EQU P1.5 ;BOTÃO DE INCREMENTOI CUR_D EQU P1.7 ;BOTÃO DE DECREMENTO ;==================DEFINIÇÕES CONVVERSOR A/D ============================ PDCON EQU 0F1H ADMUX EQU 0D7H ADRESL EQU 0D9H ADRESH EQU 0DBH ADCON0 EQU 0DCH ADCON1 EQU 0DDH ADCON2 EQU 0DEH ADCON3 EQU 0DFH ACLK EQU 0F6H AIE EQU 0A6H org 0000h LJMP INICIO ;===================CONFIGURAÇÕES INICIAIS DO SISTEMA =================== INICIO: ACALL CONFIG_SERIAL
ACALL InitLCD ACALL StartTMP123 ACALL LoadTMP123 CLR SMT_PIN MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG3 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE MOV DPTR,#MSG3 ACALL WrStr MOV CURRENT,#0 MOV TEMP_R, #25 MOV LIGHT_R,#100 ACALL InitI2C
52
ACALL InitPCF8574 SETB P2.6 ;DESLIGA BUZZER ACALL DELAY500ms ;==========================LOOP PRINCIPAL DE CONTROLE ================== MAIN: ACALL VERIFICA_TECLADO ACALL VERIFICA_TEMPERATURA ACALL Delay1000ms ACALL VERIFICA_TECLADO ACALL VERIFICA_CARTAO ACALL Delay1000ms ACALL VERIFICA_TECLADO ACALL VERIFICA_AD ACALL Delay1000ms LJMP MAIN ;===================ROTINAS DE INPUT E CONFIGURAÇÃO=================== VERIFICA_TECLADO: JNB SEL,CFG_SHOW_0 RET CFG_SHOW_0: MOV A,(CURRENT) CJNE A,#0,CFG_SHOW_1 INC A MOV (CURRENT),A MOV DPTR,#MSG1 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG1 ACALL WrStr LJMP CONFIG_TEMPERATURA RET CFG_SHOW_1: MOV A,(CURRENT) CJNE A,#1,CFG_SHOW_2 INC A MOV (CURRENT),A MOV DPTR,#MSG2 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG2 ACALL WrStr LJMP CONFIG_LUMINOSIDADE RET CFG_SHOW_2:
53
MOV A,(CURRENT) CJNE A,#2,CFG_SHOW_3 INC A MOV (CURRENT),A MOV DPTR,#MSG6 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG6 ACALL WrStr ACALL Delay1000ms RET CFG_SHOW_3: MOV (CURRENT),#0 LJMP MAIN CONFIG_TEMPERATURA: MOV A,#0 ACALL MovCur2 MOV A,TEMP_R ACALL FORMAT MOV A,R7 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV A,R6 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV A,R5 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV DPTR,#MSG8 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE MOV DPTR,#MSG8 ACALL WrStr ACALL Delay1000ms JNB CUR_U,CFG_TEMP_UP JNB CUR_D,CFG_TEMP_DOWN ACALL Delay500ms RET CFG_TEMP_UP: MOV A,TEMP_R INC A MOV (TEMP_R),A CJNE A,#50,CONFIG_TEMPERATURA MOV A,#0 MOV (TEMP_R),A LJMP CONFIG_TEMPERATURA
54
CFG_TEMP_DOWN: MOV A,TEMP_R DEC A MOV (TEMP_R),A CJNE A,#0,CONFIG_TEMPERATURA MOV A,#49 MOV (TEMP_R),A LJMP CONFIG_TEMPERATURA CONFIG_LUMINOSIDADE: MOV A,#0 ACALL MovCur2 MOV A,LIGHT_R ACALL FORMAT MOV A,R7 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV A,R6 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV A,R5 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV DPTR,#MSG9 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE MOV DPTR,#MSG9 ACALL WrStr ACALL Delay1000ms JNB CUR_U,CFG_LIGHT_UP JNB CUR_D,CFG_LIGHT_DOWN ACALL Delay500ms RET CFG_LIGHT_UP: MOV A,LIGHT_R INC A MOV (LIGHT_R),A CJNE A,#255,CONFIG_LUMINOSIDADE MOV A,#0 MOV (LIGHT_R),A LJMP CONFIG_LUMINOSIDADE CFG_LIGHT_DOWN: MOV A,LIGHT_R DEC A MOV (LIGHT_R),A CJNE A,#0,CONFIG_LUMINOSIDADE MOV A,#255 MOV (LIGHT_R),A LJMP CONFIG_LUMINOSIDADE ;======================================================================
55
;==================ROTINAS DE CONTROLE DE TEMPERATURA ============== VERIFICA_TEMPERATURA: ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG10 ACALL WrStr MOV A,#0 ACALL MovCur2 PUSH TEMP_R PUSH LIGHT_R PUSH CURRENT PUSH IO_STATUS ACALL GetTMP123 PUSH ACC ACALL Convert_TMP123 POP ACC POP IO_STATUS POP CURRENT POP LIGHT_R POP TEMP_R ;============CONTROLE ;se nivel de temperatura for maior, liga rele PUSH ACC SUBB A,TEMP_R JNC LIGA_TEMP ACALL DESLIGA_RELE2 CONTINUA_CONTROLE_TEMP: POP ACC ;=================== MOV A,R7 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV A,R6 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV A,R5 ACALL ESCREVE_SERIAL_REG ACALL WrChar MOV DPTR,#MSG16 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE MOV DPTR,#MSG16 ACALL WrStr ACALL LoadTMP123 RET LIGA_TEMP: ACALL LIGA_RELE2 LJMP CONTINUA_CONTROLE_TEMP ;========================== ROTINAS SMARTCARD =========================
56
VERIFICA_CARTAO: JB SMT_PIN,LE_CARTAO ; Se o cartao foi inserido, desvia ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG12 ACALL WrStr MOV DPTR,#MSG12 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE RET LE_CARTAO: ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG11 ACALL WrStr MOV DPTR,#MSG11 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE ACALL Delay100ms ACALL Read24LC CJNE A,#46h,CARTAO_ERRO ; Se o codigo for 46h, continua, senao erro MOV A,#0 ACALL MovCur2 MOV DPTR,#MSG13 ACALL WrStr MOV DPTR,#MSG13 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE RET CARTAO_ERRO: MOV A,#0 ACALL MovCur2 MOV DPTR,#MSG14 ACALL WrStr MOV DPTR,#MSG14 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE RET ;================================================================== ;================= ROTINAS SENSOR DE LUMINOSIDADE ============ VERIFICA_AD: ACALL ClearLCD MOV A,#0 ACALL MovCur1 MOV DPTR,#MSG15 ACALL WrStr MOV DPTR,#MSG15 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE
57
MOV A,#0 ACALL MovCur2 ACALL INITADC0 ACALL READAD8bits MOV B,A MOV A,#255 SUBB A,B ;============ CONTROLE ;se nivel luz (A) for menor que LIGHT_R, liga rele PUSH ACC SUBB A,LIGHT_R JC LIGA_LUZ ACALL DESLIGA_RELE1 CONTINUA_CONTROLE_LUZ: POP ACC ;=================== PUSH TEMP_R PUSH LIGHT_R PUSH CURRENT PUSH IO_STATUS ACALL FORMAT MOV A,R7 ACALL WrChar ACALL ESCREVE_SERIAL_REG MOV A,R6 ACALL WrChar ACALL ESCREVE_SERIAL_REG MOV A,R5 ACALL WrChar ACALL ESCREVE_SERIAL_REG MOV DPTR,#MSG9 ACALL WrStr MOV DPTR,#MSG9 ACALL ESCREVE_SERIAL_DPTR ACALL SERIAL_NEWLINE POP IO_STATUS POP CURRENT POP LIGHT_R POP TEMP_R ACALL Delay1000ms LJMP MAIN LIGA_LUZ: ACALL LIGA_RELE1 LJMP CONTINUA_CONTROLE_LUZ ;=========== ROTINA PARA SEPARAR ALGARISMOS DECIMAIS FORMAT:
MOV B,#100 DIV AB ADD A,#'0' MOV R7,A
58
MOV A,B MOV B,#10 DIV AB ADD A,#'0' MOV R6,A MOV A,B ADD A,#'0' MOV R5,A RET ;====== BIBLIOTECAS DE INCLUSÃO ========================== $INCLUDE(seriaL~1.ASM) ;ROTINAS DE I/O SERIAL $INCLUDE(CONFIG~1.ASM) ;CONIGURAÇÃO DA PORTA SERIAL $INCLUDE(DELAY.INC) ;ROTINAS DE DELAY $INCLUDE(LCD.INC) ;ROTINAS DE CONFIGURAÇÃO E I/O DO LCD $INCLUDE(TMP123.ASM) ;ROTINAS DE AQUISIÇÃO DE TEMPERATURA $INCLUDE(24LC02~1.asm) ;ROTINAS DE LEITURA DO SMARTCARD $INCLUDE(AD_DA.INC) ;ROTINAS DE LEITURA DO CONVERSOR A/D $INCLUDE(I2C.inc) ;ROTINAS DE COMUNICAÇÃO I2C $INCLUDE(RELE.asm) ;ROTINAS DE ACIONAMENTO DO RELÉ PELO EXPANSOR ;=========== MENSAGENS DIVERSAS ========================= MSG1: DB 'Setup Temperatura: ',0 MSG2: DB 'Setup Luminosidade: ',0 MSG3: DB 'Sistema ativo',0 MSG4: DB 'Sistema Inativo',0 MSG5: DB 'Sistema Iniciado',0 MSG6: DB 'Status SMARTCARD:',0 MSG7: DB 'Config OK',0 MSG8: DB ' o C (1-49)',0 MSG9: DB ' (0-255)',0 MSG10: DB 'Temperatura Atual',0 MSG11: DB 'SMARTCARD Inserido',0 MSG12: DB 'SMARTCARD Nao Inserido',0 MSG13: DB 'Acesso Garantido',0 MSG14: DB 'Acesso Negado',0 MSG15: DB 'Taxa Luminosidade:',0 MSG16: DB ' o C',0 END
59
Anexo 7
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@ serial_IO ;@ Rotina para escrever mensagens e ler a serial previamente configurada. ;@ ;@ ESCREVE_SERIAL_DPTR -> Manda para a porta de saída serial os dados contidos no registrador ; DPTR ;@ ESCREVE_SERIAL_REG -> Manda para a porta de saida serial os dados contidos no registrador -A- ;@ LER_SERIAL -> Quando a rotina é chamada, ela armazena no registrador -A- o byte de entrada. ;@ SERIAL_NEWLINE -> Muda a linha ;@ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;============================================================== ;======================== ESCREVE_SERIAL_DPTR ================= ; ;Escreve os dados contidos em DPTR para a porta serial ;ADDCHARSERIAL adiciona caractere a caractere na porta serial ADDCHARSERIAL: JNB TI, ADDCHARSERIAL ; Espera liberar a porta CLR TI ; Indica porta ocupada MOV SBUF,A ; Escreve na porta serial RET ; Escreve uma mensagem: DPTR aponta para a mensagem ESCREVE_SERIAL_DPTR: CLR A MOVC A,@A+DPTR ; Pega letra da mensagem INC DPTR JZ EXIT_SERIAL ; Zero final: sai ACALL ADDCHARSERIAL ; Escreve a letra SJMP ESCREVE_SERIAL_DPTR EXIT_SERIAL: RET ;============================================================== ;======================== ESCREVE_SERIAL_REG ================= ; ;Escreve os dados contidos em REGISTRADOR_MSG_SERIAL para a porta serial ESCREVE_SERIAL_REG: JNB TI,ESCREVE_SERIAL_REG CLR TI MOV SBUF,A RET
60
;============================================================== ;======================== LER_SERIAL=========================== ; ;Escreve no registrador A o dado de entrada da porta serial LER_SERIAL: JNB RI, LER_SERIAL CLR RI MOV A, SBUF RET ESCREVE_SERIAL_BIN: MOV R2,#8 ; Conta 8 voltas do loop ESB1: RLC A ; Pega 1 bit de A PUSH ACC ; Salva A na pilha CLR A ADDC A,#'0' ; Converte carry para '0' ou '1' ACALL ADDCHARSERIAL ; Escreve digito binario POP ACC ; Restaura A DJNZ R2,ESB1 ; Repete 8 vezes RET SERIAL_NEWLINE: MOV A,#13 ACALL ESCREVE_SERIAL_REG RET ;============================================================== ;===================FIM ESCREVE_SERIAL=========================
61
Anexo 8
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@ config_serial ;@ Rotina para configurar a porta de comunicação serial ;@ ;@ CONFIG_SERIAL -> Deve ser chamada uma unica vez para que seja configurado os registradores seriais ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;============================================================== ;====================== CONFIG_SERIAL ========================= ; ;Rotina de configuração da porta de comunicação serial CONFIG_SERIAL: ;Timer 1 em modo 2 (8 bits com auto recarga) MOV SCON,#01011010B ; UART de 8 bits sem paridade MOV PCON,#0 ; Para 19200 baud PCON=80H ANL TMOD,#0FH ; Apaga os bits do timer1 ORL TMOD,#20H ; Coloca timer1 em modo 2 MOV TCON,#11010010B MOV TH1,#-3 RET ;============================================================== ;====================FIM CONFIG_SERIAL=========================
62
Anexo 9 ; Rotinas de Delay ; ; Os exemplos aqui descritos se referem ao microcontrolador ; MSC1211. Este microcontrolador é idêntico ao 8051 em ; hardware e software, porém é mais rápido! Cada ciclo do ; MSC dura 4 pulsos de clock (12 são necessários para 8051). ; ; Considere que o clock da máquina é de 11.0592MHz. Então, ; cada ciclo de máquina dura 0.361689us! Considere também ; que estas rotinas foram escritas para usar o banco 0! Modifique ; os exemplos para elaborar outras rotinas que forem necessárias. ; ; Como sugestão, crie uma biblioteca destas rotinas e as coloque ; em um arquivo do tipo include (.inc) com o nome DELAY.INC. ; Adicione então esta biblioteca ao final do programa com a ; seguinte linha de comando: ; ; $INCLUDE(DELAY.INC) ; ; ; PRIMITIVAS ; ; DELAY2us() - Delay não parametrizável de 2us. ; DELAY5us() - Delay não parametrizável de 5us. ; DELAY250us() - Delay não parametrizável de 250us. ; DELAY1ms() - Delay não parametrizável de 1ms. ; DELAY5ms() - Delay não parametrizável de 5ms. ; DELAY10ms() - Delay não parametrizável de 10ms. ; DELAYx10ms(A) - Delay parametrizável de 10ms. Parametro passado em A. ; DELAY100ms() - Delay não parametrizável de 100ms. ; DELAYx100ms(A) - Delay parametrizável de 100ms. Parametro passado em A. ; DELAY200ms() - Delay não parametrizável de 200ms. ; DELAY500ms() - Delay não parametrizável de 500ms. ; DELAY1000ms() - Delay não parametrizável de 1000ms. ; ; *** DELAY 2us *********************************** ************************* ; ** ** ; *********************************** [ MSC1211 @ 1 1.0592MHz = 6 CICLOS] *** ; DELAY2us: NOP NOP RET ; *** DELAY 5us *********************************** ************************* ; ** ** ; ***********************************[ MSC1211 @ 11 .0592MHz = 14 CICLOS] ***
63
; DELAY5us: PUSH 07H ; SALVA R7 (CONTADOR!!!) MOV R7,#4 ; INICIALIZA CONTADOR _LOOP5us: DJNZ R7,_LOOP5us NOP ; Para minimizar erro de truncamento!!! POP 07H ; RESTAURA VALOR DE R7 RET ; RETORNA ; *** DELAY 250us ********************************* ************************* ; ** ** ; **********************************[ MSC1211 @ 11. 0592MHz = 691 CICLOS] *** ; DELAY250us: PUSH 07H MOV R7,#228 _LOOP250us: NOP DJNZ R7,_LOOP250us POP 07H RET ; *** DELAY 1ms *********************************** ************************* ; ** Baseada na rotina de 250us! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAY1ms: PUSH 07H MOV R7,#4 _LOOP1ms: LCALL DELAY250us ; Aguarda 250us!!! DJNZ R7,_LOOP1ms ; Repete 4x POP 07H RET ; *** DELAY 2ms *********************************** ************************* ; ** Baseada na rotina de 250us! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAY2ms: PUSH 07H MOV R7,#8 _LOOP2ms: LCALL DELAY250us ; Aguarda 250us!!! POP 07H RET ; *** DELAY 5ms *********************************** ************************* ; ** Baseada na rotina de 250us! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAY5ms: PUSH 07H MOV R7,#20
64
_LOOP5ms: LCALL DELAY250us ; Aguarda 250us!!! DJNZ R7,_LOOP5ms ; Repete 20x POP 07H RET ; *** DELAY 10ms ********************************** ************************* ; ** Baseada na rotina de 250us! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAY10ms: PUSH 07H MOV R7,#40 _LOOP10ms: LCALL DELAY250us ; Aguarda 250us!!! DJNZ R7,_LOOP10ms ; Repete 4x POP 07H RET ; *** DELAYx10ms(A) ******************************* ************************* ; ** Baseada na rotina de 10ms! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAYx10ms: PUSH 07H MOV R7,A _LOOPx10ms: LCALL DELAY10ms ; Aguarda 250us!!! POP 07H RET ; *** DELAY 100ms ********************************* ************************* ; ** Baseada na rotina de 5ms! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAY100ms: PUSH 07H MOV R7,#20 _LOOP100ms: LCALL DELAY5ms ; Aguarda 5ms!!! DJNZ R7,_LOOP100ms ; Repete 20x POP 07H RET ; *** DELAYx100ms(A) ****************************** ************************* ; ** Baseada na rotina de 100ms! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAYx100ms: PUSH 07H MOV R7,A _LOOPx100ms: LCALL DELAY100ms ; Aguarda 5ms!!!
65
DJNZ R7,_LOOPx100ms ; Repete 20x POP 07H RET ; *** DELAY 200ms ********************************* ************************* ; ** Baseada na rotina de 5ms! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAY200ms: PUSH 07H MOV R7,#40 _LOOP200ms: LCALL DELAY5ms ; Aguarda 5ms!!! DJNZ R7,_LOOP200ms ; Repete 40x POP 07H RET ; *** DELAY 500ms ********************************* ************************* ; ** Baseada na rotina de 5ms! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAY500ms: PUSH 07H MOV R7,#100 _LOOP500ms: LCALL DELAY5ms ; Aguarda 5ms!!! DJNZ R7,_LOOP500ms ; Repete 100x POP 07H RET ; *** DELAY 1000ms ******************************** ************************* ; ** Baseada na rotina de 5ms! ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; DELAY1000ms: PUSH 07H MOV R7,#200 _LOOP1000ms: LCALL DELAY5ms ; Aguarda 5ms!!! DJNZ R7,_LOOP1000ms ; Repete 100x POP 07H RET
66
Anexo 10 ; DISPLAY LCD ; ; Os Display LCDs do tipo Texto tem uma interface de comunicação padrão ; composta de um barramento de dados de 8 bits e de três sinais de ; controle: RS, R/W e E. Estes dispositivos permitem a conexão à um uC ; através de um barramento de 4 bits ou de 8 bits. Os exemplos mostrados ; aqui são apenas para interfaces de 8 bits. O sinal E é o Chip Select ; (Ativo Alto) do LCD. O sinal RS é utilizado para sinalizar que os ; dados recebidos são comandos para o display (RS = 0) ou são caracteres ; a serem impressos (RS = 1). Para maiores detalhes, veja a TEMPORIZAÇÃO ; apresentada a seguir. O sinal R/W permite ao uC ler (R/W = 1) ou ; escrever (R/W = 0) no display. Nos exemplos apresentados aqui, o uC ; somente escreve no display e portanto o R/W está conectado ao GND! A ; alimentação do display é 5V e o pino VO é utilizado para ajustar o ; contraste do display. Isto é feito utilizando um trimpot de 10k a 50k, ; conforme ilustra o circuito elétrico. ;; ; Para mover o cursor no display, um comando específico deve ser enviado ; para o display, o qual relaciona a linha e a coluna com um endereço na ; RAM de dados do LCD. Estes endereços estão listados a seguir: ; ; Endereços para um display de 2 linhas ; +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ; |80|81|82|83|84|85|86|87|88|89|8A|8B|8C|8D|8E|8F| Linha 1 ; |C0|C1|C2|C3|C4|C5|C6|C7|C8|C9|CA|CB|CC|CD|CE|CF| Linha 2 ; +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ; ; Endereços para um display de 4 linhas ; +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ; |80|81|82|83|84|85|86|87|88|89|8A|8B|8C|8D|8E|8F| Linha 1 ; |90|91|92|93|94|95|96|97|98|99|9A|9B|9C|9D|9E|9F| Linha 2 ; |C0|C1|C2|C3|C4|C5|C6|C7|C8|C9|CA|CB|CC|CD|CE|CF| Linha 3 ; |D0|D1|D2|D3|D4|D5|D6|D7|D8|D9|DA|DB|DC|DD|DE|DF| Linha 4 ; +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ; ; Comandos são utilizados pelo uC para programar o LCD. O uC vai enviar um ; comando quando quiser por exemplo, limpar o display, mudar de linha, ; trocar o status do cursor, etc. A tabela a seguir apresenta os comandos ; básicos: ; ; COMANDOS ESSENCIAIS ; +-------------------------+----------------------------------------------+ ; | 0 0 0 0 0 0 0 1 | Clear Display - Display Home (1,1) | ; +-------------------------+----------------------------------------------+ ; | 0 0 0 0 0 0 1 0 | Display Home (1,1) | ; +-------------------------+----------------------------------------------+ ; | 0 0 0 0 0 1 ID SH | ID = 0 -> Cursor para esquerda | ; | | ID = 1 -> Cursor para direita | ; | | SH = 0 -> Display sem Shift | ; | | ID = 1 -> Display com Shift | ; +-------------------------+----------------------------------------------+ ; | 0 0 0 0 1 D C B | D = 0 -> Display OFF |
67
; | | D = 1 -> Display ON | ; | | C = 0 -> Cursor OFF | ; | | C = 1 -> Cursor ON | ; | | B = 0 -> Cursor Fixo | ; | | B = 1 -> Cursor Piscante | ; +-------------------------+----------------------------------------------+ ; | 0 0 1 DL N F 0 0 | DL = 0 -> Interface 4 bits | ; | | DL = 1 -> Interface 8 bits | ; | | N = 0 -> Display 1 Linha | ; | | N = 1 -> Display 2/4 Linhas | ; | | F = 0 -> Matriz 5x8 (1 Caracter/Linha) | ; | | F = 1 -> Matriz 5x11 (1 Caracter/2 Linhas) | ; +-------------------------+----------------------------------------------+ ; ; Para o Display LCD funcionar é necessário um processo de inicialização, ; composta de uma sequencia de comandos a serem enviados para o display. A ; sequencia de Inicialização é : 38h, 38h, 38h, 0Eh, 06h, 01h a qual ; inicializa o display na seguinte condição: ; ; Interface de 8 bits, 2/4 Linhas, Caracter 5x8, Cursor para Direita, ; Sem Shift, Display ON, Cursor ON, Cursor Fixo, Clear Display! ; ; ; PRIMITIVAS ; ; Wrcom(A) - Escrever Comando passado no Acumulador. ; Wrchar(A) - Escrever Caracter passado no Acumulador. ; InitLCD() - Inicializa Display. ; WrStr(DPTR) - Escreve String passada em DPTR. ; MovCur1(A) - Move Cursor na Linha 1, para posição passada no acumulador. ; MovCur2(A) - Move Cursor na Linha 2, para posição passada no acumulador. ; MovCur3(A) - Move Cursor na Linha 3, para posição passada no acumulador. ; MovCur4(A) - Move Cursor na Linha 4, para posição passada no acumulador. ; ClearLCD() - Apaga Display ; CursorON() - Mostra Cursor Fixo. ; CurBlink() - Mostra Cursor Piscante. ; CurHide() - Esconde Cursor. ; WrCGRAM() - Cria 8 caracteres especiais nos enderecos 00..07h ; ; Obs.: As rotinas de LCD utilizam a biblioteca "Delay" para temporização! ; Exemplo de rotinas de Display LCD TEXTO de 1, 2 ou 4 linhas, com 16/20/24 ; caracteres e interface de 8 bits! ; DADOS EQU P0 ; DEFINIÇÃO DOS PINOS. DEPENDE DO HW!!! E EQU P3.6 RS EQU P3.7 ; *** Wrcom(A) ************************************ ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; Wrcom: MOV DADOS,A ; Escreve comando no barramento de dados CLR RS ; Coloca no modo comando SETB E
68
LCALL DELAY5us CLR E LCALL DELAY10ms RET ; *** Wrchar(A) *********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; Wrchar: MOV DADOS,A ; Escreve caracter no barramento de dados SETB RS ; Coloca no modo caracter SETB E LCALL DELAY5us CLR E LCALL DELAY10ms RET ; *** InitLCD() *********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; InitLCD: MOV A,#38H ; Envia sequência de inicialização LCALL Wrcom ; 38h,38h,38h,0Eh,06h,01h LCALL Wrcom LCALL Wrcom MOV A,#0EH LCALL Wrcom MOV A,#06H LCALL Wrcom MOV A,#01H LCALL Wrcom RET ; *** WrStr(DPTR) ********************************* ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; WrStr: MOV A,#0 ; Ajusta offset do Ponteiro MOVC A,@A+DPTR ; Verifica se chegou o fim de string (0) CJNE A,#0,Wrstring RET Wrstring: LCALL Wrchar ; Escreve caracter INC DPTR ; Incrementa o ponteiro LJMP Wrstr ; repete escrita até terminar ; *** MovCur1(A) ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; MovCur1: ADD A,#80H ; Posiciona curso na linha 1, coluna A LCALL Wrcom
69
RET ; *** MovCur2(A) ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; MovCur2: ADD A,#0C0H ; Posiciona curso na linha 2, coluna A LCALL Wrcom RET ; *** MovCur3(A) ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; MovCur3: ADD A,#90H ; Posiciona curso na linha 3, coluna A LCALL Wrcom RET ; *** MovCur4(A) ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; MovCur4: ADD A,#0D0H ; Posiciona curso na linha 4, coluna A LCALL Wrcom RET ; *** ClearLCD() ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; ClearLCD: MOV A,#01H ; Limpa o LCD LCALL Wrcom RET ; *** CursorON() ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; CursorON: MOV A,#0EH ; Liga curso em modo não piscante LCALL Wrcom RET ; *** CurBlink() ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; CurBlink: MOV A,#0FH ; Liga cursor em modo piscante LCALL Wrcom RET
70
; *** CurHide() *********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; CurHide: MOV A,#0CH ; Esconde o cursor LCALL Wrcom RET ; *** WrCGRAM() *********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; WRCGRAM: PUSH 07H MOV DPTR,#TABCGRAM MOV R7,#64 ; TAMANHO DA TABELA DE DADOS MOV A,#40H ; POSICAO DA CGRAM LCALL WRCOM LOOPCGRAM: MOV A,#0 MOVC A,@A+DPTR ; BUSCA NA TABELA DE PONTOS INC DPTR LCALL WRCHAR DJNZ R7,LOOPCGRAM MOV A,#80H LCALL WRCOM POP 07H RET ; ; TABELA DO GERADOR DE CARACTERES ESPECIAIS ; ; Esta tabela está vazia e deve ser preenchida pelo usuário. Cada linha ; (8 bytes) é responsável por gerar um caracter na forma de uma matriz ; 7x5. Os últimos 3 bytes de cada linha não são utilizados e só foram ; colocados para facilitar a escrita da rotina de gravação da CGRAM! ; Os bits mais significativos de cada byte também não são considerados. ; Uma vez inicializada a CGRAM, o usuário poderá mostrar estes ; caracteres chamando a função WRCHAR como os caracteres 00H a 07H. ; ; bloco de 8 bytes ; +-+-+-+-+-+-+-+-+ ; |x|x|x|x|x|x|x|x| ; |0|0|0|0|0|x|x|x| ; |0|1|0|1|0|x|x|x| ; |1|1|1|1|1|x|x|x| ; |1|1|1|1|1|x|x|x| ; |0|1|1|1|0|x|x|x| ; |0|0|1|0|0|x|x|x| ; |0|0|0|0|0|x|x|x| ; +-+-+-+-+-+-+-+-+ ; TABCGRAM: DB 0AH,1FH,0EH,1FH,02H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H
71
DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H
72
Anexo 11 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; tmp123.asm ; Autor: Bruno Schwab de Figueiredo ; ; Rotinas: ; StartTMP123 -> Rotina opcional para configurar pinos VCC e GND ; LoadTMP123 -> Faz o componente armazenar em memoria temperatura ** ; GetTMP123 -> Registra no acumulador o valor da temperatura em hexa ; ConvertTMP123 -> Registra em R5 R6 e R7 digitos da temperatura ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;GND EQU PX.X (Nao incluso pois GND FIXO) VCC EQU P2.6 SO EQU P2.4 SCL EQU P2.2 CS EQU P2.0 StartTMP123: SETB VCC ;CLR GND (Não incluso pois GND FIXO) RET LoadTMP123: SETB CS SETB SCL MOV A,#3 ACALL DELAYx100ms RET ;===================COLOCA em A valor de temp em hexa GetTMP123: MOV R7,#8 CLR SCL CLR CS MOV C,SO LOOPHTmp123: SETB SCL LCALL DELAY2us MOV C,SO LCALL DELAY5us CLR SCL LCALL DELAY5us RLC A DJNZ R7,LOOPHTmp123; MOV R1,A MOV R7,#8 SETB SCL LCALL DELAY2us
73
CLR SCL MOV C,SO LOOPLTmp123: SETB SCL LCALL DELAY2us MOV C,SO LCALL DELAY5us CLR SCL LCALL DELAY5us RLC A DJNZ R7,LOOPLTmp123 MOV R3,#00h MOV R2,#80h ACALL UDIV16 MOV A,R0 RET UDIV16:
mov r7, #0 mov r6, #0 mov B, #16 div_loop:
clr C mov a, r0 rlc a mov r0, a mov a, r1 rlc a mov r1, a mov a, r6 rlc a mov r6, a mov a, r7 rlc a mov r7, a mov a, r6 clr C subb a, r2 mov dpl, a mov a, r7 subb a, r3 mov dph, a cpl C jnc div_1 mov r7, dph mov r6, dpl div_1: mov a, r4 rlc a mov r4, a mov a, r5 rlc a mov r5, a djnz B, div_loop mov a, r5
74
mov r1, a mov a, r4 mov r0, a mov a, r7 mov r3, a mov a, r6 mov r2, a ret Convert_TMP123: MOV B,#100 DIV AB ADD A,#'0' MOV R7,A MOV A,B MOV B,#10 DIV AB ADD A,#'0' MOV R6,A MOV A,B ADD A,#'0' MOV R5,A RET
75
Anexo 12 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;24LC02READ.asm ; Este programa lê o endereço xxx da memória e registra o byte no registrador A ;Autor: Bruno Schwab de Figueiredo ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ $INCLUDE(I2CSMT.asm) Read24LC: ACALL _StartI2C MOV A,#0A0h ;slave address write ACALL _WriteI2C ACALL _RecvACK CONT1: MOV A,#25h ;endereço ACALL _WriteI2C ACALL _RecvACK CONT2: ACALL _StartI2C MOV A,#0A1h ;slave address read ACALL _WriteI2C ACALL _RecvACK CONT3: ACALL _ReadI2C ACALL _StopI2C RET
76
Anexo 13 ; ROTINAS DE I2C com Temporização STANDARD. ; ; PRIMITIVAS ; ; InitI2C() - Coloca na condição inicial a interface I2C. ; StartI2C() - Da o processo de "START" do I2C. ; StopI2C() - Do o processo de "STOP" do I2C. ; WriteI2C(A) - Escreve um byte passado em A no I2C. ; ReadI2C(A) - Le um byte no I2C. Devolve valor em A. ; RecvACK() - Le um bit de Acknowledge. Valor esta armazenado no Carry. ; SendACK() - Envia um bit de Acknowledge (0). ; SendNAK() - Envia um bit de não Acknowledge (1). ; ; Obs.: As rotinas de LCD utilizam a biblioteca "Delay" para temporização! ; SDA2 EQU P1.0 SCL2 EQU P1.1 ; *** InitI2C() *********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; InitI2C: SETB SDA2 SETB SCL2 RET ; *** StartI2C() ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; StartI2C: SETB SDA2 LCALL DELAY5us SETB SCL2 LCALL DELAY5us CLR SDA2 LCALL DELAY5us CLR SCL2 LCALL DELAY5us RET ; *** StopI2C() *********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; StopI2C: CLR SDA2
77
LCALL DELAY5us SETB SCL2 LCALL DELAY5us SETB SDA2 LCALL DELAY5us RET ; *** WriteI2C(A) ********************************* ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; WriteI2C: PUSH 07 ; CONTADOR. CONTROLA ENVIO DE 8 BITS! MOV R7,#8 LOOPWRI2C: RLC A ; LOOP DE ENVIO. UTILIZA CARRY PARA WR JC SENDBIT1 CLR SDA2 LCALL DELAY5us LJMP NEXTWR SENDBIT1: SETB SDA2 LCALL DELAY5us NEXTWR: SETB SCL2 LCALL DELAY5us CLR SCL2 LCALL DELAY5us DJNZ R7,LOOPWRI2C POP 07H RET ; *** ReadI2C(A) ********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; ReadI2C: PUSH 07H ; CONTADOR. CONTROLA RECEBIMENTO DE 8 BITS MOV R7,#8 SETB SDA2 ; SDA VIRA ENTRADA!!! MOV C,SDA2 LOOPRDI2C: SETB SCL2 ; LOOP DE RECEBIMENTO. UTILIZA CARRY P/RD LCALL DELAY2us MOV C,SDA2 LCALL DELAY5us CLR SCL2 LCALL DELAY5us RLC A DJNZ R7,LOOPRDI2C POP 07H RET
78
; *** Rdbit() ************************************* ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; RecvACK: SETB SDA2 ; SDA VIRA ENTRADA!!! MOV C,SDA2 SETB SCL2 ; LE BIT DE ACK LCALL DELAY2us MOV C,SDA2 LCALL DELAY5us CLR SCL2 LCALL DELAY5us RET ; *** SendACK() *********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; SendACK: CLR SDA2 SETB SCL2 LCALL DELAY5us CLR SCL2 LCALL DELAY5us RET ; *** SendNAK() *********************************** ************************* ; ** ** ; **********************************************[ M SC1211 @ 11.0592MHz ] *** ; SendNAK: SETB SDA2 SETB SCL2 LCALL DELAY5us CLR SCL2 LCALL DELAY5us RET
79
Anexo 14 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;Rotina similar à I2C.inc, porém como há um dispositivo I2C soldado na placa sem possibilidade ;de expansão do barramento, foi criado outro barramento secundário I2C. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ _SDA EQU P0.1 _SCL EQU P3.3 _StartI2C: SETB _SDA LCALL DELAY5us SETB _SCL LCALL DELAY5us CLR _SDA LCALL DELAY5us CLR _SCL LCALL DELAY5us RET _WriteI2C: PUSH 07 ; CONTADOR. CONTROLA ENVIO DE 8 BITS! MOV R7,#8 _LOOPWRI2C: RLC A ; LOOP DE ENVIO. UTILIZA CARRY PARA WR JC _SENDBIT1 CLR _SDA LCALL DELAY5us LJMP _NEXTWR _SENDBIT1: SETB _SDA LCALL DELAY5us _NEXTWR: SETB _SCL LCALL DELAY5us CLR _SCL LCALL DELAY5us DJNZ R7,_LOOPWRI2C POP 07H RET _RecvACK: SETB _SDA ; SDA VIRA ENTRADA!!! MOV C,_SDA SETB _SCL ; LE BIT DE ACK LCALL DELAY2us MOV C,_SDA LCALL DELAY5us CLR _SCL LCALL DELAY5us RET _ReadI2C: PUSH 07H ; CONTADOR. CONTROLA RECEBIMENTO DE 8 BITS MOV R7,#8
80
SETB _SDA ; SDA VIRA ENTRADA!!! MOV C,_SDA _LOOPRDI2C: SETB _SCL ; LOOP DE RECEBIMENTO. UTILIZA CARRY P/RD LCALL DELAY2us MOV C,_SDA LCALL DELAY5us CLR _SCL LCALL DELAY5us RLC A DJNZ R7,_LOOPRDI2C POP 07H RET _StopI2C: CLR _SDA LCALL DELAY5us SETB _SCL LCALL DELAY5us SETB _SDA LCALL DELAY5us RET InitSMT: SETB _SDA SETB _SCL RET
81
8. Referências Bibliográficas [1] AD_DA.INC. Rotinas para ler conversor A/D. Autor: Júlio César de Marques Lima.
Linguagem: Assembler. Equipamento: MSC1211
[2] SERIAL_IO.ASM. Rotinas de input/output via porta serial. Autor:Marcos Augusto
Stemmer. Linguagem: Assembler: Equipamento: MSC1211
[3] CONFIG_SERIAL.ASM. Rotinas de configuração de comunicação serial. Autor: Marcos
Augusto Stemmer. Linguagem: Assembler. Equipamento: MSC1211
[4] DELAY.INC. Rotinas de delay. Autor: Júlio César de Marques Lima. Linguagem:
Assembler. Equipamento: MSC1211
[5] LCD.INC. Rotinas de configuração e output para display LCD. Autor: Júlio César de
Marques Lima. Linguagem: Assembler. Equipamento: MSC1211
[6] I2C.INC. Rotinas de comunicação por protocolo I2C. Autor: Júlio César de Marques
Lima. Linguagem: Assembler. Equipamento: MSC1211
[7] I2CSMT.INC. Rotinas de comunicação por protocolo I2C. Autor: Júlio César de
Marques Lima. Linguagem: Assembler. Equipamento: MSC1211