Despertador digital baseado em Arduino
Este relógio de tempo real baseado em Arduino é um relógio digital para exibir o tempo real usando um RTC IC DS1307 que funciona no protocolo I2C. Relógio em tempo real significa que funciona mesmo após queda de energia. Quando a energia é reconectada, ele exibe o tempo real independentemente da hora e da duração em que esteve desligado. Neste projeto de despertador Arduino, usamos um módulo LCD 16×2 para exibir a hora no formato – “horas, minutos, segundos, data, mês e ano”. Uma opção de alarme também é adicionada e podemos definir a hora do alarme. Uma vez que o tempo do alarme é salvo na EEPROM interna do Arduino, ele permanece salvo mesmo após o reset ou falha elétrica. Relógios em tempo real são comumente usados em nossos computadores, casas, escritórios e dispositivos eletrônicos para mantê-los atualizados com tempo real.
O protocolo I2C é um método para conectar dois ou mais dispositivos usando dois fios a um único sistema e, portanto, esse protocolo também é chamado de protocolo de dois fios. Ele pode ser usado para comunicar 127 dispositivos a um único dispositivo ou processador. A maioria dos dispositivos I2C funciona na frequência de 100 KHz.
Etapas para gravação de dados mestre em escravo (modo de recebimento escravo)
- Envia a condição START para o escravo.
- Envia o endereço do escravo para o escravo.
- Envie o bit de gravação (0) para o escravo.
- Recebido bit ACK do escravo.
- Envia o endereço das palavras para o escravo.
- Recebido bit ACK do escravo.
- Envia dados para o escravo.
- Recebido bit ACK do escravo.
- E por último envia a condição STOP para o escravo.
Etapas para leitura de dados do escravo ao mestre (modo de transmissão escravo)
- Envia a condição START para o escravo.
- Envia o endereço do escravo para o escravo.
- Envie o bit de leitura (1) para o escravo.
- Recebido bit ACK do escravo
- Dados recebidos do escravo
- Recebido bit ACK do escravo.
- Envia a condição STOP para o escravo.
Para construir este relógio digital baseado em IC RTC DS1307, usamos aqui o Arduino Pro Mini, mas você também pode usar qualquer outro modelo de Arduino, como Arduino Uno ou Arduino Nano. Junto com a placa Arduino, DS1307 RTC IC, usamos o módulo LCD 16×2 para exibir a hora e a data, um oscilador de cristal, regulador de tensão 7805, um buzzer e alguns transistores e resistores.
Diagrama de Circuito e Descrição
Neste circuito de relógio digital baseado em Arduino, usamos três componentes principais que são IC DS1307, Arduino Pro Mini Board e módulo LCD 16×2.
Aqui, o arduino é usado para ler o tempo de ds1307 e exibi-lo no LCD 16×2. DS1307 envia hora/data usando 2 linhas para o Arduino. Uma campainha também é usada para indicação de alarme, que emite um bipe quando o alarme é ativado. Um diagrama de blocos é mostrado abaixo para entender o funcionamento deste relógio em tempo real.
Como você pode ver no diagrama de circuito, os pinos SDA e SCL do chip DS1307 são conectados aos pinos SDA e SCL do Arduino com resistor pull up que mantém o valor padrão ALTO nas linhas de dados e clock. O oscilador de cristal de 32.768KHz é conectado ao chip DS1307 para gerar um atraso exato de 1 segundo, e uma bateria de 3 volts também é conectada ao pino 3 (BAT) do DS1307 que mantém o tempo funcionando após uma falha de eletricidade. O LCD 16×2 está conectado ao arduino no modo de 4 bits. Os pinos de controle RS, RW e En são conectados diretamente aos pinos 2, GND e 3 do arduino. E o pino de dados D0-D7 está conectado a 4, 5, 6, 7 do arduino. Uma campainha é conectada ao pino arduino número 13 por meio de um transistor NPN BC547 com um resistor de 1 k em sua base.
Três botões definidos, INC e Next são usados para definir o alarme para os pinos 12, 11 e 10 do Arduino no modo ativo baixo. Quando pressionamos definir, o modo de definição de alarme é ativado e agora precisamos definir o alarme usando o botão INC e o botão Avançar é usado para mover para o dígito. A configuração completa do ProtoBoard deste relógio em tempo real com alarme é mostrada na imagem abaixo.
Descrição do Programa
Para programar para este relógio de tempo real, usamos algumas bibliotecas para extrair hora/data do DS1307 e para exibir no LCD, que são fornecidas a seguir:
#include <Wire.h> #include<EEPROM.h> #include <RTClib.h> #include <LiquidCrystal.h>
E a inicialização do RTC, LCD e saída de entrada são realizadas no loop de configuração.
void setup() { Wire.begin(); RTC.begin(); lcd.begin(16,2); pinMode(INC, INPUT); pinMode(next, INPUT); pinMode(set_mad, INPUT); pinMode(buzzer, OUTPUT); digitalWrite(next, HIGH); digitalWrite(set_mad, HIGH); digitalWrite(INC, HIGH);
Resto de coisas como tempo de leitura, configuração de alarme é executado na seção de loop vazio.
lcd.print("Time:"); lcd.setCursor(6,0); lcd.print(HOUR=now.hour(),DEC); lcd.print(":"); lcd.print(MINUT=now.minute(),DEC); lcd.print(":"); lcd.print(SECOND=now.second(),DEC);
Código
/* ----- Programa C para Despertador baseado em Arduino ---- */ #include <Wire.h> #include<EEPROM.h> #include <RTClib.h> #include <LiquidCrystal.h> LiquidCrystal lcd(3, 2, 4, 5, 6, 7); RTC_DS1307 RTC; int temp,inc,hours1,minut,add=11; int next=10; int INC=11; int set_mad=12; #define buzzer 13 int HOUR,MINUT,SECOND; void setup() { Wire.begin(); RTC.begin(); lcd.begin(16,2); pinMode(INC, INPUT); pinMode(next, INPUT); pinMode(set_mad, INPUT); pinMode(buzzer, OUTPUT); digitalWrite(next, HIGH); digitalWrite(set_mad, HIGH); digitalWrite(INC, HIGH); lcd.setCursor(0,0); lcd.print("Relógio de tempo real"); lcd.setCursor(0,1); lcd.print("CAPSistema "); delay(2000); if(!RTC.isrunning()) { RTC.adjust(DateTime(__DATE__,__TIME__)); } } void loop() { int temp=0,val=1,temp4; DateTime now = RTC.now(); if(digitalRead(set_mad) == 0) //definir a hora do alarme { lcd.setCursor(0,0); lcd.print(" Set Alarm "); delay(2000); defualt(); time(); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print(" Hora do alarme "); lcd.setCursor(0,1); lcd.print(" foi definido "); delay(2000); } lcd.clear(); lcd.setCursor(0,0); lcd.print("Time:"); lcd.setCursor(6,0); lcd.print(HOUR=now.hour(),DEC); lcd.print(":"); lcd.print(MINUT=now.minute(),DEC); lcd.print(":"); lcd.print(SECOND=now.second(),DEC); lcd.setCursor(0,1); lcd.print("Date: "); lcd.print(now.day(),DEC); lcd.print("/"); lcd.print(now.month(),DEC); lcd.print("/"); lcd.print(now.year(),DEC); match(); delay(200); } void defualt() { lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); } /*Função para definir a hora do alarme e a hora de alimentação no eeprom interno*/ void time() { int temp=1,minuts=0,hours=0,seconds=0; while(temp==1) { if(digitalRead(INC)==0) { HOUR++; if(HOUR==24) { HOUR=0; } while(digitalRead(INC)==0); } lcd.clear(); lcd.setCursor(0,0); lcd.print("Definir hora do alarme "); //lcd.print(x); lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); delay(100); if(digitalRead(next)==0) { hours1=HOUR; EEPROM.write(add++,hours1); temp=2; while(digitalRead(next)==0); } } while(temp==2) { if(digitalRead(INC)==0) { MINUT++; if(MINUT==60) {MINUT=0;} while(digitalRead(INC)==0); } // lcd.clear(); lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); delay(100); if(digitalRead(next)==0) { minut=MINUT; EEPROM.write(add++, minut); temp=0; while(digitalRead(next)==0); } } delay(1000); } /* Função para verificar o tempo de medicação */ void match() { int tem[17]; for(int i=11;i<17;i++) { tem[i]=EEPROM.read(i); } if(HOUR == tem[11] && MINUT == tem[12]) { beep(); beep(); beep(); beep(); lcd.clear(); lcd.print("Acordar........"); lcd.setCursor(0,1); lcd.print("Acordar......."); beep(); beep(); beep(); beep(); } } /* função para indicação de campainha */ void beep() { digitalWrite(buzzer,HIGH); delay(500); digitalWrite(buzzer, LOW); delay(500); }