[পরিচয়]
মাইক্রোকন্ট্রোলার প্রযুক্তি হল আধুনিক শিল্প অটোমেশন, ইলেকট্রনিক্স, ইলেকট্রিক্যাল ইঞ্জিনিয়ারিং এবং ইন্টারনেট অফ থিংস (IoT) এর একটি অপরিহার্য মূলধারার প্রযুক্তি। আমাদের জীবন ক্রমশ স্মার্ট হয়ে উঠছে, মাইক্রোকন্ট্রোলার প্রযুক্তি আমাদের দৈনন্দিন জীবনের কার্যত প্রতিটি দিক যেমন স্মার্ট রাইস কুকার, স্মার্ট স্পিকার এবং আরও অনেক কিছুতে প্রবেশ করেছে।
এটি মাথায় রেখে, "৫১টি মাইক্রোকন্ট্রোলার পুনরায় চালু করা" নিবন্ধগুলির লক্ষ্য নতুনদের মাইক্রোকন্ট্রোলার প্রযুক্তির সাথে শুরু করতে সহায়তা করা। আমরা সবচেয়ে সহজ কাজটি দিয়ে শুরু করব-একটি LED চালু করে-এবং ধীরে ধীরে মডিউলগুলি যেমন বোতাম নিয়ন্ত্রণ, LCD1602 ডিসপ্লে, DS18B20 এবং DS1302 তাপমাত্রা সেন্সর, এবং দুটি মাইক্রোকন্ট্রোলারের মধ্যে যোগাযোগ প্রয়োগ করার জন্য অগ্রগতি করব৷ আমরা UART, I²C, এবং SPI এর মত হার্ডওয়্যার কমিউনিকেশন প্রোটোকলও কভার করব। সি প্রোগ্রামিং কৌশলগুলির সাথে এই ধারণাগুলিকে একত্রিত করে, আমরা প্রোগ্রামিং পদ্ধতির চিত্রিত করার জন্য বাস্তব{10}}ওয়ার্ল্ড ইঞ্জিনিয়ারিং প্রকল্পগুলি ব্যবহার করব, আপনাকে মডুলার প্রোগ্রামিং অর্জনের জন্য নমনীয়ভাবে সি পয়েন্টার এবং কাঠামো প্রয়োগ করতে সক্ষম করে৷
এখন, মূল বিষয়ে ফিরে আসা যাক: একটি LED নিয়ন্ত্রণ করতে একটি 51 মাইক্রোকন্ট্রোলার ব্যবহার করে এবং একটি শ্বাস-প্রশ্বাসের আলোর প্রভাব তৈরি করুন।
[কীভাবে শ্বাসপ্রশ্বাসের আলো কাজ করে]
আসুন প্রথমে একটি শ্বাস-প্রশ্বাসের আলোর প্রভাব কীভাবে কাজ করে তা দেখে নেওয়া যাক।
একটি শ্বাস-প্রশ্বাসের আলো ধীরে ধীরে উজ্জ্বল হয় এবং তারপর ধীরে ধীরে ম্লান হয়ে যায়, এই চক্রটি এমনভাবে পুনরাবৃত্তি করে যা শ্বাস-প্রশ্বাসের অনুরূপ। যাইহোক, যেহেতু একটি মাইক্রোকন্ট্রোলারের পিন শুধুমাত্র একটি 1 (চালু) বা 0 (বন্ধ) আউটপুট করতে পারে, তাহলে কিভাবে একটি ধীরে ধীরে পরিবর্তন প্রভাব অর্জন করা যেতে পারে?
এটি আমাদের চোখে দৃষ্টিশক্তির স্থিরতার কারণে। যখন আমরা কিছু দেখি, আমাদের চোখের দ্বারা গঠিত চিত্রটি 0.04 সেকেন্ডের জন্য স্থায়ী হয় (এই চিত্রটি অনলাইনে পাওয়া গেছে)।
যদি আমরা 0.04 সেকেন্ডের উপর ভিত্তি করে গণনা করি, তাহলে সেটি 40 ms হবে। অতএব, যখন LED 20 ms প্রতিটির জন্য চালু এবং বন্ধ থাকে, তখন এটি মানুষের চোখে মনে হয় যেন এটি ক্রমাগত জ্বলছে।

একটি LED ফ্ল্যাশিং 20 ms এর জন্য চালু এবং 20 ms এর জন্য বন্ধ করার প্রভাব কি এটি সব সময় চালু থাকার সমান?
হাহাহা, এটা অবশ্যই আলাদা। আলো যখন প্রতি 20 মিলিসেকেন্ডে অন এবং অফের মধ্যে পর্যায়ক্রমে হয়, তখন আমরা যে প্রভাবটি দেখতে পাই তা ক্রমাগত থাকার চেয়ে ম্লান হয়। যদি আমরা ধরে নিই যে একটানা প্রজ্বলিত আলোর উজ্জ্বলতা 100%, তাহলে প্রতি 20 মিলিসেকেন্ডে অন এবং অফের মধ্যে পর্যায়ক্রমে আলোর উজ্জ্বলতা 50%। এর উপর ভিত্তি করে, আমরা LED এর উজ্জ্বলতা সামঞ্জস্য করতে পারি।

এই মুহুর্তে, আমরা LED এর উজ্জ্বলতা সামঞ্জস্য করতে পারি (40ms চক্রের মধ্যে উচ্চ স্তরের সময়কাল সেট করে)। এটি উজ্জ্বলতা নিয়ন্ত্রণের সুপরিচিত PWM (পালস প্রস্থ মডুলেশন) পদ্ধতির পিছনে নীতি, এবং উচ্চ স্তরের সময়কাল নির্ধারণ করা শুল্ক চক্রকে সামঞ্জস্য করার সমতুল্য (অর্থাৎ, উচ্চ স্তরের সময়কাল মোট চক্র দ্বারা বিভক্ত: 20/40=50%)।
এখানে, সবচেয়ে গুরুত্বপূর্ণ ফ্যাক্টর এই কর্তব্য চক্র. উদাহরণস্বরূপ, যদি সময়কাল 20 ms হয়, LED 10 ms চালু এবং 10 ms বন্ধের মধ্যে পর্যায়ক্রমে, অনুভূত উজ্জ্বলতা এখনও 50% (অর্থাৎ, শুল্ক চক্র 10/20=50%)।
এর পরে, আসুন দেখি কীভাবে এটি প্রোগ্রামে প্রয়োগ করা হয়।
[কর্মসূচী বাস্তবায়ন]
একটি LED চালু করা হচ্ছে
প্রথমে, আসুন একটি LED চালু করে শুরু করি, এবং তারপরে আমরা ধীরে ধীরে একটি শ্বাস-প্রশ্বাসের আলোর প্রভাব প্রয়োগ করব। আমরা যে হার্ডওয়্যারটি ব্যবহার করব তা নিম্নরূপ:
| উন্নয়ন বোর্ড | ZeroOne মাইক্রোকন্ট্রোলার প্রশিক্ষণ উন্নয়ন বোর্ড |
|---|---|
| মাইক্রোকন্ট্রোলার মডেল | STC89C52 |
| LED ইন্টারফেস | P4^4 পিন করুন |

স্কিম্যাটিক থেকে, আমরা দেখতে পাচ্ছি যে LED মাইক্রোকন্ট্রোলারের P4^4 পিনের সাথে সংযুক্ত। যখন মাইক্রোকন্ট্রোলার একটি 1 আউটপুট করে, LED চালু হয়; যখন এটি একটি 0 আউটপুট করে, তখন LED বন্ধ হয়ে যায়। অতএব, একটি LED চালু করার প্রোগ্রামটি বেশ সহজ, যা নীচে দেখানো হয়েছে:

একটি LED চালু করার প্রোগ্রামটি বেশ সহজ; আমি নিশ্চিত সবাই জানে কিভাবে এটা করতে হয়।
LED উজ্জ্বলতা সামঞ্জস্য করা
এর পরে, আমরা একটি ফাংশন বাস্তবায়ন করব যা আমাদের উজ্জ্বলতা সামঞ্জস্য করতে দেয় (অর্থাৎ, ডিউটি চক্র সামঞ্জস্য করতে), নিম্নরূপ:

শুল্ক চক্র সংরক্ষণ করতে একটি স্ট্যাটিক পরিবর্তনশীল `শুল্ক_চক্র` সংজ্ঞায়িত করুন। যখন 'পতাকা' 1 হয়, ডিউটি সাইকেল ধীরে ধীরে 255-এ বাড়ে, তারপর 'পতাকা' 0-এ সেট করুন এবং 'ডিউটি_সাইকেল' ধীরে ধীরে 255 থেকে 0-তে কমে যায়। এই চক্রটি পুনরাবৃত্তি করুন।
হাহা, এই মুহুর্তে, আপনি মনে করতে পারেন যে শ্বাসের আলো ইতিমধ্যে কাজ করছে, কিন্তু তা নয়। আপনি যদি আমাকে বিশ্বাস না করেন তবে উপরের কোডটি চেষ্টা করুন।
তাহলে সমস্যাটা ঠিক কোথায়?
সমস্যাটি উজ্জ্বলতা -সেটিং ফাংশন `set_led_luminance()`-এ আমাদের সরাসরি কলে। এই ফাংশনটি একটি চক্র সম্পূর্ণ করতে 40 ms নেয়, যার অর্থ এই 40 ms এর সময় ডিউটি চক্র পরিবর্তন করা যাবে না; অন্যথায়, উজ্জ্বলতা সমন্বয় কাজ করবে না। আসুন `breath_led` ফাংশন আরেকবার দেখি। ডিউটি সাইকেল সেট করার জন্য `set_led_luminance()`-এ প্রতিটি কল করার পর, এটি 40 ms অপেক্ষা না করে অবিলম্বে `ডিউটি_সাইকেল` মান পরিবর্তন করে।
এই মুহুর্তে, 40 ms অতিবাহিত হওয়ার পরে `শুল্ক_চক্র` মান আপডেট করার জন্য আমাদের একটি সফ্টওয়্যার টাইমার যোগ করতে হবে। সংশোধিত প্রোগ্রামটি নিম্নরূপ:

দ্রষ্টব্য: টাইমারের সময়কাল কেবলমাত্র 40 ms-এর বেশি হওয়া দরকার (অর্থাৎ `s_breathCounter`-এর মান অবশ্যই 255-এর বেশি হতে হবে), তবে এটি চক্রের একাধিকতে সেট করা ভাল। উদাহরণস্বরূপ, যদি আমাদের চক্র 255 হয় (অর্থাৎ, 0 থেকে 255 এর মধ্যে 256 মান), আমরা এটিকে সেই মানের দ্বিগুণে সেট করতে পারি: 256 * 2 - 1=511 (অর্থাৎ, 0 থেকে 511 পর্যন্ত 512 মান)।
এবং আপনার কাছে এটি আছে-আমাদের শ্বাসের আলো সম্পূর্ণ! এটা সহজ না? (* ̄︶ ̄)
পরবর্তীতে আজকের বোনাস বিভাগ।
যদিও আমরা শ্বাস-প্রশ্বাসের আলোক প্রভাব অর্জন করেছি, কোডটি যথেষ্ট সংক্ষিপ্ত বা মার্জিত নয়-এটি if এবং else বিবৃতিগুলির একটি গুচ্ছ ব্যবহার করে৷ দেখা যাক আমরা এটাকে আরও সরলীকরণ করতে পারি কিনা।
প্রথমে, নিচের চিত্রের মতো set_led_luminance() ফাংশনের এই বিভাগটিকে সরল করা যাক।

আমরা এটি সহজ করার আগে, আসুন C সম্পর্কে একটি দ্রুত টিপ কভার করি: বিটওয়াইজ এবং অপারেশন।

এটি থেকে, আমরা জানি যে এটি 1 বা 0 হোক না কেন, বিটওয়াইজ এবং 0 দিয়ে অপারেশন করলে 0 ফলাফল পাওয়া যায়।
এটি 1 বা 0 হোক না কেন, 1 এর সাথে বিটওয়াইজ এবং অপারেশন করলে আসল মান পাওয়া যায়।
সুবিধার জন্য, আমরা হেক্সাডেসিমেল নোটেশন ব্যবহার করি ("0x" এর সাথে উপসর্গযুক্ত); উদাহরণস্বরূপ, 0xff দশমিকে 255 এর সাথে মিলে যায়। অতএব,
যখন 0xff এর থেকে কম বা সমান একটি সংখ্যাকে 0xff দিয়ে AND করা হয়, তখন ফলাফলটি নিজেই সংখ্যাটি হয়, যেমনটি নীচে দেখানো হয়েছে

আপনি যদি 0xff এবং 0xff-এর চেয়ে বড় একটি সংখ্যার মধ্যে একটি বিটওয়াইজ এবং অপারেশন করেন তাহলে কী হবে?

যখন এই সংখ্যাটি (0xff + 1) দ্বারা ভাগ করা হয় তখন ফলাফলটি অবশিষ্ট থাকে (অর্থাৎ, ফলাফলটি এখনও 0 এবং 0xff এর মধ্যে থাকে)।
এই বিটওয়াইজ এবং অপারেশনের মাধ্যমে, উপরের কোডটি সরলীকৃত করা যেতে পারে

এইভাবে, s_Counter-এর মান সর্বদা 0x00 থেকে 0xff এর মধ্যে থাকবে।
একইভাবে, উপরের breath_led ফাংশনে সফ্টওয়্যার টাইমারটিও নিম্নরূপ সরলীকৃত করা যেতে পারে:

3 লাইনে, 0x1ff দশমিকে 511। শর্তটি সত্য যখন s_breathCounter-এর মান (0x1ff+1), বা 512, কারণ 512 & 0x1ff=0. এর আগে বিস্ময়বোধক চিহ্নটি একটি বিটওয়াইজ নয় অপারেশন নির্দেশ করে (সুনির্দিষ্টভাবে বলতে গেলে, শর্তটি পূরণ করা হয় যখন `s_breathCounter`-এর মানটি 51-এর বহুবিধ নিষ্কাশনের প্রয়োজন হয়; `s_breathCounter` আমি আশা করি এই ব্যাখ্যাটি পরিষ্কার{18}এর মাধ্যমে চিন্তা করুন। শর্ত পূরণ হলে, শুল্ক চক্র বাড়তে বা কমতে শুরু করে।
কিন্তু শুল্ক চক্র পরিসীমা 0 থেকে 255 না? লাইন 5 কেন 0x1ff (511) হয়ে যায়? চিন্তা করবেন না-লাইন 8 দেখুন। আমরা আবার 0xff বিয়োগ করি, তাই ডিউটি চক্রের পরিসীমা 0 থেকে 255 পর্যন্ত থাকে।
লাইন 7-10 মানে: যখন `শুল্ক_চক্র > (0xff)`, অর্থাৎ, 256–511, 0xff বিয়োগ করা 1 থেকে 255 পর্যন্ত বৃদ্ধির সমতুল্য, তাই উজ্জ্বলতা ধীরে ধীরে বৃদ্ধি পায়।
যখন ডিউটি_সাইকেল<= 0xff, the duty_cycle increases from 0 to 255, while the set brightness is 255 - duty_cycle. This effectively decreases the brightness from 255 to 0, causing the light to gradually dim. This achieves the breathing light effect.
হাহাহা, আপনি কি ভেবেছিলেন আমাদের সরলীকরণ শেষ হয়ে গেছে?
না, না, না
প্রকৃতপক্ষে, লাইন 7 থেকে 10 আরও সরল করা যেতে পারে। এখানেই পরম মান ফাংশন কাজে আসে।
কি? কেন পরম মান ফাংশন ব্যবহার?
লাইন 10 দেখুন: 0xff - duty_cycle duty_cycle - 0xff এর সমতুল্য এবং তারপর পরম মান নিচ্ছে। ঠিক আছে, এখানে সরলীকৃত কোড:
পরম মান নেওয়ার জন্য ম্যাক্রো ফাংশনটি নিম্নরূপ
অবশেষে, আমি নীচে সম্পূর্ণ সরলীকৃত কোড অন্তর্ভুক্ত করেছি

আপনি কি মনে করেন? এটা সহজ না? (* ̄︶ ̄)




