Índice:

Usando os módulos de relógio em tempo real DS1307 e DS3231 com o Arduino: 3 etapas
Usando os módulos de relógio em tempo real DS1307 e DS3231 com o Arduino: 3 etapas

Vídeo: Usando os módulos de relógio em tempo real DS1307 e DS3231 com o Arduino: 3 etapas

Vídeo: Usando os módulos de relógio em tempo real DS1307 e DS3231 com o Arduino: 3 etapas
Vídeo: DICAS PARA RTC DS3231 COM ARDUINO 2024, Novembro
Anonim
Usando os Módulos de Relógio em Tempo Real DS1307 e DS3231 com Arduino
Usando os Módulos de Relógio em Tempo Real DS1307 e DS3231 com Arduino
Usando os módulos de relógio em tempo real DS1307 e DS3231 com o Arduino
Usando os módulos de relógio em tempo real DS1307 e DS3231 com o Arduino

Continuamos recebendo solicitações sobre como usar os módulos de relógio em tempo real DS1307 e DS3231 com o Arduino de várias fontes - então, este é o primeiro de um tutorial de duas partes sobre como usá-los. Para este tutorial do Arduino, temos dois módulos de relógio em tempo real para usar, um baseado no Maxim DS1307 (o módulo quadrado) e o DS3231 (o módulo retangular).

Existem duas diferenças principais entre os CIs nos módulos de relógio em tempo real, que é a precisão da hora. O DS1307 usado no primeiro módulo funciona muito bem, no entanto, a temperatura externa pode afetar a frequência do circuito do oscilador que aciona o contador interno do DS1307.

Isso pode parecer um problema, mas geralmente resulta em um atraso de cerca de cinco minutos por mês. O DS3231 é muito mais preciso, pois tem um oscilador interno que não é afetado por fatores externos - e, portanto, tem uma precisão de alguns minutos por ano, no máximo. Se você tem um módulo DS1307 - não se sinta mal, ainda é uma placa de grande valor e irá atendê-lo bem. Com ambos os módulos, uma bateria de backup é necessária.

É uma boa ideia comprar uma bateria CR2032 nova e encaixá-la no módulo. Além de controlar a hora e a data, esses módulos também possuem um pequeno EEPROM, uma função de alarme (apenas DS3231) e a capacidade de gerar uma onda quadrada de várias frequências - todos os quais serão objeto de um segundo tutorial.

Etapa 1: conectando seu módulo a um Arduino

Ambos os módulos usam o barramento I2C, o que torna a conexão muito fácil.

Primeiro, você precisará identificar quais pinos em seu Arduino ou placas compatíveis são usados para o barramento I2C - eles serão conhecidos como SDA (ou dados) e SCL (ou relógio). No Arduino Uno ou placas compatíveis, esses pinos são A4 e A5 para dados e relógio; No Arduino Mega os pinos são D20 e D21 para dados e relógio; E se você estiver usando um Pro Mini compatível, os pinos são A4 e A5 para dados e relógio, que são paralelos aos pinos principais.

Módulo DS1307

Se você tiver o módulo DS1307, precisará soldar os fios à placa ou soldar alguns pinos do cabeçalho em linha para que possa usar fios de jumper. Em seguida, conecte os pinos SCL e SDA ao Arduino, e o pino Vcc ao pino 5V e GND ao GND.

Módulo DS3231

A conexão deste módulo é fácil, pois os pinos de cabeçalho são instalados na placa na fábrica. Você pode simplesmente executar os fios de jumper novamente de SCL e SDA para o Arduino e novamente dos pinos Vcc e GND do módulo para 5V ou 3.3. V e GND da sua placa. No entanto, eles são duplicados no outro lado para soldar seus próprios fios. Ambos os módulos têm os resistores pull-up necessários, então você não precisa adicionar os seus próprios. Como todos os dispositivos conectados ao barramento I2C, tente manter o comprimento dos fios SDA e SCL no mínimo.

Etapa 2: lendo e escrevendo o tempo do seu módulo RTC

Depois de conectar seu módulo RTC. entre e carregue o seguinte esboço. Embora as notas e funções no esboço se refiram apenas ao DS3231, o código também funciona com o DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Converte números decimais normais em decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); } // Converte decimais codificados em binários em números decimais normais byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); } void setup () {Wire.begin (); Serial.begin (9600); // definir a hora inicial aqui: // DS3231 segundos, minutos, horas, dia, data, mês, ano // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte segundo, byte minuto, byte hora, byte dayOfWeek, byte dayOfMonth, byte mês, byte ano) {// define data e hora para DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // define a próxima entrada para iniciar no registro de segundos Wire.write (decToBcd (second)); // definir segundos Wire.write (decToBcd (minuto)); // definir minutos Wire.write (decToBcd (hora)); // definir horas Wire.write (decToBcd (dayOfWeek)); // definir o dia da semana (1 = Domingo, 7 = Sábado) Wire.write (decToBcd (dayOfMonth)); // definir data (1 a 31) Wire.write (decToBcd (mês)); // definir o mês Wire.write (decToBcd (ano)); // definir ano (0 a 99) Wire.endTransmission (); } void readDS3231time (byte * segundo, byte * minuto, byte * hora, byte * dayOfWeek, byte * dayOfMonth, byte * mês, byte * ano) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // define o ponteiro de registro DS3231 para 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // solicita sete bytes de dados do DS3231 a partir do registro 00h * segundo = bcdToDec (Wire.read () & 0x7f); * minuto = bcdToDec (Wire.read ()); * hora = bcdToDec (Wire.read () & 0x3f); * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * mês = bcdToDec (Wire.read ()); * ano = bcdToDec (Wire.read ()); } void displayTime () {byte segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano; // recuperar dados do DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // envia para o monitor serial Serial.print (hora, DEC); // converte a variável de byte em um número decimal quando exibida Serial.print (":"); if (minuto <10) {Serial.print ("0"); } Serial.print (minuto, DEC); Serial.print (":"); if (segundo <10) {Serial.print ("0"); } Serial.print (segundo, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (mês, DEC); Serial.print ("/"); Serial.print (ano, DEC); Serial.print ("Dia da semana:"); switch (dayOfWeek) {case 1: Serial.println ("Sunday"); pausa; caso 2: Serial.println ("segunda-feira"); pausa; caso 3: Serial.println ("terça-feira"); pausa; caso 4: Serial.println ("quarta-feira"); pausa; caso 5: Serial.println ("quinta-feira"); pausa; caso 6: Serial.println ("Friday"); pausa; caso 7: Serial.println ("sábado"); pausa; }} void loop () {displayTime (); // exibe os dados do relógio em tempo real no Monitor Serial, delay (1000); // todo segundo }

Pode haver uma grande quantidade de código, no entanto, ele se divide em partes gerenciáveis.

Primeiro inclui a biblioteca Wire, que é usada para comunicação de barramento I2C, seguida pela definição do endereço de barramento para o RTC como 0x68. Elas são seguidas por duas funções que convertem números decimais em BCD (decimal codificado em binário) e vice-versa. Eles são necessários porque os ICs RTC funcionam em BCD e não em decimais.

A função setDS3231time () é usada para acertar o relógio. É muito fácil usá-lo, basta inserir os valores de um ano para o outro, e o RTC começará a partir dessa hora. Por exemplo, se você deseja definir a seguinte data e hora - quarta-feira, 26 de novembro de 2014 e 21h42 e 30 segundos - você usaria:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Etapa 3:

Observe que a hora é definida para o formato de 24 horas e o quarto parâmetro é o “dia da semana”. Isso cai entre 1 e 7, que é de domingo a sábado, respectivamente. Esses parâmetros são valores de bytes se você estiver substituindo suas próprias variáveis.

Depois de executar a função uma vez, é aconselhável prefixá-la com // e fazer upload do seu código novamente, para que o tempo não seja zerado depois que a alimentação for desligada e desligada ou o microcontrolador zerado. Ler a hora do seu RTC é tão simples quanto, na verdade o processo pode ser seguido perfeitamente dentro da função displayTime (). Você precisará definir variáveis de sete bytes para armazenar os dados do RTC, e estes são então inseridos na função readDS3231time (). Por exemplo, se suas variáveis são:

byte, segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano;

… você os atualizaria com os dados atuais do RTC usando:

readDS3232time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

Em seguida, você pode usar as variáveis como achar adequado, desde o envio da hora e da data para o monitor serial, como faz o esboço de exemplo - até a conversão dos dados em um formato adequado para todos os tipos de dispositivos de saída.

Apenas para verificar se tudo está funcionando, insira a hora e a data apropriadas no esboço de demonstração, carregue-o, comente a função setDS3231time () e carregue-o novamente. Em seguida, abra o monitor serial e você verá uma exibição contínua da hora e data atuais.

A partir deste ponto, você agora tem as ferramentas de software para definir dados e recuperá-los de seu módulo de relógio em tempo real, e esperamos que você compreenda como usar esses módulos baratos.

Você pode aprender mais sobre os CIs de relógio em tempo real específicos no site do fabricante - DS1307 e DS3231.

Esta postagem foi trazida a você por pmdway.com - tudo para fabricantes e entusiastas de eletrônicos, com entrega gratuita em todo o mundo.

Recomendado: