Campainha escolar com sinalização de emergência



Documentos relacionados
2 contatos, 10 A Conexão a parafuso Montagem em trilho 35 mm (EN 60715) Montagem em trilho 35 mm (EN 60715)

reversíveis, 8 A Plug-in/terminais a solda. 2 reversíveis 8/15 250/ AgNi

Contatos em AgNi, para comutação de cargas resistivas ou levemente indutivas, como cargas de motores fluorescente compacta (CFL) W

xxx.1xx xxx.4xx0. Contatos em AgNi, para comutação de cargas resistivas ou levemente indutivas, como cargas de motores

Contatos em AgNi, para comutação de cargas resistivas ou levemente indutivas, como cargas de motores

Contatos em AgNi, para comutação de cargas resistivas ou levemente indutivas, como cargas de motores fluorescente compacta (CFL) W

Baixo consumo Contatos dourados Montagem em circuito impresso 0.8. Vista lado cobre. 2 reversíveis 2/3 125/

NA Distância entre contatos abertos 3 mm Montagem em circuito impresso. Vista do lado do cobre

3.5 mm distância entre pinos 1 contato 10 A Montagem em circuito impresso ou bases série 95

Produtos Segmento Energia

Central de Detecção de Incêndio 4 Zonas Manual de Instalação

INFORMATIVO DE PRODUTO

Série 65 - Relé de potência A. Características. Conexão plug-in / Relé circuito impresso

Parallel to Serial Shifting IN

Corrente nominal 20 A Montagem na parte anterior/ Faston 250 (6.3x0.8 mm)

R:Benjamim Constant, 56 Tel:(11)

Corrente nominal 30 A Montagem na parte anterior Conexões Faston 250. Corrente nominal 30 A Montagem em circuito impresso - terminal duplo

Central de Alarme de Oito Zonas

Monitor de Rede Elétrica Som Maior Pro. Manual do Usuário Versão 3.9f

1 contato NA Montagem em trilho 35 mm Largura do módulo 17.5 mm fluorescente com reator eletrônico W CFL W LED 230 V W

1.3 Conectando a rede de alimentação das válvulas solenóides

Mini relé para circuito impresso 6 A

Fontes de Alimentação

ACENDENDO AS LUZES. Capitulo 2 - Aula 1 Livro: Arduino básico Tutor: Wivissom Fayvre

2 Zonas com capacidade de teste e inibição. 2 Circuitos de sirenes com capacidade de inibição. Fonte de alimentação de 24V/400mA com bateria de

Multimedidor de Grandezas Elétricas MD4040

2 reversíveis, 6 A 5 mm distância entre pinos Conexões para circuito impresso ou bases série 95

Tutorial de Eletrônica Aplicações com 555 v

2 reversíveis, 6 A 5 mm distância entre pinos Conexões para circuito impresso ou bases Série 95. 8/5 - (12/5 sensível) 8/5 - (12/5 sensível)

Manual de Instalação... 2 RECURSOS DESTE RELÓGIO REGISTRANDO O ACESSO Acesso através de cartão de código de barras:...

Dispositivos de Entrada e Saída

Alarme Programável para Ingestão de Medicamentos

CURSO OPERACIONAL TOPOLOGIA SISTEMA SIGMA 485-E

Hamtronix CONTROLE REMOTO DTMF. CRD200 - Manual de Instalação e Operação. Software V 2.0 Hardware Revisão B

Arduino e Proteus (Tutorial)

Controle universal para motor de passo

CAPÍTULO 5. INTERFACES PARA PERIFÉRICOS DE ARMAZENAMENTO INTERFACES DIVERSAS: FIREWIRE, SPI e I 2 C INTERFACES COM O MUNDO ANALÓGICO

Manual do instalador Box Output AC Rev Figura 01 Apresentação do Box Output AC.

SISTEMA DE MONITORAMENTO DIGITAL

Introdução. Criar um sistema capaz de interagir com o ambiente. Um transdutor é um componente que transforma um tipo de energia em outro.

Manual do instalador Box Output DC Rev Figura 01 Apresentação do Box Output DC.

Série 41 - Mini relé para circuito impresso A. Características. Conexão plug-in / Relé circuito impresso

reversíveis, 8 A Plug-in/terminais a solda. 2 reversíveis 8/15 250/ AgNi

Estabilizada de. PdP. Autor: Luís Fernando Patsko Nível: Intermediário Criação: 22/02/2006 Última versão: 18/12/2006

2 ou 3 contatos reversíveis Montagem para circuito impresso

contatos, 8 A Relé com contatos guiados. Conexão a parafuso. Montagem em trilho 35 mm (EN 60715)

Desenvolvimento de Módulo Wireless para Acionamento de Cargas via Porta Paralela

GREENLOAD CARGA ELETRÔNICA REGENERATIVA TRIFÁSICA

Manual de Instruções para a Placa de Testes da FPGA Max3064A da Altera

Programação de Robótica: Modo Circuitos Programados - Avançado -

Projeto de Circuitos. Introdução ao Computador 2008/01 Bernardo Gonçalves

0932 INF 01/12. Pág. 1 de 8

Quando comparado com uma chave mecânica, uma chave eletrônica apresenta vantagens e desvantagens.

Hera Indústria de Equipamentos Eletrônicos LTDA. Manual de Instalação e Operação. Discadora por Celular HERA HR2048.

W o r l d w i d e P a r t n e r

SÉRIE RB Relé biestável 8 A

3.1.6 Entradas digitais Quantidade: 8. Tipo: NPN / PNP conforme configuração, dividida em 2 grupos de 4 entradas. Impedância de entrada: 8.8KΩ.

FACILITY TOP HÍBRIDA. Manual Técnico MANUAL TÉCNICO AUTOMATIZADOR PARA PORTÕES DESLIZANTES MONDIALE. P Rev. 1

MULTÍMETRO DIGITAL DE BANCADA ITMD -100

CENTRAL DE ALARME DE incêndio MODELO NGSG101. Versão 1.03, Agosto 2006 ERP:

CONTROLADOR ELETRÔNICO DE AR CONDICIONADO. GL-T540 Painel de Controle

BLOCKGAS. Sistema de Monitoração e Alarme de vazamento de gás SB330. Este módulo é parte integrante do sistema de detecção de gás SB330.

Conheça o 4017 (ART062)

3.5 mm distância entre pinos 1 contato 12 A Para c.i. ou base série 95 A2 A

3. CARACTERÍSTICAS TÉCNICAS

Relé de Proteção do Motor RPM ANSI 37/49/50/77/86/94 CATÁLOGO. ELECTRON TECNOLOGIA DIGITAL LTDA Página 1/5

Uma Fonte de Alimentação para a Bancada de Eletronica

Medidores de nível de combustível LLS е LLS-AF 20310

Leandro N.Alem 1351/53 -(1871)- Dock Sud Buenos Aires - Argentina T.E.: / FAX: Web: MANUAL DE OPERAÇÃO

Referência: PDF EAB Revisão: 1 Arquivo : PDF doc Atualizado em: 07/07/2008

Prof. Antonio Carlos Santos. Aula 7: Polarização de Transistores

Contatores e Relés de Sobrecarga SIRIUS. Answers for Industry.

Módulos IP Configuração e Criação de Cenas

Battery Charger Wide operating supply range. Cordless Telephone (VCC=2V ~ 36V or ±1 ~ ±18V)

GUIA DO USUÁRIO. Monitor de Monóxido de Carbono de Mesa. Modelo CO50

Controle para Motores de Passo usando módulo USB-6008

Comando e Sinalização 3SB6. Catálogo resumido.

TUTORIAL DE UTILIZAÇÃO DE CERTIFICADOR DE CABEAMENTO

Série 48 - Relé modular de interface 8 A. Características SÉRIE

Modelo Tecnologia de Identificação Display Impressora. Gráfico; Gráfico; Alfanumérico; Gráfico; Alfanumérico; Alfanumérico; Alfanumérico;

Conhecendo o Proteus

ACIONAMENTOS ELETRÔNICOS (INVERSOR DE FREQUÊNCIA)

55.34T. SÉRIE 55 Relés para aplicação ferroviária 7 A. Conexões em base 4 contatos, 7 A

MANUAL DE INSTRUÇÕES

SÉRIE 65 Relé de potência A

Simulação de Circuitos Microcontrolados com o Proteus

2 contatos, 10 A Conexão a parafuso Montagem em trilho 35 mm (EN 60715) Montagem em trilho 35 mm (EN 60715)

ESPECIFICAÇÃO TECNICA EFA110F100-A-00

Easy Lab. Manual do usuário Revisão /11/14. DMA Electronics 1

SMART CONNECT X835 MANUAL DO USUÁRIO 2014 V1.1

2 contatos, 10 A Montagem para circuito impresso. 2 reversíveis 3 reversíveis 4 reversíveis Corrente nominal/máx corrente instantânea A

PAINEL DE SENHAS RBSG4JE. Imagem ilustrativa do painel. Operação/Configuração Painel Eletrônico de Senhas / Guichê com jornal de mensagens.

Manual Técnico Módulo Ponte H Dupla

Exercícios Leis de Kirchhoff

reversíveis, 6 A 5 mm distância entre pinos Conexões para circuito impresso ou bases Série 95

Manual de Instalação. GPRS Universal

Comunicação Serial com o AVR ATMEGA8

Transcrição:

Escola Secundária Afonso Lopes Vieira Curso Profissional de Técnico de Eletrónica e Telecomunicações 2009/2012 Campainha escolar com sinalização de emergência Relatório da Prova de Aptidão Profissional Carla Sofia Assunção Carvalho, N.º 17805, 3.º ET Leiria, junho de 2012

Escola Secundária Afonso Lopes Vieira Curso Profissional de Técnico de Eletrónica e Telecomunicações 2009/2012 Campainha escolar com sinalização de emergência Relatório da Prova de Aptidão Profissional Carla Sofia Assunção Carvalho, N.º 17805, 3.º ET Orientador Paulo Manuel Martins dos Santos Coorientadora Judite de Jesus Rosa Judas da Cunha Vieira Leiria, junho de 2012

Agradecimentos Começo desde já por agradecer ao Dr. Pedro Biscaia, diretor da escola, pela colaboração prestada ao longo do curso. À Dr.ª Judite da Cunha Vieira, ex-presidente do conselho executivo, pela abertura deste curso. Ao Dr. Paulo Santos, diretor do curso, por todo o apoio, dedicação e paciência que teve ao longo destes três anos. A todos os diretores de turma por tudo aquilo que passaram connosco. À empresa Centro Electrónico Prazeres Santos Lda., por me ter recebido de braços abertos como estagiária. À minha família, por me ter apoiado sempre e me ter dado todas as condições para que pudesse concluir este curso. Por fim, a todos os meus amigos que também sempre me apoiaram. -i-

Índice geral Agradecimentos...i Índice geral...ii Outros índices...iii Índice de figuras...iii Índice de tabelas...iii Resumo...iv Palavras-chave...iv 1.Introdução...1 1.1.Apresentação de ideias e linhas fundamentais...1 1.2.Objetivos a alcançar...1 1.3.Estrutura do relatório...1 2.Desenvolvimento...3 2.1.Fundamentação do projeto...3 2.2.Métodos e técnicas utilizadas...7 2.3.Execução do projeto...7 3.Conclusão...38 Bibliografia...39 Anexos...40 Anexo 1 Folhas de dados dos principais componentes...41 - ii -

Outros índices Índice de figuras Figura 1: Exemplo de um detetor de fumo...3 Figura 2: Interior de um detetor de fumo fotoelétrico...4 Figura 3: Camada de ionização de um detetor de fumo...5 Figura 4: Interior de um detetor de fumo...6 Figura 5: Esquemático do circuito...8 Figura 6: Circuito do projeto montado em breadboard...10 Figura 7: Desenho do circuito impresso - face dos componentes...12 Figura 8: Desenho do cirucito impesso - face das soldaduras...12 Figura 9: Disposição dos componentes na placa de circuito impresso...13 Figura 10: Fluxograma principal...14 Figura 11: Fluxograma do atendimento de interrupções...15 Figura 12: Layout interior da caixa...37 Figura 13: Painel frontal da caixa...37 Índice de tabelas Tabela 1: Lista de material...10 - iii -

Resumo Este projeto visa a construção de uma campainha escolar, que sinaliza a entrada e a saída das aulas, bem como do plano de emergência. O sistema será baseado num microcontrolador PICAXE-28X1 que utilizará o circuito integrado DS1307 como relógio em tempo real, bem como um mostrador alfanumérico de cristal líquido (LCD) para interface visual com o utilizador. Para a sinalização do plano de emergência, prevê-se a existência de um botão de pressão, ou tecla, devidamente identificada para sinalização de acordo com o plano de emergência da escola, para este fim utilizar-se-á ainda um sensor de fumo para a deteção de incêndios. O código para o microcontrolador será desenvolvido no software PICAXE Programming Editor, da Revolution Education, em linguagem de programação BASIC. O(s) esquemático(s) bem como o(s) desenho(s) da(s) placa(s) de circuito impresso serão elaborados no software EAGLE (Easily Applicable Graphical Layout Editor) da CadSoft. Palavras-chave Microcontrolador, sensor de fumo, campainha escolar, emergência - iv -

1. Introdução Este projeto foi desenvolvido no âmbito da Prova de Aptidão Profissional, referente ao Curso Profissional Técnico de Eletrónica e Telecomunicações e consiste numa campainha escolar com sinalização de emergência. Escolhi este trabalho, porque no ano anterior comecei um pequeno trabalho e achei que podia aproveitar o esquemático e desenvolvê-lo mais. 1.1. Apresentação de ideias e linhas fundamentais Este trabalho, à primeira vista, não aparenta ter nada de novo, mas decidi desenvolvê-lo porque achei que seria importante para as escolas, visto que só têm sinalização sonora para os toques de entrada e saída das aulas e a grande maioria ainda não tem sensores de fumos. 1.2. Objetivos a alcançar Fazer com que a campainha toque quando é disparado o sensor de fumo, ou rede de sensores de fumo. Fazer os toques de entrada e saída das aulas, bem com a sinalização do toque intermédio devido às aulas correspondentes aos tempos de quarenta e cinco minutos. Utilizar o software EAGLE da CadSoft, para desenhar esquemáticos e placas de circuito impresso. Estudar a utilização do microcontrolador PICAXE-28X1 e a sua programação com o LinAXEpad em ambiente Linux. Explorar o módulo AXE033 da Revolution Education, bem como o circuito integrado de relógio em tempo real (RTC Real-Time Clock) DS1307 da Maxim com comunicação I2C. Estudar o funcionamento e a conetica de um sensor de fumo. 1.3. Estrutura do relatório Este relatório inicia-se com o agradecimento às pessoas que foram fundamentais, tanto para a abertura deste curso, como para a continuação e finalização do mesmo e às pessoas que me apoiaram ao longo destes três anos. -1-

De seguida, apresento o índice e o resumo onde faço uma breve explicação do meu projeto. Na introdução, refiro em que consiste o meu trabalho, apresento as minhas ideias base e os objetivos a alcançar. Posteriormente encontra-se o capítulo do desenvolvimento onde vou referir com detalhe todos os passos e recursos utilizados para a realização deste projeto e todas as dificuldades existentes. Depois faço uma conclusão onde faço uma reflexão sobre o trabalho realizado e falo do estado final do meu projeto. Para finalizar, incluí a bibliografia onde refiro todas as fontes de informação que foram utilizadas para o relatório e para o projeto e os anexos onde vou colocar as folhas de dados dos principais componentes eletrónicos. -2-

2. Desenvolvimento Neste capítulo, vou falar um pouco sobre sensores de fumo, pois são um dos componentes principais do meu projeto, e vou explicar todos os métodos e técnicas utilizadas para a realização deste projeto (esquemático, placa de circuito impresso, lista de material, fluxogramas, código desenvolvido e imagens da disposição no interior e do painel frontal da caixa). 2.1. Fundamentação do projeto Detetores de fumo Figura 1: Exemplo de um detetor de fumo -3-

Os detetores de fumo são uma daquelas invenções surpreendentes, que por causa da produção em massa, são extremamente baratos. Os detetores de fumo salvam milhares de vidas a cada ano que passa em todo o mundo. É recomendado ter um em cada casa e por andar. Todos os detetores de fumos são compostos por duas partes básicas. Um sensor para detetar o fumo e um besouro ou sirene para alarmar as pessoas. Os detetores de fumo podem funcionar com uma bateria de 9 volts ou com a corrente alternada de 230 volts. Os detetores de fumo podem ser fotoelétricos ou iónicos. Figura 2: Interior de um detetor de fumo fotoelétrico Detetores iónicos Os detetores de fumo de ionização utilizam uma câmara de ionização e uma fonte de radiação ionizante para detetar fumo. Este tipo de detetor de fumo é mais comum porque é barato é melhor a detetar as menores quantidades de fumo produzido pelos incêndios flamejantes. No interior de um detetor iónico há uma pequena quantidade (talvez 1/5000 partes de grama) de -4-

amerício-241. O amerício é um elemento radioativo que tem um tempo médio de vida de 432 anos e é uma boa fonte de partículas alfa. Outra maneira de falar sobre a quantidade de amerício no detetor é dizer que um detetor típico contém 0,9 microcurie de amerício-241. Um curie é uma unidade de medida para materiais radioativo, por exemplo, se agarrar com a sua mão material radioativo de um curie, está a segurar uma quantidade de material que sofre 37.000.000.000 transições nucleares espontâneas por segundo. Geralmente, isto significa que 37 biliões de átomos na amostra estão emitindo uma partícula da radiação nuclear (como uma partícula alfa) por segundo. Camada de ionização Uma câmara de ionização é muito simples. Consiste em duas placas com uma tensão aplicada em cada uma, juntamente com uma fonte radioativa de radiação ionizante, ver figura 3. Figura 3: Camada de ionização de um detetor de fumo As partículas alfa geradas pelo amerício têm a seguinte propriedade: elas ionizam os átomos de oxigénio e nitrogénio do ar na câmara. "Ionizar" significa fazer saltar um eletrão fora de. Quando um eletrão salta de um átomo, ficamos com um eletrão livre (com uma carga negativa) e um átomo com um eletrão em falta (com uma carga positiva). O eletrão negativo é atraído para a placa com uma tensão positiva, e o átomo positivo é atraído para a placa com uma tensão negativa (opostos atraem-se, assim como os ímanes). A eletrónica no detetor de fumo é sensível a essa pequena quantidade de corrente elétrica que representam esses eletrões -5-

e os iões que se movem em direção às placas. Quando o fumo entra na câmara de ionização, perturba esta corrente as partículas de fumo juntam o equivalente aos iões e neutralizam. O detetor de fumo deteta a diminuição da corrente entre as placas e dispara o alarme. Falando de alarmes, sempre que o termo "radiação nuclear" é usado as pessoas no geral ficam alarmadas. A quantidade de radiação de um detetor de fumo é extremamente pequena. Também é predominantemente radiação alfa, que não consegue penetrar numa folha de papel. O amerício num detetor de fumo só poderá representar algum perigo se o inalar. Portanto, não devemos brincar com o amerício de um detetor de fumo. Interior de um detetor de fumo de ionização Um detetor de fumo é muito simples. Consiste numa placa de circuito impresso, uma câmara de ionização e uma campainha ou besouro eletrónico. A câmara de ionização é em alumínio e contém a fonte de ionização. Podemos ver que a lata tem slots para permitir o fluxo de ar. Por baixo da lata existe um cerâmico que contém a placa positiva da Câmara de ionização. Sob essa placa está a fonte de ionização, que não devemos tocar. Figura 4: Interior de um detetor de fumo -6-

2.2. Métodos e técnicas utilizadas Iniciei o meu projeto no EAGLE para fazer o esquemático. Ao longo da elaboração do esquemático, foram feitos alguns ajustes até encontrar a solução final. Depois de concluído o esquemático, iniciei a montagem do mesmo em placa de ensaio (breadboard). De seguida, comecei a trabalhar na elaboração do código em LinAXEpad no sistema operativo Linux/Ubuntu. Conforme ia fazendo o código, também ia testando o mesmo e programando o microcontrolador. Desenhei a placa de circuito impresso de dupla face também em EAGLE. Utilizei o Inkscape para desenhar a disposição interior e o painel da caixa e o editor de diagramas DIA para fazer os fluxogramas. Por fim, iniciei a elaboração deste relatório no OpenOffice.org Writer. 2.3. Execução do projeto Para iniciar o meu projeto, resolvi aproveitar um esquemático de um pequeno trabalho realizado no ano anterior, na disciplina de Sistemas Digitais, e desenvolvi-o de acordo com a ideia que tinha para o meu projeto. Depois fiz pesquisas na Internet sobre o microcontrolador PICAXE-28X1, nomeadamente sobre as suas especificações e programação em linguagem BASIC, sobre o módulo AXE033 da Revolution Education, que é um mostrador de cristal líquido (LCD) de 16 carateres 2 linhas com ligação série e I2C e com o relógio em tempo real DS1307 (RTC Real-Time Clock) e também sobre sensores de fumo. Trabalhei o meu esquemático até chegar ao ponto pretendido como é apresentado na figura. -7-

Figura 5: Esquemático do circuito -8-

Neste esquemático, destaco os seguintes subsistemas: O jack estéreo fêmea com Ø3,5mm X1 que liga aos pinos 6 (Serin) e 7 (Serout) do PICAXE-28X1 permite a comunicação série entre o microcontrolador PICAXE-28X1 e o computador (PC) para o envio de dados e para a transferência do programa através do programa LinAXEpad/WinAXEpad/MacAXEpad respetivamente para os sistemas operativos Linux/Microsoft Windwos/Mac OSX; Os quatro botões de pressão que ligam aos pinos 12 (SOS), 16 (Set), 17 ( ) e 18 (+). O Set permite acertar a data e a hora, o (menos) e o + (mais) para decrementar ou incrementar os valores de acerto e o SOS permite acionar a rotina de sinalização de emergência manualmente; O ligador SV1 com 6 pinos (OUT, V+, IN, 0V, SCL e SDA) que permite ligar o módulo AXE033 ao microcontrolador PICAXE-28X1. O IN para a possibilidade de se querer utilizar a função de alarme do módulo, o OUT para o envio dos dados a mostrar, SCL e SDA do barramento I2C para comunicação com o relógio em tempo real e o V+ para a alimentação de 5V e o 0V para ligação à terra GND; O cristal de quartzo de 4MHz que é a base do relógio de sistema, muito preciso em termos de frequência. O acoplador ótico 4N25 para adaptar as caraterísticas elétricas da saída do detetor de fumo às da entrada do microcontrolador PICAXE-281. A fonte de alimentação com um transformador monofásico com primário de 230 VAC para 15VAC no secundário e que é protegido por um fusível rápido de 250mA, uma ponte retificadora de onda completa constituída por 4 díodos, dois reguladores de tensão, um que regula a tensão para 5 volts para alimentar o microcontrolador e circuitos adjacentes e outro que regula a tensão para 12 volts para alimentar as bobinas dos relés. Depois do esquemático finalizado e retificado, iniciei a montagem do circuito em breadboard com sucesso e sem problemas, como se pode ver na figura 6. -9-

Figura 6: Circuito do projeto montado em breadboard De seguida, apresenta-se a listagem de todo o material utilizado no projeto: Tabela 1: Lista de material Item n.º Nome Quantidade Descrição/Valor 1 C1, C3 2 Condensador cerâmico de 22pF 2 C2 1 Condensador eletrolítico de 10uF 16V 3 C4, C6, 4 Condensador cerâmico de 100nF C8, C10 4 C5 1 Condensador eletrolítico de 100uF 25V 5 C7 1 Condensador eletrolítico de 100uF 16V 6 C9 1 Condensador eletrolítico de 1000uF 35V 7 D1, D2, 4 Díodo retificador 1N4004 D3, D4 8 D5, D6 2 Díodo retificador 1N5819 9 OK1 1 Acoplador ótico 4N25 10 F1 1 Fusível rápido de 250mA c/ suporte - 10 -

11 IC2 1 Regulador de tensão positiva de 5V 7805 12 IC3 1 Regulador de tensão positiva de 12 V 7812 13 K1, K2 2 Relé, 2 contactos 250V AC 10A, bobina de 12V DC 14 LED1 1 LED Ø5mm branco 15 Q2 1 Cristal de quartzo de 4MHz 16 R1, R4 2 Resistência 4,7KΩ 1/4W 17 R2, R3, 9 Resistência 10KΩ 1/4W R5, R7, R9, R10, R11, R12, R14 18 R6 1 Resistência 220Ω 1/4W 19 R8 1 Resistência 22KΩ 1/4W 20 R13 1 Resistência 1KΩ 1/4W 21 S1, S2, 4 Botão de pressão para painel S3, S4 22 SV1 1 Módulo LCD 16 2 série/i2c com relógio AXE033 23 T1, T2 2 Transístor BC337 24 TR1 1 Transformador monofásico, primário 230VAC, secundário 15VAC 1A 25 U1 1 Microcontrolador PICAXE-28X1 26 X1 1 Jack estéreo de Ø3,5mm fêmea para placa de circuito impresso 27 X2, X5, 3 Barra de 2 ligadores para circuito impresso 5mm X6 28 X4 1 Barra de 3 terminais para circuito impresso 5mm 29 SV1 1 Barra de 6 terminais 30 1 Sensor de fumo FD-3030 31 1 Campainha industrial Depois de montado e testado o circuito, comecei a desenhar a placa de circuito impresso, em EAGLE, cujos desenhos se representam de seguida: - 11 -

Figura 7: Desenho do circuito impresso - face dos componentes Figura 8: Desenho do cirucito impesso - face das soldaduras - 12 -

Figura 9: Disposição dos componentes na placa de circuito impresso Uma vez concluído o desenho da placa de circuito impresso do meu projeto, elaborei dois fluxogramas para explicar facilmente o seu funcionamento. No fluxograma principal, ver figura 10, o sistema inicializa (limpando o mostrador, movendo o cursor para a primeira posição da primeira linha (superior) e mostrando o texto Relógio Escolar, mostrando a data e a hora na linha inferior (segunda), definindo detalhes da comunicação I2C com o RTC DS1307 e ativando as interrupções para o botão de emergência. Depois, se o botão Set for apertado durante 5 segundos ou mais, vai para a sub-rotina de acerto da data e da hora. Senão, lê a data e hora e mostra-as. Se for hora de entrada ou de saída, a campainha toca, senão repete novamente a rotina principal do programa. - 13 -

Figura 10: Fluxograma principal - 14 -

No fluxograma do atendimento de interrupções, o sistema liga a sirene, faz alguns toques na campainha, depois desliga a sirene e reativa as interrupções para o botão de emergência. Figura 11: Fluxograma do atendimento de interrupções Ainda intercalado com a realização da placa de circuito impresso, iniciei o desenvolvimento do código para programação do PICAXE-28X1 em LinAXEpad no ambiente Linux/Ubuntu. De seguida, apresenta-se a listagem completa do código desenvolvido: ;######################################################################### ; ; ; Nome do programa: Campainha escolar ; ; Descrição: Projeto de uma campainha escolar, que sinaliza a entrada - 15 -

; e a saída das aulas bem como do plano de emergência. ; O sistema é baseado num microcontrolador PICAXE-28X1 ; que utilizará o circuito integrado DS1307 como relógio ; em tempo real, bem como um mostrador LCD alfanumérico ; para interface visual com o utilizador. Para a sinalização ; do plano de emergência, utiliza-se um botão de pressão, ; ou tecla, devidamente identificado para sinalização de ; acordo com o plano de emergência da escola, para este ; fim utilizar-se-á ainda um sensor de fumo para a deteção ; de incêndios. Encontra-se também implementada a ; sub-rotina para acerto da data e hora. ; ; ; Autor(es): 17805 - Carla Sofia Assunção Carvalho ; ; Turma: 3.º ET ; ; Disciplina: Prova de Aptidão Profissional (PAP) ; ; Curso: C P de Técnico de Eletrónica e Telecomunicações ; ; Escola: Escola Secundária Afonso Lopes Vieira ; ; Data: 30/04/2012 ; ; ;######################################################################### ; ; Definição dos pinos de entrada symbol SMOKE = pin1 symbol BTN_SOS = pin1 symbol BTN_SET = pin5 symbol BTN_MNS = pin6 symbol BTN_PLS = pin7 ; Definição dos pinos de saída symbol BELL = 0 symbol LED = 1-16 -

symbol ALARM = 2 ; Definição de variáveis symbol minute_flag = b0 symbol adjust_flag = b1 symbol second = b2 symbol minute = b3 symbol hour = b4 symbol day = b5 symbol date = b6 symbol month = b7 symbol year = b8 symbol control = b9 symbol counter = b10 symbol tenths_digit = b11 symbol units_digit = b12 symbol tenths = b13 symbol units = b14 symbol days_index = b15 ; Instruções iniciais do programa init: low BELL ; desatraca o relé da campainha high LED ; acende o LED de sinalização low ALARM ; desatraca o relé da sirene pause 500 ; aguarda que o mostrador inicialize ; define detalhes da comunicação I2C com o mostrador i2cslave $C6, i2cslow, i2cbyte writei2c 0,(254,1,255) ; limpa o mostrador pause 30 ; espera 30 milissegundos para o processamento do mostrador ; Move o cursor para a primeira posição da primeira linha writei2c 0,(254,128,255) ; Escreve mensagem no mostrador writei2c 0,("Rel",$A2,"gio Escolar",255) - 17 -

; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Carla,3ET,ESALV ",255) ; Escreve mensagem no mostrador wait 3 ; aguarda 2s para permitir a leitura humana ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("A inicializar...",255) ; Escreve mensagem no mostrador ; define detalhes da comunicação I2C com o relógio i2cslave %11010000, i2cslow, i2cbyte ; inicializa o relógio - "Segunda-feira 2012-06-25 10:19:00" let day = $00 ; 00 (segunda-feira) no formato BCD let year = $12 ; 12 no formato BCD let month = $06 ; 06 no formato BCD let date = $25 ; 25 no formato BCD let hour = $10 ; 10 no formato BCD let minute = $19 ; 19 no formato BCD let second = $00 ; 00 no formato BCD let control = %00010000 ; ativa sinal de saída com frequência de 1Hz writei2c 0,(second,minute,hour,day,date,month,year,control) 00 ; espera low LED ; apaga o LED de sinalização um segundo ; ativa interrupção da entrada 1 (botão SOS) e 2 (sensor de fumo) ; quando vão ao nível lógico baixo setint or %00000000,%00000110 minute_flag = $99 ; sinalizador para não repetir toque no ; mesmo minuto, o minuto 99(BCD) não existe - 18 -

adjust_flag = 0 ; sinalizador para acerto da data e hora ; Rotina principal do programa main: ; se o botão SET for premido por mais de 5s vai para sub-rotina ; de acerto da date e hora if BTN_SET = 0 then ; testa se o botão SET está premido adjust_flag = adjust_flag + 1 ; se sim, incrementa sinalizador else adjust_flag = 0 ; senão limpa o sinalizador endif ; vai para a sub-rotina de acerto do relógio if adjust_flag > 5 then gosub acerta ; define detalhes da comunicação I2C com o relógio i2cslave %11010000, i2cslow, i2cbyte ; lê segundos, minutos, horas e dia da semana readi2c 0,(second,minute,hour,day) pause 25 ; espera 25ms ; define detalhes da comunicação I2C com o mostrador i2cslave $C6, i2cslow, i2cbyte ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) ; escreve o dia do mês no mostrador bcdtoascii date,tenths_digit,units_digit ; Escreve mensagem no mostrador writei2c 0,(tenths_digit, units_digit,"/",255) ; escreve o mês no mostrador bcdtoascii month,tenths_digit,units_digit ; Escreve mensagem no mostrador - 19 -

writei2c 0,(tenths_digit, units_digit,"/",255) ; escreve o ano no mostrador bcdtoascii year,tenths_digit,units_digit ; Escreve mensagem no mostrador writei2c 0,("20",tenths_digit, units_digit," ",255) ; escreve a hora no mostrador bcdtoascii hour,tenths_digit,units_digit ; Escreve mensagem no mostrador writei2c 0,(tenths_digit, units_digit,":",255) ; escreve o minuto no mostrador bcdtoascii minute,tenths_digit,units_digit ; Escreve mensagem no mostrador writei2c 0,(tenths_digit, units_digit,255) pause 900 ; espera 900 milissegundos if minute <> minute_flag then ; testa se ainda não tocou ou sinalizou minute_flag = minute else ; se já tocou ou sinalizou volta ao início da rotina principal goto main endif ; analisa as situações de toque e sinalização if hour=$08 and minute=$35 then toca ; às 8:35 toca para a entrada if hour=$09 and minute=$20 then sinal ; sinaliza segmento das 09:20 if hour=$10 and minute=$05 then toca ; às 10:05 toca para a saída if hour=$10 and minute=$20 then toca ; às 10:20 toca para a entrada if hour=$11 and minute=$05 then sinal ; sinaliza segmento das 11:05 if hour=$11 and minute=$50 then toca ; às 11:50 toca para a saída if hour=$12 and minute=$05 then toca ; às 12:05 toca para a entrada if hour=$12 and minute=$50 then sinal ; sinaliza segmento das 12:50 if hour=$13 and minute=$35 then toca ; às 13:35 toca - 20 -

if hour=$14 and minute=$20 then sinal ; sinaliza segmento das 14:20 if hour=$15 and minute=$05 then toca ; às 15:05 toca para a saída if hour=$15 and minute=$15 then toca ; às 15:15 toca para a entrada if hour=$16 and minute=$00 then sinal ; sinaliza segmento das 16:00 if hour=$16 and minute=$45 then toca ; às 16:45 toca para a saída if hour=$17 and minute=$00 then toca ; às 17:00 toca para a entrada if hour=$17 and minute=$45 then sinal ; sinaliza segmento das 17:45 if hour=$18 and minute=$30 then toca ; às 18:30 toca para a saída goto main ; volta ao início da rotina principal do programa ; Parte do programa responsável pelo toque da campainha toca: ; define detalhes da comunicação I2C com o mostrador i2cslave $C6, i2cslow, i2cbyte ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) ; espera 10 milissegundos para o processamento do mostrador writei2c 0,("A tocar... ",255) ; Escreve mensagem no mostrador high BELL,LED ; liga o LED e atraca o relé da campainha pause 5000 ; faz o toque com uma duração de 5 segundos low BELL,LED ; desliga o LED de sinalização e desatraca o relé goto main ; volta ao início da rotina principal do programa ; Parte do programa responsável pela sinalização dos segmentos de 45 sinal: ; define detalhes da comunicação I2C com o mostrador i2cslave $C6, i2cslow, i2cbyte ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("A sinalizar... ",255) ; Escreve mensagem no mostrador high LED ; acende o LED a meio da aula de 90 minutos pause 5000 ; faz a sinalização com duração de 5 segundos low LED ; apaga o LED goto main ; volta ao início da rotina principal do programa - 21 -

; ; Sub-rotina do programa para atendimento das situações de emergência ; interrupt: ; define detalhes da comunicação I2C com o mostrador i2cslave $C6, i2cslow, i2cbyte ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) ; espera 10 milissegundos para o processamento do mostrador writei2c 0,("***EMERGENCIA***",255) ; Escreve mensagem no mostrador high ALARM ; atraca o relé da sirene ; espera 10ms for counter = 1 to 5 ; ciclo para fazer 5 toques de campainha high BELL,LED ; acende o LED e atraca o relé da campainha pause 3000 ; espera 3 segundos low BELL,LED ; apaga o LED e desatraca o relé da campainha 00 ; espera 2 segundos next counter ; repete o ciclo pause 250 ; espera 250ms low ALARM ; desatraca o relé da sirene ; define detalhes da comunicação I2C com o mostrador i2cslave $C6, i2cslow, i2cbyte ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Rearme o alarme ",255) ; Escreve mensagem no mostrador loop1: ; aguarda até que o botão SOS seja solto e o alarme de fumo reativado if pin1 = 0 or pin2 = 0 then goto loop1 ; reativa interrupção da entrada 1 (botão SOS) e 2 (sensor de fumo) ; quando vão ao nível lógico baixo setint or %00000000,%00000110 return ; retoma à rotina principal do programa - 22 -

; ; Sub-rotina do programa para acerto do relógio ; acerta: setint off ; desativa as interrupções ; define detalhes da comunicação I2C com o relógio i2cslave %11010000, i2cslow, i2cbyte ; lê dados do relógio readi2c 0,(second,minute,hour,day,date,month,year,control) pause 25 ; espera 25ms ; define detalhes da comunicação I2C com o mostrador i2cslave $C6, i2cslow, i2cbyte ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Mude com + e - ",255) ; Escreve mensagem no mostrador wait 2 ; aguarda 2s para permitir a leitura humana ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Valide com SET ",255) ; Escreve mensagem no mostrador wait 2 ; aguarda 2s para permitir a leitura humana loop2: if BTN_SET = 0 then goto loop2 set_year: ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Ano: ",255) ; Escreve mensagem no mostrador loop3: ; obtém o dígito das dezenas e das unidades bcdtoascii year,tenths_digit,units_digit - 23 -

; Move o cursor para a sexta posição da segunda linha writei2c 0,(254,197,255) ; Escreve mensagem no mostrador writei2c 0,(tenths_digit,units_digit,255) tenths = tenths_digit - 48 ; subtrai 48 ao código ASCII do dígito units = units_digit - 48 ; subtrai 48 ao código ASCII do dígito if BTN_MNS = 0 then ; verifica se a tecla Menos (-) está premida if units = 0 then ; se o dígito das unidades for 0 (zero) if tenths = 0 then ; e se o dígito das dezenas for 0 tenths = 9 ; muda o dígito das dezenas para 9 else ; senão decrementa o dígito das dezenas tenths = tenths - 1 units = 9 ; e faz o dígito das unidades igual a 9 else ; caso o dígito das unidades não fosse 0 ; simplesmente decrementa o dígito das unidades units = units - 1 loop4: ; aguarda até que a tecla Menos (-) seja solta if BTN_MNS = 0 then goto loop4 if BTN_PLS = 0 then ; verifica se a tecla Mais (+) está premida if units = 9 then ; se as dígito das unidades for 9 (nove) if tenths = 9 then ; se o dígito das dezenas for 9 (nove) tenths = 0 ; muda o dígito das dezenas para 0 else ; senão incrementa o dígito das dezenas tenths = tenths + 1 units = 0 ; e faz o dígito das igual unidades igual a 0 else ; caso o dígito das unidades não fosse 9 ; simplesmente incrementa o dígito das unidades units = units + 1-24 -

loop5: ; aguarda até que a tecla Mais (+) seja solta if BTN_PLS = 0 then goto loop5 pause 150 ; espera o tempo de se soltar a tecla year = tenths * 16 + units ; calcula convertendo em BCD if BTN_SET = 0 then ; se a tecla Set for premida avança goto set_month else ; senão repete goto loop3 set_month: ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) ; Escreve mensagem no mostrador writei2c 0,("M",$88,"s: ",255) loop6: ; aguarda até que a tecla Set seja solta if BTN_SET = 0 then goto loop6 ; obtém o dígito das dezenas e das unidades bcdtoascii month,tenths_digit,units_digit ; Move o cursor para a sexta posição da segunda linha writei2c 0,(254,197,255) ; Escreve mensagem no mostrador - 25 -

writei2c 0,(tenths_digit,units_digit,255) tenths = tenths_digit - 48 ; subtrai 48 ao código ASCII do dígito units = units_digit - 48 ; subtrai 48 ao código ASCII do dígito if BTN_MNS = 0 then ; verifica se a tecla Menos (-) está premida if tenths = 1 and units = 0 then ; se for o mês 10 (outubro) tenths = 0 ; faz o dígito da dezenas igual a 0 (zero) units = 9 ; e o das dezenas igual a 9 (nove) else ; se for o mês 1 (janeiro) if tenths = 0 and units = 1 then tenths = 1 ; faz o dígito da dezenas igual a 1 (um) units = 2 ; e o das dezenas igual a 2 (dois) else ; noutros caos decrementa o dígito das unidades units = units - 1 loop7: ; aguarda até que a tecla Menos (-) seja solta if BTN_MNS = 0 then goto loop7 if BTN_PLS = 0 then ; verifica se a tecla Mais (+) está premida if tenths = 1 and units = 2 then ; se for o mês 12 (dezembro) tenths = 0 ; faz o o dígito das dezenas igual a 0 (zero) units = 1 ; e o das unidades igual a 1 (um) else ; se for o mês 9 (setembro) if tenths = 0 and units = 9 then tenths = 1 ; faz o dígito das dezenas igual a 1 units = 0 ; e o das unidades igual a 0 (zero) else ; noutros casos incrementa o dígito das unidades units = units + 1 loop8: ; aguarda até que a tecla Mais (+) seja solta - 26 -

if BTN_PLS = 0 then goto loop8 pause 150 ; espera o tempo de se soltar a tecla month = tenths * 16 + units ; calcula convertendo em BCD if BTN_SET = 0 then ; se a tecla Set for premida avança goto set_date else ; senão repete goto loop6 set_date: ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Dia(M): ",255) ; Escreve mensagem no mostrador loop9: ; aguarda até que a tecla Set seja solta if BTN_SET = 0 then goto loop9 ; obtém o dígito das dezenas e das unidades bcdtoascii date,tenths_digit,units_digit ; Move o cursor para a nona posição da segunda linha writei2c 0,(254,200,255) ; Escreve mensagem no mostrador writei2c 0,(tenths_digit,units_digit,255) tenths = tenths_digit - 48 ; subtrai 48 ao código ASCII do dígito units = units_digit - 48 ; subtrai 48 ao código ASCII do dígito if BTN_MNS = 0 then ; verifica se a tecla Menos (-) está premida if tenths = 0 and units = 1 then ; se for o dia 1 (um) tenths = 3 ; faz o dígito das dezenas igual a 3 (três) units = 1 ; e o das unidades igual a 1 (um) else if units = 0 then ; se o dígito das unidades for 0 (zero) ; decrementa o dígito das dezenas tenths = tenths - 1-27 -

units = 9 ; e faz o das unidades igual a 9 (nove) else ; noutros casos decrementa apenas o dígito das unidades units = units - 1 loop10: ; aguarda até que a tecla Menos (-) seja solta if BTN_MNS = 0 then goto loop10 if BTN_PLS = 0 then ; verifica se a tecla Mais (+) está premida if tenths = 3 and units = 1 then ; se for o dia 31 tenths = 0 ; faz o dígito das dezenas igual a 0 (zero) units = 1 ; e o das unidades igual a 1 (um) else if units = 9 then ; se o dígito das unidades for 9 (nove) ; incrementa o dígito das dezenas tenths = tenths + 1 units = 0 ; e faz o das unidades igual a 0 (zero) else ; noutros casos incrementa apenas o dígito das unidades units = units + 1 loop11: ; aguarda até que a tecla Mais (+) seja solta if BTN_PLS = 0 then goto loop11 pause 150 ; espera o tempo de se soltar a tecla date = tenths * 16 + units ; calcula convertendo em BCD if BTN_SET = 0 then ; se a tecla Set for premida avança goto set_day else ; senão repete goto loop9-28 -

set_day: ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Dia(S): ",255) ; Escreve mensagem no mostrador loop12: ; aguarda até que a tecla Set seja solta if BTN_SET = 0 then goto loop12 ; obtém o dígito das dezenas e das unidades bcdtoascii day,tenths_digit, days_index days_index = days_index - 48 ; subtrai 48 ao código ASCII do dígito ; Move o cursor para a nona posição da segunda linha writei2c 0,(254,200,255) branch days_index,(monday, tuesday, wednesday, thrusday, friday, saturday, sunday) monday: writei2c 0,("segunda",255) ; Escreve mensagem no mostrador goto jump1 ; salta para a frente tuesday: writei2c 0,("ter",$87,"a goto jump1 ",255) ; Escreve mensagem no mostrador ; salta para a frente wednesday: writei2c 0,("quarta ",255) ; Escreve mensagem no mostrador goto jump1 ; salta para a frente thrusday: writei2c 0,("quinta ",255) ; Escreve mensagem no mostrador goto jump1 ; salta para a frente friday: writei2c 0,("sexta goto jump1 ",255) ; Escreve mensagem no mostrador ; salta para a frente - 29 -

saturday: writei2c 0,("s",$A0,"bado ",255) ; Escreve mensagem no mostrador goto jump1 ; salta para a frente sunday: writei2c 0,("domingo",255) ; Escreve mensagem no mostrador jump1: ; espera 10ms para o processamento do mostrador if BTN_MNS = 0 then ; verifica se a tecla Menos (-) está premida if days_index = 0 then ; se o índice do dia da semana for 0 days_index = 6 ; muda para 6 (seis) - domingo else ; noutros casos ; simplesmente decrementa o índice days_index = days_index - 1 loop13: ; aguarda até que a tecla Menos (-) seja solta if BTN_MNS = 0 then goto loop13 if BTN_PLS = 0 then ; verifica se a tecla Mais (+) está premida if days_index = 6 then ; se o índice do dia da semana for 6 days_index = 0 ; nuda para 0 (zero) - segunda else ; noutros caos ; simplesmente incrementa o índice days_index = days_index + 1 loop14: ; aguarda até que a tecla Mais (+) seja solta if BTN_PLS = 0 then goto loop14 pause 150 ; espera o tempo de se soltar a tecla day = days_index ; calcula convertendo em BCD if BTN_SET = 0 then ; se a tecla Set for premida avança goto set_hour - 30 -

else ; senão repete goto loop12 set_hour: ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Hora: ",255) ; Escreve mensagem no mostrador loop15: ; aguarda até que a tecla Set seja solta if BTN_SET = 0 then goto loop15 ; obtém o dígito das dezenas e das unidades bcdtoascii hour,tenths_digit,units_digit ; Move o cursor para a sétima posição da segunda linha writei2c 0,(254,198,255) ; Escreve mensagem no mostrador writei2c 0,(tenths_digit,units_digit,255) tenths = tenths_digit - 48 ; subtrai 48 ao código ASCII do dígito units = units_digit - 48 ; subtrai 48 ao código ASCII do dígito if BTN_MNS = 0 then ; verifica se a tecla Menos (-) está premida if tenths = 0 and units = 0 then ; se for a hora 0 (zero) tenths = 2 ; faz o dígito das dezenas igual a 2 (dois) units = 3 ; e o das unidades igual a 3 (três) else if units = 0 then ; se o dígito das unidades for 0 (zero) ; decrementa o dígito das dezenas tenths = tenths - 1 units = 9 ; e faz o das unidades igual a 9 (nove) else ; noutros casos decrementa apenas o dígito das unidades units = units - 1 loop16: - 31 -

; aguarda até que a tecla Menos (-) seja solta if BTN_MNS = 0 then goto loop16 if BTN_PLS = 0 then ; verifica se a tecla Mais (+) está premida if tenths = 2 and units = 3 then ; se for a hora 23 tenths = 0 ; faz o dígito das dezenas igual a 0 (zero) units = 0 ; e o das unidades igual a 0 (zero) else if units = 9 then ; se o dígito das unidades for 9 (nove) ; incrementa o dígito das dezenas tenths = tenths + 1 units = 0 ; e faz o das unidades igual a 0 (zero) else ; noutros casos incrementa apenas o dígito das unidades units = units + 1 loop17: ; aguarda até que a tecla Mais (+) seja solta if BTN_PLS = 0 then goto loop17 pause 150 ; espera o tempo de se soltar a tecla hour = tenths * 16 + units ; calcula convertendo em BCD if BTN_SET = 0 then ; se a tecla Set for premida avança goto set_minute else ; senão repete goto loop15 set_minute: ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Minuto: ",255) ; Escreve mensagem no mostrador loop18: ; aguarda até que a tecla Set seja solta - 32 -

if BTN_SET = 0 then goto loop18 ; obtém o dígito das dezenas e das unidades bcdtoascii minute,tenths_digit,units_digit ; Move o cursor para a nona posição da segunda linha writei2c 0,(254,200,255) ; Escreve mensagem no mostrador writei2c 0,(tenths_digit,units_digit,255) tenths = tenths_digit - 48 ; subtrai 48 ao código ASCII do dígito units = units_digit - 48 ; subtrai 48 ao código ASCII do dígito if BTN_MNS = 0 then ; verifica se a tecla Menos (-) está premida if tenths = 0 and units = 0 then ; se for o minuto 0 (zero) tenths = 5 ; faz o dígito das dezenas igual a 5 (cinco) units = 9 ; e o das unidades igual a 9 (nove) else if units = 0 then ; se o dígito das unidades for 0 (zero) ; decrementa o dígito das dezenas tenths = tenths - 1 units = 9 ; e faz o das unidades igual a 9 (nove) else ; noutros casos decrementa apenas o dígito das unidades units = units - 1 loop19: ; aguarda até que a tecla Menos (-) seja solta if BTN_MNS = 0 then goto loop19 if BTN_PLS = 0 then ; verifica se a tecla Mais (+) está premida if tenths = 5 and units = 9 then ; se for o minute 59 tenths = 0 ; faz o dígito das dezenas igual a 0 (zero) units = 0 ; e o das unidades igual a 0 (zero) else if units = 9 then ; se o dígito das unidades for 9 (nove) ; incrementa o dígito das dezenas tenths = tenths + 1 units = 0 ; e faz o das unidades igual a 0 (zero) else - 33 -

; noutros casos incrementa apenas o dígito das unidades units = units + 1 loop20: ; aguarda até que a tecla Mais (+) seja solta if BTN_PLS = 0 then goto loop20 pause 150 ; espera o tempo de se soltar a tecla minute = tenths * 16 + units ; calcula convertendo em BCD if BTN_SET = 0 then ; se a tecla Set for premida avança goto set_second else ; senão repete goto loop18 set_second: ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("Segundo: ",255) ; Escreve mensagem no mostrador loop21: ; aguarda até que a tecla Set seja solta if BTN_SET = 0 then goto loop21 ; obtém o dígito das dezenas e das unidades bcdtoascii second,tenths_digit,units_digit ; Move o cursor para a nona posição da segunda linha writei2c 0,(254,200,255) ; Escreve mensagem no mostrador writei2c 0,(tenths_digit,units_digit,255) tenths = tenths_digit - 48 ; subtrai 48 ao código ASCII do dígito units = units_digit - 48 ; subtrai 48 ao código ASCII do dígito if BTN_MNS = 0 then ; verifica se a tecla Menos (-) está premida - 34 -

if tenths = 0 and units = 0 then ; se for o segundo 0 (zero) tenths = 5 ; faz o dígito das dezenas igual a 5 (cinco) units = 9 ; e o das unidades igual a 9 (nove) else if units = 0 then ; se o dígito das unidades for 0 (zero) ; decrementa o dígito das dezenas tenths = tenths - 1 units = 9 ; e faz o das unidades igual a 9 (nove) else ; noutros casos decrementa apenas o dígito das unidades units = units - 1 loop22: ; aguarda até que a tecla Menos (-) seja solta if BTN_MNS = 0 then goto loop22 if BTN_PLS = 0 then ; verifica se a tecla Mais (+) está premida if tenths = 5 and units = 9 then; se for o segundo 59 tenths = 0 ; faz o dígito das dezenas igual a 0 (zero) units = 0 ; e o das unidades igual a 0 (zero) else if units = 9 then ; se o dígito das unidades for 9 (nove) ; incrementa o dígito das dezenas tenths = tenths + 1 units = 0 ; e faz o das unidades igual a 0 (zero) else ; noutros casos incrementa apenas o dígito das unidades units = units + 1 loop23: if BTN_PLS = 0 then goto loop23 ; aguarda até que a tecla Mais (+) seja solta pause 150 ; espera o tempo de se soltar a tecla second = tenths * 16 + units ; calcula convertendo em BCD - 35 -

if BTN_SET = 0 then ; se a tecla Set for premida avança goto loop24 else ; senão repete goto loop21 loop24: if BTN_SET = 0 then goto loop24 ; aguarda até que a tecla Set seja solta pause 150 ; espera o tempo de se soltar a tecla ; define detalhes da comunicação I2C com o relógio i2cslave %11010000, i2cslow, i2cbyte writei2c 0,(second,minute,hour,day,date,month,year,control) pause 25 ; espera 25ms ; define detalhes da comunicação I2C com o mostrador i2cslave $C6, i2cslow, i2cbyte ; Move o cursor para a primeira posição da segunda linha writei2c 0,(254,192,255) writei2c 0,("A atualizar... ",255) ; Escreve mensagem no mostrador pause 850 ; espera 850ms ; reativa interrupção da entrada 1 (botão SOS) e 2 (sensor de fumo) ; quando vão ao nível lógico baixo setint or %00000000,%00000110 return ; retoma à rotina principal do programa Ao longo da programação foram encontrados vários obstáculos que puseram alguns problemas, mas que acabaram por ser resolvidos depois de várias tentativas e vários testes, com a ajuda do professor. - 36 -

No final, desenhei o layout interior da caixa, com a disposição do transformador e da placa de circuito impresso no seu interior, como ilustrado na figura 12. Desenhei também o painel frontal da caixa que se representa na figura 13. Figura 12: Layout interior da caixa Figura 13: Painel frontal da caixa - 37 -