মাইক্রোকন্ট্রোলার দিয়ে ডিজিটাল ৬ ডিজিট এর 7 segment ঘড়ি **UPDATED**। [DS1307]

আসসালামু আলাইকুম, আমি অন্তর আহমেদ। আপনাদের সবাইকে অনেক অনেক ধন্যবাদ জারা আমার প্রতিটি টিউন পড়েন এবং নতুন টিউন এর জন্য অপেক্ষায় থাকেন। আমি খুবই দুঃখিত যে আমি আপনাদের রেগুলার নতুন নতুন শিখাতে পারি না। কারনটা আপনারা জারা আমার টিউন পড়েন তারা জানেন। জাই হোক, কথা না বাড়িয়ে মূল বিষয়ে আসি। আজ আমি মাইক্রোকন্ট্রোলার দিয়ে ডিজিটাল ৬ ডিজিট এর একটি 7 segment ঘড়ি বানিয়ে দেখাব।

[তবে আগেই বলে রাখা ভাল এইটা শুধুমাত্র শিখার জন্যই। দয়া করে কেউ প্রোফেসনাল কাজে প্রোজেক্টটা ব্যবহার করবেন না।] 

এই প্রোজেক্টটা করতে যা যা জানা থাকতে হবেঃ

১। 7 segment multiplexing বেশিক।

২। C language Functions and header file.

৩। Ds1307 RTC IC সম্পর্কে ধারণা।

৪। I2C protocol সম্পর্কে ধারণা।

তাহলে আসুন শুরু করি,

DS1307 RTC IC

আমি জানি আপনারা কেউই Datasheet পড়েন না। তাই আমি datasheet এর important টপিক গুলো এখানে দেখিয়ে দিচ্ছি।

RTC = Real Time Clock.

এইটা ds1307 এর সাধারন সার্কিট। Rpu এর মান 1K - 4.7K, VCC = 5v, Vbat = 3.7v, crystal = 32KHz.

উপরের অংশ থেকে আমরা বুঝতেই পারছি, ds1307 এর hours register এর ৬নং বিটটি দিয়ে 12-hour/24-hour সিলেক্ট করা হয়। এবং 12-hour সিলেক্ট করলে ৫নং বিটটি AM/PM হিসেবে কাজ করে।

এই table টা অনেক IMPORTANT। টেবিল টা থেকে দেখতে পাচ্ছি কোন address থেকে data নিতে হবে। যেমনঃ আমাদের এখন hour জানতে হবে তাহলে আমাদের অবশ্যই address 0x02 থেকে data নিতে হবে।

এই নিয়মে আমাদের IC থেকে data read করতে হবে। S > 1101000 0 > Address > Sr > 1101000 1 > Read Data > P.

এখানে,

S = Start = soft_I2C_start();

1101000 0 = 0xD0 = Device Address + Write mode

Address = যে address থেকে data নিবো।

Sr = I2C_repeated_start(); [কিন্তু আমরা এখানে soft I2C ব্যবহার করেছি যাতে repeated_start() নামে কোন function নেই। কিন্তু library তে বলা আসে এর বদলে soft_I2C_start(); ব্যবহার করা যাবে।]

1101000 1 = = 0xD1 = Device Address + read mode

<Read Data>

P = Stop = soft_I2C_stop();

এই নিয়মে আমাদের IC তে data write করতে হয়। read করার মতই same বিশ্লেষণ করা যায়। তাই আমি আর করলাম না।

প্রোগ্রাম বিশ্লেষণ

প্রোগ্রামকে short এবং বুঝার সুবিধার্থে আমি header file করে প্রোগ্রামকে part part করে কাজ করেছি। প্রোগ্রামটিকে ৩টি ফাইল এ ভাগ করা হয়েছেঃ

১। simpleRTCclcok.c = মেইন ফাইল/কোড।

২। ds1307.h = এইখানে শুধু ds1307 এর code গুলো আলাদা করে রাখা হয়েছে।

৩। 7segment.h = এইখানে ৭ সেগমেন্ট এর কোড গুলো রাখা হয়েছে।

উপরে আমি ds1307.h ফাইল এর বর্ণনা করেইছি। তাও আবার ক্লিয়ার করে দেইঃ

sbit Soft_I2C_Scl at RA2_bit;
sbit Soft_I2C_Sda at RA3_bit;
sbit Soft_I2C_Scl_Direction at TRISA2_bit;
sbit Soft_I2C_Sda_Direction at TRISA3_bit;

যেহেতু আমরা soft I2C ব্যবহার করেছি তাই I2C পিন গুলো এখানে উল্লেখ করা হয়েছে।

unsigned short read_ds1307(unsigned short address){
return r_data;
}

read_ds1307 একটি function যা unsigned short টাইপ এর ডাটা রিটার্ন করবে।

return r_data; দিয়ে উল্লেখ করে দেওয়া হয়েছে যাতে r_data এর value টাই রিটার্ন।

এই function এ একটি address নামে parameter আছে। যা মুলত আমরা ds1307 IC এর যে address থেকে data নিতে চাই তা নির্দেশ করে।

if(address != 2)r_data = bcd2dec(r_data);

এই লাইনটা দিয়ে বলা হয়েছে, যখন address এর মান 0x02 [hour] না হবে শুধু তখনই r_data BCD থেকে DEC তে কনভার্ট হবে।

[Note: ds1307 মুলত BCD নাম্বার বুঝতে পারে। কিন্তু 12-hour mode এ hour কে BCD তে কনভার্ট করতে হয় না।সরাসরি HEX নাম্বার read/write করতে হয়।]

আমি একটু অলস বলে write_ds1307 আর বিশ্লেষণ করলাম না। 😀

7segment.h:

void show_display(char y, unsigned short x){ // y for digit select, x for data.
unsigned short temp;
if(y == 'H'){
}

.. .. .. .. .. .. ..

}

এই function দিয়ে 7 segment এ ডাটা শো করানো হয়েছে।

show_display('H', value); //'H' for hours, যা শো করবে তা value তে দিতে হবে।

এই ফাইলএ বুঝানোর আর কিছু দেখতেছি না। তাও কোথাও কারো প্রবলেম থাকলে আমি আছি। 🙂

simpleRTCclcok.c:

hh = tmp & 0b00011111;

আগেই বলেছি, hour ই শুধু HEX নাম্বার। তার অপর আমরা 12-hour[৬নং বিট '১'] mode এ আছিঃ

hh = 0x51;

//PM = 0x61 - 0x72 [1 - 12]
//AM = 0x41- 0x52 [1 - 12]

0x61 = 0110 0001 //5bit '1' for PM.

এখন, 0110 0001 & 0001 1111 = 0000 0001 = 0x01 = 1

সুতরাং 0x61 এর জন্য ডিসপ্লেতে '01' hour শো করবে। ক্লিয়ার????

if(hh > 9) hh-=6;

যেহেতু hh এর value HEX, [dec 10 = hex F(dec 16)] তাই hh এর মান ৯ এর বেশি হলে -৬ করা হয়েছে। যেমনঃ hh = 0x0F - 6 = 0x10;

for(delay=0;delay<20;delay++){, ব্যবহার করে ds1307 থেকে data নেওয়ার মাঝে একটু delay করানো হয়েছে। [Important]

tmp = read_ds1307(2); tmp এ value রাখার কারন এই value থেকে পরবর্তীতে am/pm [5bit] নেওয়া হয়েছে।

Time মিলানোঃ

টাইম মিলানোর জন্য ৪টি PUSH বাটন আছে। বাটনের কাজ নিচে দেওয়া হলঃ

1. SETUP: Push once to enter time setup mode.

2. SELECT: Push to next. Hour > Minute > Second > DONE.

3. UP: Push to Increment current selected value.

4. DOWN: Push to Decrement current selected value.

আজকের প্রোজেক্ট ফাইলঃ 6 digit RTC clock [Proteus 8 file]

কারো যদি কোন লাইন বুঝতে প্রবলেম হয় নিচে টিউমেন্ট করুন অথবা আমার সাথে যোগাযোগ করুন।

Antor Ahmed 😎

Level New

আমি আবরার অন্তর। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 10 বছর 6 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 13 টি টিউন ও 26 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 1 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস

কিভাবে MC IC তে Program write করব?

মোট খরচ কত হতে পারে? ১টা বানিয়ে দিতে পারবেন নাকি?

    Level New

    খরচ নির্ভর করে ডিজিটের সাইজ এর উপর। কিন্তু সিস্টেমটা বানাতে ২৫০-৩০০টাকার মত খরচ হতে পারে।

Level New

নতুন digital ঘড়ি পাওয়া যায় ২০০-৩০০ টাকা দিয়া

    Level New

    ১০ টাকা দিয়ে পাওয়া যাক সেটা কথা না, সেই জিনিসটা নিজের হাতে বানানোটাই ইলেকট্রনিক্স হবিস্টদের কাছে বেশি মজার।