0

Arduino digitální hodiny s alarmem

Arduino Alarm Clock

Tyto Arduino hodiny reálného času využívají pro získání času obvod RTC DS1307, který komunikuje po I2C sběrnici. Obvod reálného času se vyznačuje tím, že si udrží informaci o čase i při výpadku napájení, díky záložní baterii určené právě pro zálohu času. Když je napájení obnoveno, tak se pokračuje ve výpisu času bez jeho posunu oproti reálnému. V tomto projektu je pro zobrazení použitý 16×2 LCD displej, který zobrazuje informace ve formátu [hodina:minuta:vteřina], [den, měsíc, rok]. Jak bylo zmíněno, vybraný obvod podporuje také funkci Alarmu, kdy uložené nastavení opět zůstává uloženo i při výpadku hlavního napájení. Obvody reálného času jsou obvykle použity v počítačích, domech, kancelářích a obecně spotřební elektronice, kde je třeba udržovat reálný čas.

I2C protokol je metoda propojení dvou a více zařízení pomocí dvou datových vodičů. Díky tomu se I2C také někdy přezdívá „dvoudrátový“ protokol (two-wire protocol). Maximum připojených zařízení na jednu sběrnici je pak 127. Většina I2C zařízení komunikuje na frekvenci 100 kHz.

Schéma zapojení

Arduino Based Alarm Clock Circuit Diagram

V tomto projektu digitálních hodin s alarmem jsme použili tři hlavní komponenty – Arduino Pro Mini desku, 16×2 LCD displej a obvod DS1307.

Arduino zde slouží k načtení informací o čase a datu z obvodu DS1307 a výpisu těchto informací na displej. Dále je možné připojit k Arduinu sirénku, která je aktivována při zapnutí Alarmu. Níže je blokové schéma tohoto zapojení.

Arduino based Alarm Clock Project Block Diagram

Jak si můžete všimnout na schématu, DS1307 je propojeno pomocí datových pinů SDA a SCL se stejnojmennými piny Arduino desky s pull-up odpory. Krystal 32,768 kHz je zapojen k DS1307 obvodu pro generování hodin o hodnotě přesně 1 vteřina . Dále je zde přítomna také 3V záložní baterie zapojená k obvodu DS1307, která slouží pro zálohu informací v tomto obvodu. Jako poslední je zapojen LCD displej, který je zapojen ve 4bit módu.

Pro větší kontrolu jsou připojena také tři tlačítka, která slouží pro ovládání Alarmu. Pokud tedy zmáčkneme tlačítko SET, začne nastavování Alarmu, kdy tlačítkem INC zvyšujeme vybrané číslovky na displeji a tlačítkem NEXT přecházíme mezi jednotlivými číslicemi.

Breadboard setup of arduino based alarm clock

Ukázkový program

Pro naprogramování těchto hodin je nutné stáhnout knihovny RTClib a LiquidCrystal. Celý program je pak uveden zde:

/* ----- C Program for Arduino based Alarm Clock ---- */

#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("Real Time Clock");
lcd.setCursor(0,1);
lcd.print("Circuit Digest ");
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)      //set Alarm time
{
lcd.setCursor(0,0);
lcd.print("  Set Alarm  ");
delay(2000);
defualt();
time();
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("  Alarm time ");
lcd.setCursor(0,1);
lcd.print(" has been set  ");
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);
}

/*Function to set alarm time and feed time into Internal eeprom*/

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("Set Alarm Time ");
//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);
}

/* Function to chack medication time */

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("Wake Up........");
lcd.setCursor(0,1);
lcd.print("Wake Up.......");
beep();
beep();
beep();
beep();
}

}

/* function to buzzer indication */

void beep()
{
digitalWrite(buzzer,HIGH);
delay(500);
digitalWrite(buzzer, LOW);
delay(500);
}

Videoukázka:

 

Převzato a přeloženo: https://circuitdigest.com/microcontroller-projects/arduino-alarm-clock

Arduino Uno, Mega, Senzory, Moduly za

VÝHODNOU CENU

Luboš

Napsat komentář

Vaše emailová adresa nebude zveřejněna.