Índice:

Temporizador programável de 8 canais: 13 etapas
Temporizador programável de 8 canais: 13 etapas

Vídeo: Temporizador programável de 8 canais: 13 etapas

Vídeo: Temporizador programável de 8 canais: 13 etapas
Vídeo: ⏰ Como INSTALAR e CONFIGURAR um timer digital (programador horário) 2024, Julho
Anonim
Temporizador programável de 8 canais
Temporizador programável de 8 canais
Temporizador programável de 8 canais
Temporizador programável de 8 canais
Temporizador programável de 8 canais
Temporizador programável de 8 canais

Introdução

Eu tenho usado a linha de microcontroladores PIC da Microchip para meus projetos desde 1993, e tenho feito toda a minha programação em linguagem assembler, usando o IDE Microchip MPLab. Meus projetos variam de simples semáforos e LEDs piscando, a interfaces de joystick USB para modelos R / C e analisadores de painéis usados na indústria. O desenvolvimento demorava muitos dias e, às vezes, milhares de linhas de código assembler.

Depois de receber Matrix Multimedia Flowcode 4 Professional, fiquei bastante cético em relação ao software. Parecia muito fácil de acreditar. Decidi experimentar e testei todas as diferentes macros de componentes, todas com grande sucesso. A melhor parte de usar o Flowcode é que projetos simples podem ser codificados em uma única noite. Depois de brincar com o I²C e um relógio de tempo real DS1307, decidi projetar o Timer de 8 canais usando o Flowcode. Não sendo um projeto pequeno e fácil, acreditei que seria um ótimo projeto para aprender o Flowcode sozinho.

Selecionando um microprocessador e outros componentes

Devido ao número de pinos de E / S necessários, ficou claro que um dispositivo de 40 pinos será necessário. O PIC 18F4520 foi escolhido, principalmente por sua memória de programa de 32K e 1536 bytes de memória de dados. Todos os componentes usados são dispositivos passantes padrão, tornando possível construir o circuito na placa Vero se necessário. Isso também ajudou no desenvolvimento de uma placa de ensaio.

Etapa 1: Objetivos do Projeto

Objetivos do projeto
Objetivos do projeto

Objetivos

- Manutenção precisa do tempo, com bateria reserva.

- Todos os programas e dados devem ser retidos, mesmo após a perda de energia.

- Interface de usuário simples.

- Flexibilidade de programação.

Manutenção do tempo

Vivendo em uma área sujeita a falhas de energia, o padrão de 50/60 Hz das linhas de energia não será suficiente para manter o tempo preciso. Um relógio em tempo real era essencial, e depois de testar vários chips RTC, decidi pelo DS1307 devido ao seu oscilador simples e configuração de bateria reserva. Uma manutenção de tempo bastante precisa foi obtida usando apenas um cristal de 32,768 kHz conectado ao DS1307. A precisão foi de 2 segundos ao longo de um período de teste de 2 meses usando 4 marcas diferentes de cristais.

Retenção de dados

Todos os dados do programa do temporizador devem ser retidos, mesmo durante queda de energia. Com até 100 programas diferentes e vários dados de configuração, ficou claro que os 256 bytes de EEPROM on-board do PIC não serão grandes o suficiente. Um 24LC256 I²C EEPROM é usado para armazenar todas as informações de programação.

Interface de usuário simples

A interface do usuário consiste em apenas 2 itens, um display LCD de 16 x 4 linhas com luz de fundo LED e um teclado 4 x 3. Toda a programação pode ser feita pressionando apenas alguns botões. As adições à interface são uma campainha piezoelétrica audível e uma luz de fundo de LCD com piscar visual.

Etapa 2: flexibilidade de programação

Flexibilidade de programação
Flexibilidade de programação

Para garantir flexibilidade de programa suficiente, o temporizador tem 100 programas que podem ser definidos individualmente. Para cada programa, podem ser definidos a hora de ativação, a hora de desativação, os canais de saída e o dia da semana. Cada programa possui três modos:

- Auto: On Time, Off time, Output Channel e Day of week são definidos.

- Desligado: O programa individual pode ser desativado, sem excluir as configurações. Para habilitar o programa novamente, simplesmente selecione um modo diferente.

- Dia / Noite: está definido a hora de ligar, a hora de desligar, o canal de saída e o dia da semana. Funciona da mesma forma que o modo Auto, mas irá

somente ligue as saídas entre os horários On e Off, quando estiver escuro. Isso permite o controle total de dia / noite também

como a flexibilidade adicional de acender as luzes ao pôr do sol e apagá-las ao nascer do sol.

Exemplo 1: ligará a luz após as 20:00 e desligará a luz ao nascer do sol:

Em: 20:00, Desligado: 12h, Exemplo 2: vai acender a luz ao pôr do sol e desligar a luz às 23:00.

Em: 12:00

Desligado: 23:00

Exemplo 3: Liga a luz ao pôr do sol e desliga a luz ao nascer do sol.

Em: 12:01

Desligado: 12:00

Opções adicionais disponíveis, todas trabalhando independentemente dos 100 programas liga / desliga.

Canais de programa ativos: Em vez de desligar vários programas, os canais de saída individuais podem ser desabilitados sem a necessidade de alterar os programas.

Entradas auxiliares: Duas entradas digitais estão disponíveis, para permitir que certos canais de saída sejam ligados por um tempo específico. Pode, por exemplo, ser usado para acender certas luzes ao chegar em casa tarde da noite, quando um botão de um controle remoto é pressionado, ou para acender um ser diferente de luzes quando o alarme da casa é acionado.

Saídas auxiliares: Duas saídas adicionais (além dos 8 canais de saída) estão disponíveis. Eles podem ser programados para ligar com determinados canais de saída ou com as entradas digitais. Na minha instalação, tenho saídas 6-8 controlando minha irrigação, que funciona em 24V. Eu uso os canais 6 a 8 para ligar uma das saídas auxiliares, para ligar uma fonte de alimentação de 24 V para o sistema de irrigação.

Ativação manual: Quando na tela principal, os botões de 1 a 8 podem ser usados para ativar ou desativar canais manualmente.

Etapa 3: Hardware

Hardware
Hardware

Fonte de alimentação: A fonte de alimentação consiste em um retificador, um capacitor de suavização e um fusível de 1 Amp para proteção contra sobrecarga. Este fornecimento é então regulado por um regulador 7812 e 7805. A fonte de 12 V é usada para acionar os relés de saída e todos os outros circuitos são alimentados por uma fonte de 5 V. Como o regulador 7805 está conectado à saída do regulador 7812, a corrente total deve ser limitada a 1 ampere através do regulador 7812. É aconselhável montar esses reguladores em um dissipador de calor adequado.

Barramento I²C: Embora o Flowcode permita o controle I²C do hardware, decidi fazer uso da configuração do software I²C. Isso permite mais flexibilidade nas atribuições dos pinos. Embora mais lento (50 kHz), ainda tem um ótimo desempenho em comparação com o barramento I²C de hardware. Tanto o DS1307 quanto o 24LC256 estão conectados a este barramento I²C.

Relógio em tempo real (DS1307): Durante a inicialização, o registro RTC 0 e 7 é lido para determinar se ele contém tempo válido e dados de configuração. Uma vez configurado corretamente, a hora RTC é lida e a hora carregada no PIC. Este é o único momento em que a hora é lida no RTC. Após a inicialização, um pulso de 1 Hz estará presente no pino 7 do RTC. Este sinal de 1 Hz é conectado ao RB0 / INT0 e, por meio de uma rotina de serviço de interrupção, a hora do PIC é atualizada a cada segundo.

EEPROM externa: Todos os dados e opções do programa são armazenados na EEPROM externa. Os dados EEPROM são carregados na inicialização e uma cópia dos dados é armazenada na memória PIC. Os dados da EEPROM são atualizados apenas quando as configurações do programa são alteradas.

Sensor Dia / Noite: Um resistor dependente de luz (LDR) padrão é usado como o sensor Dia / Noite. Como os LDRs vêm em muitos formatos e variedades, todos com diferentes valores de resistência nas mesmas condições de luz, usei um canal de entrada analógico para ler o nível de luz. Os níveis diurno e noturno são ajustáveis e permitem alguma flexibilidade para diferentes sensores. Para configurar alguma histerese, podem ser definidos valores individuais para Dia e Noite. O estado só mudará se o nível de luz estiver abaixo do Dia, ou acima dos pontos de ajuste noturnos, por mais de 60 segundos.

Display LCD: é usado um display de 4 linhas e 16 caracteres, pois todos os dados não podiam ser exibidos em um display de 2 linhas. O projeto inclui alguns caracteres personalizados, que são definidos na macro LCD_Custom_Char.

Entradas auxiliares: Ambas as entradas são armazenadas em buffer com um transistor NPN. + 12 V e 0 V também estão disponíveis no conector, permitindo conexões mais flexíveis com conexões externas. Como exemplo, um receptor de controle remoto pode ser conectado à alimentação.

Saídas: Todas as saídas são isoladas eletricamente do circuito por meio de um relé de 12V. Os relés usados são classificados para 250 Vca, a 10 amperes. Os contatos normalmente abertos e normalmente fechados são trazidos para os terminais.

Teclado: O teclado usado é um teclado de matriz 3 x 4 e está conectado à PORTB: 2..7.

Etapa 4: interrupções do teclado

Interrupções do teclado
Interrupções do teclado
Interrupções do teclado
Interrupções do teclado
Interrupções do teclado
Interrupções do teclado

Eu queria usar a interrupção PORTB na alteração em qualquer pressionamento de tecla. Para isso, uma interrupção personalizada teve que ser criada no Flowcode, para garantir que a direção e os dados do PORTB sejam configurados corretamente antes e depois de cada interrupção do teclado. Uma interrupção é gerada cada vez que um botão é pressionado ou liberado. A rotina de interrupção só responde quando uma tecla é pressionada.

INTERROMPIDO PERSONALIZADO

Habilitar código

portb = 0b00001110; trisb = 0b11110001;

intcon. RBIE = 1;

intcon2. RBIP = 1;

intcon2. RBPU = 1;

rcon. IPEN = 0;

Código do manipulador

if (intcon & (1 << RBIF))

{FCM_% n ();

portb = 0b00001110;

trisb = 0b11110001;

wreg = portb;

clear_bit (intcon, RBIF);

}

Problemas encontrados

Durante uma interrupção, a rotina de serviço de interrupção deve, sob NENHUMA condição, chamar qualquer outra macro que possa ser usada em algum lugar no resto do programa. Isso eventualmente levará a problemas de estouro de pilha, pois a interrupção pode ocorrer ao mesmo tempo que o programa principal também está na mesma sub-rotina. Isso também é identificado como um ERRO SÉRIO pelo Flowcode quando o código é compilado.

No código personalizado do teclado em GetKeyPadNumber, há uma chamada para a macro Delay_us, que causará um estouro de pilha. Para superar isso, removi o comando Delay_us (10) e o substituí por 25 linhas de “wreg = porta;” comandos. Este comando lê PORTA e coloca seu valor no registrador W, apenas para obter algum atraso. Este comando será compilado em uma única instrução semelhante ao assembler movf porta, 0. Para o clock de 10 MHz usado no projeto, cada instrução será de 400 ns, e para obter um atraso de 10 us, precisei de 25 dessas instruções.

Observe na segunda linha da Figura 3: GetKeypadNumber Custom Code, que o comando original delay_us (10) foi desabilitado com “//”. Abaixo disso, adicionei meus 25 “wreg = porta;” comandos para obter um novo atraso de 10us. Sem chamadas para nenhuma macro dentro do código personalizado Keypad_ReadKeypadNumber, a macro do teclado agora pode ser usada dentro de uma rotina de serviço de interrupção.

Deve-se observar que os componentes Flowcode Keypad e eBlocks não usam os resistores pull-up padrão nas linhas de entrada. Em vez disso, ele usa resistores pull-down de 100K. Devido a algumas interferências encontradas no teclado durante o desenvolvimento, os resistores de 100K foram todos substituídos por 10K e todos os resistores de 10K foram substituídos por 1K5. O teclado foi testado para funcionar corretamente com cabos de 200 mm.

Etapa 5: usando o cronômetro

Usando o cronômetro
Usando o cronômetro
Usando o cronômetro
Usando o cronômetro
Usando o cronômetro
Usando o cronômetro

Todas as telas são configuradas para indicar todas as informações necessárias para que o usuário faça alterações rápidas nas configurações. A linha 4 é usada para auxiliar na navegação pelos menus e opções do programa. Um total de 22 telas estão disponíveis durante a operação normal.

LINHA 1: Tempo e Status

Mostra o dia e a hora atuais, seguidos por ícones de status:

A - Indica que a entrada auxiliar A foi acionada e o cronômetro da entrada auxiliar A está em execução.

B - Indica que a entrada auxiliar B foi acionada e o temporizador da entrada auxiliar B está em execução.

C - indica que a saída auxiliar C está ligada.

D - Indica que a Saída Aux D está ligada.

} - Status do sensor Dia / Noite. Se presente, indica que é noite.

LINHA 2: Saídas do Programa

Mostra os canais que foram ativados pelos diferentes programas. Os canais são exibidos em seus números de saída e um “-“indica que a saída específica não está ligada. Os canais que foram desabilitados em “Program Outputs Active” ainda serão indicados aqui, mas as saídas reais não serão configuradas.

LINHA 3: Saídas reais

Mostra quais canais são ativados pelos diferentes programas, entradas auxiliares A e B ou saídas manuais definidas pelo usuário. Pressionar 0 retornará todas as saídas ativadas manualmente para desligadas e redefinirá os temporizadores A e B da Saída Auxiliar.

LINHA 4: Menu e opções principais (em todos os menus)

Indica a função das teclas “*” e “#”.

A parte central indica quais teclas numéricas (0-9) estão ativas para a tela selecionada.

O status de entrada da entrada auxiliar A e B também é mostrado por meio de um ícone de chave aberto ou fechado.

As saídas podem ser ligadas / desligadas manualmente pressionando a tecla correspondente no teclado.

Ao longo dos menus, as teclas Star e Hash são usadas para navegar pelas diferentes opções do programa. As teclas 0-9 são usadas para definir as opções. Onde várias opções estão disponíveis em uma única tela ou menu de programação, a tecla Hash é usada para percorrer as diferentes opções. A opção atualmente selecionada será sempre indicada pelo caractere “>” à esquerda da tela.

0-9 Insira os valores de tempo

1-8 Mudança de seleção de canal

14 36 Avançar nos programas, 1 passo para trás, 4 passos para trás 10 programas, 3 passos para frente, 6 passos para frente 10

programas

1-7 Defina os dias da semana. 1 = Domingo, 2 = Segunda-feira, 3 = Terça-feira, 4 = Quarta-feira, 5 = Quinta-feira, 6 = Sexta-feira, 7 = Sábado

0 Na tela principal, limpe todas as substituições manuais e temporizadores de entrada A e entrada B. Em outros menus, as mudanças

opções selecionadas

# Na tela principal, desativará todas as substituições manuais, temporizadores de entrada A e entrada B e saídas de programa, até

o próximo evento.

* e 1 Reinicie o cronômetro

* e 2 Limpar todos os programas e opções, restaurar as configurações para o padrão.

* e 3 Coloque o temporizador em espera. Para ligar o cronômetro novamente, pressione qualquer tecla.

Durante as entradas incorretas de qualquer valor de tempo, a luz de fundo do LCD piscará 5 vezes para indicar um erro. Ao mesmo tempo, a campainha soará. Os comandos Exit e Next funcionarão apenas quando a entrada atual estiver correta.

Retroiluminação LCD

Na primeira inicialização, a luz de fundo do LCD será ligada por 3 minutos, a menos que:

- Há uma falha de hardware (EEPROM ou RTC não encontrado)

- Tempo não definido no RTC

A luz de fundo do LCD será ligada novamente por 3 minutos em qualquer entrada do usuário no teclado. Se a luz de fundo do LCD estiver desligada, qualquer comando do teclado ligará primeiro a luz de fundo do LCD e ignorará a tecla que foi pressionada. Isso garante que o usuário possa ler o visor LCD antes de usar o teclado. A luz de fundo do LCD também será ligada por 5 segundos se Aux Input A ou Aux Input B estiver ativado.

Etapa 6: capturas de tela do menu

Capturas de tela do menu
Capturas de tela do menu
Capturas de tela do menu
Capturas de tela do menu
Capturas de tela do menu
Capturas de tela do menu

Usando o teclado, cada uma das opções pode ser programada facilmente. As imagens fornecem algumas informações sobre o que cada tela faz.

Etapa 7: Design do sistema

Desenho do Sistema
Desenho do Sistema

Todo o desenvolvimento e teste foram feitos no breadboard. Olhando para todas as seções do sistema, quebrei o sistema em três módulos. Esta decisão foi principalmente devido às limitações de tamanho do PCB (80 x 100 mm) da versão gratuita do Eagle.

Módulo 1 - Fonte de alimentação

Módulo 2 - placa CPU

Módulo 3 - placa de relé

Decidi que todos os componentes devem ser facilmente obtidos e que não quero usar componentes de montagem em superfície.

Vamos examinar cada um deles.

Etapa 8: Fonte de alimentação

Fonte de energia
Fonte de energia
Fonte de energia
Fonte de energia
Fonte de energia
Fonte de energia
Fonte de energia
Fonte de energia

A fonte de alimentação é direta e fornece 12V e 5V para a CPU e as placas de relé.

Montei os reguladores de tensão em dissipadores de calor decentes e também usei capacitores superestimados para a alimentação.

Etapa 9: Placa CPU

Placa CPU
Placa CPU
Placa CPU
Placa CPU
Placa CPU
Placa CPU
Placa CPU
Placa CPU

Todos os componentes, exceto tela LCD, teclado e relés são montados na placa da CPU.

Os blocos de terminais foram adicionados para simplificar as conexões entre a fonte, duas entradas digitais e o sensor de luz.

Os pinos / soquetes do cabeçote permitem conexões fáceis com a tela LCD e o teclado.

Para as saídas dos relés, usei o ULN2803. Ele já contém todos os resistores de acionamento e diodos flyback necessários. Isso garantiu que a placa da CPU ainda pudesse ser feita usando a versão gratuita do Eagle. Os relés são conectados aos dois ULN2803s. O ULN2803 inferior é usado para as 8 saídas e o ULN2803 superior para as duas saídas auxiliares. Cada saída auxiliar possui quatro transistores. As conexões com os relés também são feitas por meio de pinos / soquetes principais.

O PIC 18F4520 foi equipado com uma tomada de programação, de forma a permitir uma programação fácil através do programador PicKit 3.

NOTA:

Você notará que a placa contém um IC adicional de 8 pinos. O IC superior é um PIC 12F675 e conectado a uma entrada digital. Isso foi adicionado durante o design do PCB. Isso facilita o pré-processamento da entrada digital. No meu aplicativo, uma das entradas digitais está conectada ao meu sistema de alarme. Se o alarme tocar, algumas luzes serão acesas em minha casa. Armar e desarmar meu sistema de alarme dá diferentes bipes na sirene. Usando o PIC 12F675, agora posso distinguir entre armar / desarmar e um alarme real. O 12F675 também é equipado com um soquete de programação.

Também providenciei uma porta I2C via pino / soquete do cabeçalho. Isso será útil mais tarde com as placas de relé.

A placa contém alguns jumpers, que devem ser soldados antes de encaixar os soquetes do IC.

Etapa 10: Conclusão do Código de Fluxo

Conclusão do código de fluxo
Conclusão do código de fluxo
Conclusão do código de fluxo
Conclusão do código de fluxo
Conclusão do código de fluxo
Conclusão do código de fluxo

Como estou acostumado a trabalhar no nível de registro na montagem, às vezes era difícil e frustrante usar as macros de componentes. Isso se deveu principalmente à minha falta de conhecimento da estrutura de programação do Flowcode. Os únicos lugares em que usei os blocos C ou ASM foram para ligar as saídas dentro de uma rotina de interrupção e na rotina Do_KeyPressed para desabilitar / habilitar a interrupção do teclado. O PIC também é colocado em SLEEP usando um bloco ASM, quando o EEPROM ou RTC não é encontrado.

A ajuda sobre o uso dos diferentes comandos I²C foi obtida nos arquivos de Ajuda do Flowcode. É necessário saber exatamente como os diferentes dispositivos I²C funcionam, antes que os comandos possam ser usados com sucesso. Projetar um circuito exige que o projetista tenha todas as planilhas de dados relevantes disponíveis. Isso não é uma deficiência do Flowcode.

O Flowcode realmente resistiu ao teste e é altamente recomendado para pessoas que desejam começar a trabalhar com a linha de microprocessadores Microchip.

A programação e configuração do código de fluxo para o PIC foram definidas de acordo com as imagens

Etapa 11: Placa de Relé I2C Opcional

Placa de Relé I2C Opcional
Placa de Relé I2C Opcional
Placa de Relé I2C Opcional
Placa de Relé I2C Opcional
Placa de Relé I2C Opcional
Placa de Relé I2C Opcional

A placa da CPU já possui conexões de cabeçalho para 16 relés. Essas saídas são transistores de coletor aberto por meio dos dois chips ULN2803. Isso pode ser usado para alimentar os relés diretamente.

Após os primeiros testes do sistema, não gostei de todos os fios entre a placa da CPU e os relés. Como incluí uma porta I2C na placa da CPU, decidi projetar a placa de relé para se conectar à porta I2C. Usando um chip expansor de porta de E / S MCP23017 de 16 canais e um conjunto de transistores ULN2803, reduzi as conexões entre a CPU e os relés para 4 fios.

Como não consegui encaixar 16 relés em uma placa de circuito impresso de 80 x 100mm, decidi fazer duas placas. Cada MCP23017 usa apenas 8 de suas 16 portas. A placa 1 controla as 8 saídas e a placa 2 as duas saídas auxiliares. A única diferença nas placas são os endereços de cada placa. Isso é facilmente definido com um mini jumper. Cada placa possui conectores para fornecer energia e dados I2C para a outra placa.

NOTA:

Se necessário, o software prevê apenas uma placa que pode usar todas as 16 portas. Todos os dados do relé de saída estão disponíveis na primeira placa.

Como o circuito é opcional e muito simples, não criei um esquema. Se houver demanda suficiente, posso adicioná-la mais tarde.

Etapa 12: Link RF opcional

Link RF Opcional
Link RF Opcional
Link RF Opcional
Link RF Opcional
Link RF Opcional
Link RF Opcional

Após a conclusão do projeto, logo percebi que preciso puxar uma grande quantidade de fiação de 220 V CA para o temporizador. Desenvolvi um link de RF usando módulos padrão de 315 MHz que permitia que o temporizador fosse colocado dentro de um armário, e as placas de relé dentro do telhado, perto de toda a fiação de 220V.

O link usa um AtMega328P rodando a 16MHz. O software para o transmissor e o receptor é o mesmo e o modo é selecionado por um mini jumper.

Transmissor

O transmissor é simplesmente conectado à porta I2C da CPU. Nenhuma configuração adicional é necessária, pois o AtMega328P escuta os mesmos dados que as placas de relé I2C.

Os dados são atualizados uma vez por segundo na porta I2C e o transmissor envia essas informações pelo link de RF. Se o transmissor não receber dados I2C por cerca de 30 segundos, o transmissor transmitirá dados continuamente para desligar todos os relés para a unidade receptora.

A energia para o módulo transmissor pode ser selecionada entre 12 V e 5 V com um mini jumper na placa do PC. Estou ligando meu transmissor usando 12V.

Receptor

O receptor escuta os dados codificados do transmissor e coloca os dados em uma porta I2C. A placa de relé simplesmente se conecta a esta porta e funciona da mesma forma que foi conectada à placa da CPU.

Se o receptor não receber dados válidos por 30 segundos, o receptor enviará dados continuamente na porta I2C para desligar todos os relés nas placas de relé.

Esquemas

Um dia, se houver demanda para isso. O esboço do Arduino contém todas as informações necessárias para construir o circuito sem um diagrama de circuito.

Faixa

Na minha instalação, o transmissor e o receptor estão separados por cerca de 10 metros. O cronômetro está dentro de um armário e a unidade de relé no topo do teto.

Etapa 13: Produto Final

Produto final
Produto final
Produto final
Produto final
Produto final
Produto final

A unidade principal foi instalada em uma caixa de projeto antiga. Ele contém o seguinte:

- Transformador 220V / 12V

- Placa de fonte de alimentação

- Placa CPU

- Tela de LCD

- teclado

- Transmissor RF Link

- Unidade receptora remota residencial adicional para permitir que eu ligue / desligue as luzes por meio do controle remoto

A unidade de relé consiste no seguinte:

- Transformador 220V / 12V

- Placa de fonte de alimentação

- Receptor RF Link

- 2 placas de relé I2C

Todas as placas foram projetadas com a mesma dimensão, facilitando o empilhamento umas sobre as outras com espaçadores de 3mm.

Recomendado: