Índice:

Exibição de tempo e tempo do Arduino 3 em 1: 11 etapas
Exibição de tempo e tempo do Arduino 3 em 1: 11 etapas

Vídeo: Exibição de tempo e tempo do Arduino 3 em 1: 11 etapas

Vídeo: Exibição de tempo e tempo do Arduino 3 em 1: 11 etapas
Vídeo: Curso de Arduino para Iniciantes - Aula 01 - Primeiros Passos (Exemplo de um Vumeter) 2024, Julho
Anonim

Por Boomer48Follow Mais do autor:

Usando o ATtiny85
Usando o ATtiny85
Usando o ATtiny85
Usando o ATtiny85
Ferramenta de divisão de pizza e poda de polígonos com tecnologia Pi
Ferramenta de divisão de pizza e poda de polígonos com tecnologia Pi
Ferramenta de divisão de pizza e poda poligonal com tecnologia Pi
Ferramenta de divisão de pizza e poda poligonal com tecnologia Pi
Controles digitais para um amplificador de áudio manual
Controles digitais para um amplificador de áudio manual
Controles digitais para um amplificador de áudio manual
Controles digitais para um amplificador de áudio manual

Gosto de microcontroladores PIC e gosto de programar em linguagem assembly. Na verdade, nos últimos dois anos, postei cerca de 40 projetos em meu site com base nessa combinação. Recentemente, eu estava encomendando algumas peças de um dos meus fornecedores americanos favoritos e vi um Arduino Nano, com um cabo de programação, por apenas US $ 1,20 a mais do que um chip de processador ATMEGA328 simples. Então comprei alguns deles. Em seguida, baixei o IDE do Arduino e limpei minha memória de programação "C ++".

Este projeto é um mash-up de um relógio que usa GPS para cronometragem e um receptor RF que decodifica mensagens meteorológicas de um sensor AcuRite comum. O resultado é uma exibição de tempo e temperatura em pequena escala. O relógio GPS e as rotinas de clima são configurados como arquivos de inclusão separados, portanto, é fácil ir para a rotina principal e configurá-la para fazer apenas a função de relógio ou apenas a função de clima. Apenas descomente o “#define” apropriado no topo da rotina principal se você quiser apenas uma das funções.

Se ambas as funções forem usadas, a linha superior do LCD exibe a hora local e a linha inferior do LCD exibe a umidade e a temperatura em graus Celsius e Fahrenheit. Se apenas a função de relógio for usada, a linha superior exibe a hora local e a linha inferior exibe o UTC. Se apenas a função meteorológica for usada, a linha superior exibe o primeiro sensor recebido e a linha inferior exibe qualquer outro sensor recebido. Eu adicionei esse recurso porque tenho dois sensores meteorológicos.

Etapa 1: sensor meteorológico

Sensor Meteorológico
Sensor Meteorológico
Sensor Meteorológico
Sensor Meteorológico
Sensor Meteorológico
Sensor Meteorológico

O sensor climático AcuRite usado aqui envia informações de temperatura e umidade a cada 16 segundos. Na parte traseira, ele mostra o número do modelo 000592TXR, mas normalmente é anunciado como o modelo 06002M. Este sensor é usado por vários modelos de estações meteorológicas diferentes, por isso é fácil de encontrar e consegui obtê-los no eBay por menos de $ 20. A AcuRite vende sensores de aparência semelhante para algumas de suas estações meteorológicas, mas eles podem ou não aderir ao mesmo protocolo de comunicação. Há alguma indicação na web de que o sensor de temperatura 00606 usa o mesmo formato de mensagem, mas com um byte de umidade inválido.

Conforme visto na primeira forma de onda mostrada acima, as mensagens meteorológicas são enviadas em rajadas com um intervalo de 2 ms entre as mensagens sucessivas. A segunda forma de onda mostrada acima expande parte de uma mensagem para ver as durações e padrões dos bits. Existem quatro bits de sincronização que têm cerca de 600us de altura seguidos de 600us de baixa. Os bits de dados são representados por 400us alto seguido por 200us baixo (1) ou 200us alto seguido por 400us baixo (0).

O formato da mensagem consiste em 7 bytes de dados. Os primeiros dois bytes são o ID do sensor e eles não mudam (ou seja: não usa um código rotativo). O último byte é uma soma de verificação aditiva simples dos primeiros seis bytes. O terceiro byte é um indicador de nível de bateria e deve ser sempre 44 hex se a bateria estiver boa. O quarto byte é a umidade e é um valor não escalonado entre 0 e 99. É importante ter em mente que o bit mais significativo dos bytes 4, 5 e 6 é um bit de paridade e não faz parte da medição valores. Os bytes 5 e 6 são a temperatura escalonada (Celsius) com os 4 bits inferiores do byte 5 sendo concatenados com os 7 bits inferiores do byte 6 para formar um valor de 11 bits. A temperatura é sempre representada como um número positivo e só se torna negativa quando a escala é aplicada. A escala é (C / 10) - 100. A divisão por 10 é necessária porque a resolução da temperatura está em décimos de grau. A subtração é necessária porque 100 é adicionado pelo sensor para manter o valor transmitido positivo.

Etapa 2: Receptor RF

Receptor RF
Receptor RF
Receptor RF
Receptor RF

O módulo RF que uso para este projeto é o RXB6. É um receptor superheteródino em oposição aos receptores superregenerativos menos desejáveis. Se você olhar para os módulos de RF baratos disponíveis, verá que as placas do transmissor e do receptor costumam ser agrupadas. A maioria desses receptores agrupados são tipos super regenerativos, portanto, tendem a ter características de desempenho muito mais baixas (incluindo alcance) do que os receptores super heteródinos. Precisamos apenas do módulo receptor para este projeto porque estaremos recebendo sinais de um transmissor de sensor meteorológico.

Etapa 3: Antenas RF

Antenas RF
Antenas RF

O RXB6 não vem com antena. Você pode comprar alguns helicoidais bem baratos, mas também é fácil fazer sua própria antena. Na verdade, um cabo jumper da placa de ensaio pode ser colocado no pino da antena do módulo se você não quiser ficar muito complicado. Idealmente, uma antena de fio reto teria 1/4 de comprimento de onda, o que equivale a cerca de 6,8 polegadas. Inicialmente, fiz o jumper e não tive problemas em pegar meu sensor externo, embora minha oficina de eletrônica esteja no porão.

Outra possibilidade é fazer sua própria antena helicoidal. Existem vários planos para isso na web, mas o mostrado na imagem acima é o que eu fiz. Usei um fio de núcleo sólido de um pedaço de cabo Ethernet e o enrolei na haste lisa de uma broca de 5/32 polegadas. Deixe o isolamento ligado, exceto para a ponta que solda na placa de RF. Você precisará de 20 voltas. Você também pode usar uma broca de 7/32 polegadas e envolver 17 voltas. Qualquer um deles provavelmente funcionará bem para os intervalos que você provavelmente terá para seus sensores. A verdadeira chave é ter um bom receptor RF para começar. Os sensores AcuRite também possuem transmissores bastante fortes.

Etapa 4: Protocolo de Comunicação RF

Existem algumas técnicas de modulação diferentes para a transmissão de dados, mas esses sensores usam a mais simples que é OOK (on-off-keying) ou ASK (amplitude-shift-keying). Como estamos lidando com bits de dados 0/1 neste exemplo, a amplitude está totalmente ligada ou totalmente desligada. Portanto, para nossos propósitos, OOK e ASK são iguais porque OOK significa que a portadora de RF está totalmente ativada ou totalmente desativada. O formato da mensagem é geralmente definido pelo fabricante do dispositivo de transmissão e eles podem usar praticamente qualquer taxa de transmissão, qualquer estilo de formatação de bit e qualquer comprimento de mensagem. A banda de 433 MHz está repleta de transmissões para coisas como medidores inteligentes, etc., então o software precisa ser ajustado para filtrar apenas o formato de mensagem que queremos usar.

Etapa 5: dados de tempo

Dados de tempo
Dados de tempo

Eu uso uma unidade GPS barata para obter dados de tempo precisos que serão reiniciados automaticamente após uma queda de energia. Tenho várias unidades de GPS (sem monitores) que emitem as frases NMEA padrão, mas a menor e mais barata das unidades que tenho é o NEO-6M. O módulo NEO-6M é fácil de fazer interface com o Arduino porque usa uma porta serial de nível TTL. A única diferença real é que o padrão NMEA especifica uma taxa de transmissão serial de 4800, mas o padrão do NEO-6M é 9600 baud. Você pode executar o programa gratuito “u-center” para alterar a taxa de transmissão, mas eu apenas o deixei no padrão de fábrica. Existe também um programa utilitário gratuito chamado GPSInfo (lançado pela Globalsat) que é muito útil para visualizar informações de GPS no PC. Você pode conectar a unidade GPS a um cabo USB padrão para TTL para verificá-lo ou para configurá-lo usando um PC. Lembre-se de que o chip GPS do módulo funciona a 3,3 volts (por meio de um regulador de voltagem integrado), portanto, se você quiser se conectar à sua porta RXD, deverá reduzir o nível de 5 volts. A porta TXD pode se conectar diretamente ao Arduino ou ao PC.

Etapa 6: fusos horários

Exibir a hora do GPS é uma coisa fácil de fazer, contanto que você apenas queira exibir o UTC (Universal Time Coordinated). As sentenças NMEA são compostas de caracteres ASCII que podem ser enviados diretamente para o LCD. A parte do tempo está no formato HHMMSS. FF (horas, minutos, segundos e segundos fracionários). Para o nosso relógio, a parte fracionária não é útil, então tudo que precisamos lidar são seis caracteres. O problema é que você precisa converter para a hora local e para o formato AM / PM de 12 horas, se desejar. Mas às vezes são os problemas que tornam a vida interessante, então é disso que trata essa parte do software.

Quanto aos fusos horários, você pode pensar que simplesmente haveria 24 deles, com 12 deles a leste da localização UTC (zonas +) e 12 deles a oeste da localização UTC (zonas -). Na verdade, existem alguns poucos que são horas fracionárias e alguns que excedem o “limite” de 12 horas. Se por acaso você mora em uma dessas áreas, peço desculpas porque meu software contabiliza apenas as zonas de 24 horas inteiras. Alguns de nós também usam o horário de verão durante parte do ano, mas isso não é contabilizado automaticamente no software. Isso exigiria uma tabela de pesquisa de datas futuras, complexidade extra no software e a necessidade de atualizar o software se as semanas do ano para a transição mudassem. Em vez disso, o hardware usa um interruptor de contato momentâneo para permitir fácil configuração do fuso horário (deslocamento UTC).

Etapa 7: Esquemático

Esquemático
Esquemático

O esquema é mostrado acima e inclui as conexões para uma interface LCD 1602 de 4 bits. Os dados seriais do receptor RF estão em níveis de lógica digital, portanto, são conectados diretamente a um dos pinos de entrada de dados do Arduino. O pino é configurado no software para executar uma função de interrupção na alteração, de modo que possamos medir as larguras de pulso. A saída GPS TXD é conectada diretamente à entrada do Arduino RX.

Existem dois interruptores usados. Conforme mencionado anteriormente, um interruptor de contato momentâneo permite a configuração do deslocamento UTC. O interruptor pode ser pressionado a qualquer momento para entrar no modo de ajuste. Inicialmente, o display mostrará um deslocamento UTC inválido de “+77”. Consulte a seção “Software do relógio” para obter instruções de configuração de compensação UTC.

O segundo botão é um simples botão liga / desliga. Na posição “desligado” a hora será exibida no formato de 12 horas (AM / PM) e na posição “ligado” a hora será exibida no formato 24 horas. Essa opção pode ser alterada a qualquer momento para alternar entre os formatos.

Se apenas a função de relógio for desejada, o módulo receptor de RF não precisa ser conectado. Se desejar apenas a função meteorológica, o GPS e os dois interruptores não precisam ser conectados.

Etapa 8: Software LCD

Costumo usar um dos dois tipos de interface LCD. Uma é a interface padrão de 4 bits e a outra é uma interface de 3 fios que usa um registrador de deslocamento. Projetei essa interface quando estava trabalhando com pequenos microcontroladores PIC que tinham um número limitado de pinos de E / S. Usei a interface de 4 bits para este projeto, mas tenho meu próprio arquivo de inclusão de LCD em vez de usar a biblioteca genérica de LCD do Arduino. Isso reduz o consumo de memória e a complexidade do código e também me permite ajustar o código para projetos específicos como este.

Etapa 9: Software do relógio

A unidade GPS emite sentenças NMEA-0183 padrão que são strings ASCII que contêm uma variedade de informações. Para esta aplicação, escolhi a frase GGA para obter as informações de tempo, porque essa é a frase que usei para um projeto GPS anterior. Os campos de informação em sentenças NMEA são separados por vírgulas, portanto, após o cabeçalho da sentença GGA ser detectado, o software normalmente contaria vírgulas e chamaria a rotina apropriada para cada campo desejado de informações de GPS. Apenas a informação de tempo é necessária aqui e que está no campo após a primeira vírgula, portanto, nenhuma contagem é necessária.

Os seis dígitos de tempo (HHMMSS) são armazenados em buffer e processados após o recebimento de todos. O GPS pode gerar algumas mensagens incompletas no início, de modo que a rotina de armazenamento em buffer verifica se cada caractere é um valor numérico ASCII. Se um caractere incorreto for recebido, a mensagem será descartada. Isso também pode acontecer em raras ocasiões durante a operação normal, especialmente se a comunicação da porta serial cair um pouco. Eu só vi isso uma vez e tudo o que aconteceu é que o tempo parou por um segundo e depois saltou dois segundos em vez de um.

Se o software estiver configurado para exibir apenas a hora, a primeira linha do LCD exibirá a hora local e a segunda linha exibirá UTC. Para UTC, o software apenas envia os caracteres ASCII diretamente para a rotina de exibição, com dois pontos (:) inseridos apropriadamente.

Para converter o UTC para a hora local, o deslocamento UTC (fuso horário) deve ser aplicado. Como a hora UTC do GPS está no formato ASCII, o software converte os caracteres de hora ASCII em decimais e adiciona o deslocamento UTC. O deslocamento UTC é armazenado como um valor BCD positivo com um bit de sinal, portanto, é primeiro convertido em um valor inteiro e, em seguida, negado se o bit de sinal for definido. Depois que o valor da hora local é calculado, uma tabela de pesquisa é usada para convertê-lo em BCD e, em seguida, o BCD é convertido de volta para ASCII para exibição. A tabela de pesquisa precisa lidar com o formato UTC de 24 horas, bem como +/- 12 fusos horários. Para fazer isso, os horários UTC de 0000 a 2300 ocupam as 24 entradas do meio na tabela com 12 entradas antes e 12 entradas depois para contabilizar os fusos horários. Uma tabela está no formato de 12 horas, então também adicionei uma tabela de pesquisa para a parte AM / PM do display. A outra tabela está no formato de 24 horas. Conforme mencionado anteriormente, um botão liga / desliga permite a seleção do formato de 12 ou 24 horas.

O fuso horário é recuperado da EEPROM durante a inicialização e rapidamente exibido. Se não tiver sido definido pelo menos uma vez, a rotina de configuração é chamada. A rotina de configuração também pode ser chamada a qualquer momento pressionando o interruptor de contato momentâneo. A rotina de configuração inicializará o display para “UTC OFFSET +77”. Um toque curto no botão mudará o valor para “-00”. Se um fuso horário positivo for necessário, outro toque curto mudará o valor para “+00”. Um toque longo (> 1 segundo) moverá o modo de configuração para a próxima etapa. Neste ponto, cada pressão curta aumentará o valor de tempo até um máximo de 12. Após atingir o fuso horário desejado, pressione e segure o botão por mais de 1 segundo e, em seguida, solte-o. O software salvará o valor UTC na EEPROM e exibirá brevemente “OFFSET SAVED”. Se você cometer um erro durante a entrada, apenas saia e pressione o botão novamente para reiniciá-lo.

O NEO-6M não requer uma boa posição fixa para gerar a hora, então ele deve enviar mensagens assim que conseguir um satélite. Até então, o display exibirá “SEM DADOS”.

Etapa 10: software meteorológico

O microcontrolador PIC tem a capacidade de ligar / desligar um temporizador usando um pulso externo. Esse mesmo pulso de entrada também pode ser usado como uma interrupção externa para sinalizar uma leitura da duração do pulso. O Arduino não tem essa capacidade exata, então usei a função interromper na mudança. Em uma extremidade do pulso de mensagem RF, o tempo atual de microssegundos é salvo pelo manipulador de interrupção. Na borda oposta, o tempo decorrido é calculado para determinar a largura do pulso.

O software possui uma definição “DEBUG” que permite a visualização do formato dos dados brutos das mensagens recebidas. Também existe um definir para especificar o pino de entrada do Arduino para o fluxo serial do receptor RF. O software é configurado para calcular as configurações de registro de interrupção na alteração apropriadas com base nesta definição. O cálculo funciona apenas para os pinos digitais do Arduino. Um pino analógico poderia ser usado em vez disso, mas isso exigiria a codificação rígida dos valores de registro.

O manipulador de interrupção determina se a contagem capturada é longa o suficiente para ser um pulso inicial. Conforme mencionado anteriormente, o intervalo entre várias mensagens é de 2 ms, de modo que é isso que o software procura. Por causa de todo o tráfego de 433 MHz, a triagem inicial no software garante que o tempo medido seja de pelo menos 1,8 ms, mas não maior que 2,4 ms. Depois que o início é detectado, o software procura os bits de sincronização (600us) e faz a contagem para garantir que quatro deles sejam recebidos. Depois que esses testes são aprovados, o software procura os tempos de bits adequados de 200us e 400us.

Os bits recebidos são formados em bytes e cada byte é salvo. Depois que sete bytes são recebidos, a soma de verificação da mensagem é verificada antes que o processamento posterior seja permitido. Se bytes brutos devem ser produzidos (modo de depuração), os bytes são convertidos em caracteres ASCII e enviados para o LCD. Se as saídas de umidade e temperatura forem desejadas, as conversões apropriadas serão realizadas.

Os dois bytes de dados centígrados na mensagem RF são combinados para formar um valor de 11 bits. A parte inferior é deslocada um bit para a esquerda para eliminar o bit de paridade e alinhá-lo com os bits da parte superior. Os dois bytes são formados em uma variável de palavra de 16 bits e então tudo é deslocado um bit para a direita para obter o alinhamento de bits final. A palavra variável é então convertida em uma variável de ponto flutuante para os cálculos matemáticos.

Uma grande vantagem de usar C ++ no Arduino em comparação com a linguagem assembly no PIC é que ele simplifica os cálculos matemáticos. Como mencionado anteriormente, a conversão Centígrado é (C / 10) -100. O resultado é convertido em uma string e enviado ao LCD para exibição. O cálculo Fahrenheit é (C * 1.8) + 32. O resultado é novamente convertido em uma string e enviado ao LCD para exibição. Em ambos os casos, a conversão de String inclui o sinal negativo (se apropriado) e o ponto decimal. Uma verificação é feita para o ponto decimal para garantir que apenas um caractere após o decimal seja enviado ao visor. Essa verificação é necessária porque a string pode variar de 3 a 5 caracteres.

Eu tenho dois sensores AcuRite, então adicionei uma verificação no software para garantir que os dados de um não sobrescrevam os dados do outro se o software estiver configurado para fazer apenas a função meteorológica. O primeiro sensor recebido após a inicialização é exibido na linha 1 e o outro é exibido na linha 2. Usando o modo de depuração, posso ver qual é o ID de cada sensor, então poderia fazer uma verificação simples no código se eu apenas queria processar dados de um deles.

O software monitora o status da bateria (byte3) e exibe uma mensagem se indicar bateria fraca. Esta mensagem substitui todos os outros dados desse sensor.

Etapa 11: monitores

Monitores
Monitores
Monitores
Monitores
Monitores
Monitores

Aqui estão alguns exemplos de telas para as várias funções. Tenho alguns outros Instructables, mas a maioria dos meus projetos de microcontroladores PIC podem ser encontrados em meu site: www.boomerrules.wordpress.com

Recomendado: