ساخت آلارم ساعت با برد Raspberry Pi پای و DS1307

در این قسمت می خواهیم مراحل ساخت آلارم ساعت با استفاده از برد Raspberry Pi و آی سی DS1307 را با هم انجام دهیم. اما شاید به نظرتان با توجه به اینکه Raspberry Pi خود دارای ساعت است چرا به مازول DS1307 نیاز داریم؟

تاحدودی می توان گفت پاسخ شما صحیح است اما این زمانیست که برد Raspberry Pi شما به اینترنت متصل باشد و یا اگر به اینترنت متصل نیست دارای باتری پشتیبان باشد تا پس از خاموش شدن اطلاعات آن ریست نگردد و علاوه بر این موارد آی سی DS1307 بسیار دقیق می باشد و در بسیاری از بردهایی که نیاز به ساعت دقیق دارند از این قطعه استفاده می کنند و با راه اندازی این آی سی ارزان قیمت با راه اندازی پروتکل i2c نیز آشنا می شوید پس در ادامه با ما همراه باشید.

در این مدار برای نمایش زمان از ال سی دی کاراکتری ۱۶*۲ و چند کلید جهت تنظیمات زمان و نمایش آن استفاده می کنیم. هر یک از پایه های Raspberry Pi GPIO ها توانایی عبور جریان تا ۱۵ میلی آمپر را دارند بنابرین حتما قبلا از اتصال تغذیه به مدار چند بار اتصالات را چک کنید.

 

قطعات مورد نیاز:

  • برد Raspberry Pi همراه سیستم عامل
  •  ماژول DS1307 همراه باتری پشتیبان
  • Power supply
  •  ۶ عدد مقاومت ۱KΩ
  • ۵ عدد کلید
  • ۲ عدد خازن ۱۰۰۰uF
  • ۱۶*۲ LCD
  • ترانزیستور ۲N2222
  • Buzzer

 

قبل از ادامه کار ، باید Raspberry Pi را کانفیگ کرده و فایل کتابخانه  RTC Module را نصب کنیم ، مراحل زیر را دنبال کنید:

 

ابتدا به منوی تنظیمات Raspberry Pi بروید و گزینه I2C را مانند تصویر زیر فعال کنید

یک پوشه جدید در صفحه دسکتاپ Raspberry Pi ایجاد کنید و نام آن را “Alarm Clock” بگذارید سپس فایل Header را برای ماژول RTC از لینک زیر دانلود کنید:
 فایل zip دانلود شده را در پوشه (Alarm Clock) ایجاد شده در DESKTOP از خالت فشرده خارج کنید.
پنجره ترمینال را در Raspberry Pi باز کنید و دستور زیر را وارد کنید ، سپس enter را فشار دهید:
sudo apt-get install i2c-tools
این دستور ابزارهای I2C مورد نیاز برای رابط ماژول RTC را نصب می کند. سپس با صدور دستور ‘sudo reboot’ i برد Raspberry Pi را مجدداً راه اندازی کنید.

بعد از ریستارت Raspberry Pi باید آدرس I2C ماژول RTC را بررسی کنیم. قبل از بررسی آدرس، ابتدا ماژول RTC را همانطور که در شکل مدار زیر نشان داده شده وصل کنید.

سپس در پنجره ترمینال زیر را وارد کنید.

sudo i2cdetect -y 0
OR
sudo i2cdetect -y 1
اگر یکی از دستورات بالا کار کند و ماژول RTC به درستی متصل شده باشد، چیزی شبیه به تصویر زیر را خواهید دید که برای این ماژول آدرس I2C 0x68 را مشاهده خواهید می کنید. تا این مرحله تمام تنظیمات لازم جهت کانفیگ Raspberry Pi انجام شده است.

 

اتصالات قطعات و ماژول به  Raspberry Pi

LCD-connections-for-Raspberry-pi-alarm-clock

برنامه و توضیحات :

اکنون ما یک برنامه پایتون خواهیم نوشت تا زمان دقیق را از RTC Module DS1307 بدست آوریم. این زمان در LCD 16×2 نشان داده می شود. ما ویژگی آلارم یا زنگ دار را در برنامه نوشته ایم. زمان هشدار نیز در خط دوم LCD نمایش داده می شود و به دنبال آن وضعیت ON و OFF وجود دارد.

زمان زنگ هشدار را می توان با ۵ دکمه متصل به Raspberry Pi که در جدول ذکر شده در بالا ذکر شده تنظیم کرد و تنظیم زنگ هشدار بسیار آسان است. ۲ دکمه برای افزایش و کاهش ساعت هشدار ساعت ، ۲ دکمه برای افزایش و کاهش هشدار زمان دقیقه و ۱ دکمه برای روشن و خاموش کردن زنگ وجود دارد.

برنامه پایتون به طور مداوم زمان زنگ هشدار را با زمان RTC مقایسه می کند و هنگامی که زمان هشدار با زمان RTC مطابقت دارد، باعث ایجاد صدای زنگ توسط Buzzer می شود که از طریق ترانزیستور NPN 2N2222 به پایه ۲۲ GPIO Raspberry Pi متصل می شود.

 

Code:
########################################################
import RPi.GPIO as IO  #calling for header file which helps in using GPIO’s of PI
import time            #we are calling for time to provide delays in program
import datetime        #we are calling for DATE
import SDL_DS1307      #calling for special functions which helps us interface RTC module
h=0                    #integers for storing values
m=0
alarm=0
string_of_characters = 0
ds1307 = SDL_DS1307.SDL_DS1307(1, 0x68)  #entering I2c address, which we recorded previously
ds1307.write_now()

IO.setwarnings(False)  #do not show any warnings
IO.setmode (IO.BCM)    #programming the GPIO by BCM pin numbers. (like PIN29 as'GPIO5')

#initialize GPIO17,27,24,23,18,26,5,6,13,19 as an output
IO.setup(17,IO.OUT)
IO.setup(27,IO.OUT)
IO.setup(24,IO.OUT)
IO.setup(23,IO.OUT)
IO.setup(18,IO.OUT)
IO.setup(26,IO.OUT)
IO.setup(5,IO.OUT)
IO.setup(6,IO.OUT)
IO.setup(13,IO.OUT)
IO.setup(19,IO.OUT)

IO.setup(21,IO.IN)  #initialize GPIO21 as an input.
IO.setup(20,IO.IN)  #initialize GPIO20 as an input.
IO.setup(16,IO.IN)
IO.setup(12,IO.IN)
IO.setup(25,IO.IN)

IO.setup(22,IO.OUT) #initialize GPIO22 as an output.

def send_a_command (command):  #steps for sending a command to 16*2LCD
pin=command
PORT(pin);
IO.output(17,0)
IO.output(27,1)
time.sleep(0.001)
IO.output(27,0)
pin=0
PORT(pin);

def send_a_character (character):#steps for sending a character to 16*2 LCD
pin=character
PORT(pin);
IO.output(17,1)
IO.output(27,1)
time.sleep(0.001)
IO.output(27,0)
pin=0
PORT(pin);

def PORT(pin):            #assigning level for PI GPIO for sending data to LCD through D0-D7
if(pin&0x01 == 0x01):
IO.output(24,1)
else:
IO.output(24,0)
if(pin&0x02 == 0x02):
IO.output(23,1)
else:
IO.output(23,0)
if(pin&0x04 == 0x04):
IO.output(18,1)
else:
IO.output(18,0)
if(pin&0x08 == 0x08):
IO.output(26,1)
else:
IO.output(26,0)
if(pin&0x10 == 0x10):
IO.output(5,1)
else:
IO.output(5,0)
if(pin&0x20 == 0x20):
IO.output(6,1)
else:
IO.output(6,0)
if(pin&0x40 == 0x40):
IO.output(13,1)
else:
IO.output(13,0)
if(pin&0x80 == 0x80):
IO.output(19,1)
else:
IO.output(19,0)

def send_a_string(string_of_characters):  #steps for sending string of characters to LCD
string_of_characters = string_of_characters.ljust(16," ")
for i in range(16):
send_a_character(ord(string_of_characters[i]))
#send characters one by one until all the strings characters are sent through data port

while 1:
send_a_command(0x38); #use two lines of LCD
send_a_command(0x0E); #screen and cursor ON
send_a_command(0x01); #clear screen
time.sleep(0.1)       #sleep for 100msec
while 1:
if (IO.input(21) == 0):
if (h<23):    #if button1 is pressed and hour count is less than 23 increment 'h' by one
h=h+1

if (IO.input(20) == 0):
if (h>0):     #if button2 is pressed and hour count is more than 0 decrease 'h' by one
h=h-1

if (IO.input(16) == 0):
if (m<59):    #if button3 is pressed and minute count is less than 59 increment 'm' by one
m=m+1

if (IO.input(12) == 0):
if (m>0):     #if button4is pressed and minute count is more than 0 decrease 'm' by one
m=m-1

if (IO.input(25) == 0):  #if button5 is pressed toggle Alarm ON and OFF
if (alarm==0):
alarm=1
else:
alarm=0
time.sleep(0.1)

if (alarm==1):
send_a_command(0x80 + 0x40 + 12);
send_a_string("ON");  #if alarm is set, then display "ON" at the 12th position of second line of LCD

if ((h==ds1307._read_hours())):
if ((m==ds1307._read_minutes())):
IO.output(22,1)  #if alarm is set, and hour-minute settings match the RTC time, trigger the buzzer

if (alarm==0):
send_a_command(0x80 + 0x40 + 12);
send_a_string("OFF"); #if alarm is OFF, then display "OFF" at the 12th position of second line of LCD
IO.output(22,0)       #turn off the buzzer

send_a_command(0x80 + 0);   #move courser to 0 position
send_a_string ("Time:%s:%s:%s" % (ds1307._read_hours(),ds1307._read_minutes(),ds1307._read_seconds()));
#display RTC hours, minutes, seconds
send_a_command(0x80 + 0x40 + 0);  #move courser to second line
send_a_string ("Alarm:%s:%s" % (h,m));  #show alarm time
time.sleep(0.1)  #wait for 100msec
در پایان امیدواریم که به راحتی این پروژه را راه اندازی نمایید و در صورت داشتن سوال می توانید در بخش نظرات پرسش خود را مطرح کنید.
محمد صداقتی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *