সুচিপত্র:
- ধাপ 1: বোর্ড সেটআপ করুন
- ধাপ 2: বোতাম এবং প্রতিরোধক যোগ করুন
- ধাপ 3: বোতাম সংযোগ
- ধাপ 4: কোড…
- ধাপ 5: একটি সামান্য debounce
- ধাপ 6: একটি মেনু তৈরি করা
- ধাপ 7: কোড ব্রেকডাউন - গ্লোবাল
- ধাপ 8: কোড ব্রেকডাউন - সেটআপ এবং কাস্টম ফাংশন
- ধাপ 9: লুপ …
- ধাপ 10: চূড়ান্ত কোড ব্লক
ভিডিও: আরডুইনোতে একটি মেনু এবং কীভাবে বোতাম ব্যবহার করবেন: 10 টি ধাপ (ছবি সহ)
2024 লেখক: John Day | [email protected]. সর্বশেষ পরিবর্তিত: 2024-01-30 08:01
আমার Arduino 101 টিউটোরিয়ালে, আপনাকে টিঙ্কারকাডে আপনার পরিবেশ কিভাবে সেটআপ করতে হবে তা শেখানো হবে। আমি টিঙ্কারক্যাড ব্যবহার করি কারণ এটি একটি বেশ শক্তিশালী অনলাইন প্ল্যাটফর্ম যা আমাকে সার্কিট তৈরির জন্য শিক্ষার্থীদের বিভিন্ন ধরণের দক্ষতা প্রদর্শন করতে দেয়। Arduino IDE এবং একটি বাস্তব Arduino ব্যবহার করে আমার সমস্ত টিউটোরিয়াল নির্দ্বিধায় তৈরি করুন!
এই টিউটোরিয়ালে, আমরা বোতাম সম্পর্কে জানতে যাচ্ছি! আমাদের জানা দরকার:
- কিভাবে তাদের ওয়্যার আপ
- তাদের মান পড়া
- ডিবাউন্স, এবং কেন এটি গুরুত্বপূর্ণ
- একটি ব্যবহারিক অ্যাপ্লিকেশন (একটি মেনু তৈরি করা)
বেশিরভাগ মানুষ মনে করেন একটি বোতাম দিয়ে সবচেয়ে বেশি ব্যবহারিক কাজ হল একটি আলো জ্বালানো এবং বন্ধ করা। আমরা, এখানে না! আমরা একটি মেনু তৈরি করতে এবং আরডুইনোতে কিছু বিকল্প সেট করতে আমাদের ব্যবহার করতে যাচ্ছি।
প্রস্তুত? চল শুরু করি!
ধাপ 1: বোর্ড সেটআপ করুন
প্রথম ধাপ হল প্রোটোটাইপিং এলাকায় একটি Arduino এবং Breadboard Small রাখা। পাওয়ার রেলগুলি কীভাবে তারে লাগানো যায় তা দেখতে উপরের চিত্রগুলি দেখুন।
একটি ব্রেডবোর্ড মিনিতে উপরে এবং নীচে দুটি পাওয়ার রেল রয়েছে। আমরা এইগুলিকে আরডুইনো পর্যন্ত সংযুক্ত করি যাতে আমরা আরও উপাদানগুলিকে শক্তি সরবরাহ করতে পারি। পরবর্তীতে এই টিউটোরিয়ালে আমরা butt টি বোতাম ব্যবহার করবো যাতে আমাদের আরো বেশি পাওয়ার প্রয়োজন হবে। লক্ষ্য করার বিষয় হল যে একটি রুটিবোর্ডে ছোট, পাওয়ার রেলগুলি বোর্ড জুড়ে, অনুভূমিকভাবে চলে। এটি মাঝখানে প্রধান প্রোটোটাইপিং এলাকার কলামের থেকে আলাদা; এগুলি উল্লম্বভাবে চলে। আপনি মাঝখানে মূল এলাকার যেকোনো কলামে বিদ্যুৎ সরবরাহ করতে যেকোনো পাওয়ার পিন ব্যবহার করতে পারেন।
যখন আপনি শক্তি যোগ করেন, যথাক্রমে নেতিবাচক এবং ইতিবাচক কালো এবং লাল তার ব্যবহার করুন। শেষে তারের যোগ করুন যা বোর্ডের অন্য দিকে বিদ্যুৎ চালায়। আমরা সেই দিকটি ব্যবহার করব না, তবে এটি ভাল অনুশীলন।
ধাপ 2: বোতাম এবং প্রতিরোধক যোগ করুন
উপাদান ট্রে থেকে একটি ছোট pushbutton যোগ করুন। এটি চিত্রের মতো হওয়া উচিত। নিশ্চিত করুন যে এটি একটি সুইচ নয়! একটি প্রতিরোধকও যোগ করুন। এটিতে ক্লিক করুন, এবং এর মান 10kΩ এ সেট করুন। যখন এটি সংযুক্ত না থাকে তখন পিনটি কম টানতে যথেষ্ট, যা পরে কোডে খুবই গুরুত্বপূর্ণ।
রুটিবোর্ডের মাঝখানে উপাদানটি রাখুন। একটি বোতাম যেভাবে কাজ করে তা হল:
- কোণায় কোণে, বোতাম সংযুক্ত নয়। বোতামটি চাপলে পরিচিতিগুলি বন্ধ হয়ে যায় এবং কোণগুলি সংযুক্ত হয়।
- বোতামের দিকগুলি সংযুক্ত। যদি আপনি উপরের বাম এবং নীচের বামে একটি তারের সংযুক্ত করেন, সার্কিটটি বন্ধ হয়ে যাবে।
এই কারণে আমরা মাঝখানে স্থান জুড়ে উপাদানটি রাখি। এটি নিশ্চিত করে যে বোর্ডের পিনের নীচে কোণগুলি সংযুক্ত নয়।
পরবর্তী ধাপে কয়েকটি ইমেজ প্রদান করা হয়েছে যা এই পয়েন্টগুলিকে ব্যাখ্যা করে।
কলাম জুড়ে নীচের ডান পিন থেকে প্রতিরোধক রাখুন, যাতে এটি অনুভূমিকভাবে বসে।
ধাপ 3: বোতাম সংযোগ
উপরের চিত্রগুলি বোতামগুলি কীভাবে সংযুক্ত হয় তা মোটামুটি স্পষ্ট করে তোলে। এটি সর্বদা বিভ্রান্তির বিষয় ছিল যখন আপনি মনে করেন যে কিছু ভাল এবং এটি কাজ করে না!
এখন, তারের যোগ করা যাক।
- একটি ধনাত্মক পাওয়ার পিন থেকে একটি লাল সীসা বোতামটির নীচের ডান পিনের মতো একই কলামে রাখুন
- একটি নেতিবাচক শক্তি পিন থেকে একটি কালো সীসা প্রতিরোধক হিসাবে একই কলামে রাখুন।
- আরডুইনোতে উপরের বাম পিন থেকে ডিজিটাল পিন 2 এ একটি রঙিন তার (লাল/কালো নয়) রাখুন
আপনার ওয়্যারিং সঠিক কিনা তা নিশ্চিত করতে উপরের ছবিগুলি পরীক্ষা করুন।
ধাপ 4: কোড…
আসুন একটি মৌলিক বোতামের কোডটি দেখি।
কোড এডিটর খুলুন এবং ব্লক থেকে টেক্সটে পরিবর্তন করুন। যে সতর্কবাণীটি আসে তা সাফ করুন। আমরা পাঠ্য নিয়ে খুশি!
আপনি মৌলিক সেটআপ জানেন, তাই আসুন বোতামটি সংজ্ঞায়িত করি এবং একটি মৌলিক পড়া করি। আমরা সিরিয়াল থেকে আউটপুট প্রিন্ট করব।
আমি নীচের কোডটিতে কয়েকটি অতিরিক্ত মন্তব্য রেখেছি যাতে ছবির চেয়ে এটি পড়া সহজ হয়।
// ধ্রুবক সংজ্ঞায়িত করুন
#সংজ্ঞায়িত করুন বোতাম 2 অকার্যকর সেটআপ () {পিনমোড (বোতাম, ইনপুট); Serial.begin (9600); } অকার্যকর লুপ () {// ডিজিটাল পিন পড়ুন বাটনের অবস্থা পরীক্ষা করার জন্য // বোতাম টিপলে উচ্চ ফেরত দেয়, যদি না হয় তাহলে নিম্ন (যদি চাপা == উচ্চ) {সিরিয়াল }}
ঠিক আছে, এটা কাজ করে!
মূলত, আমরা যা করছি তা হল প্রতিটি সময় কোড লুপ হওয়ার সময় ডিজিটাল পিনের অবস্থা পরীক্ষা করা। যদি আপনি স্টার্ট সিমুলেশন ক্লিক করেন এবং বোতাম টিপুন, আপনি সিরিয়াল মনিটর দেখতে পাবেন (কোডের নীচের বোতামটি ক্লিক করুন) প্রদর্শন "চাপানো!" বারংবার.
উপরের কোডে আপনি দেখতে পাবেন এমন একটি বৈশিষ্ট্য হল if () কন্ডিশন মূল্যায়ন হচ্ছে। এই কোডটি যা করছে তা হল একটি প্রশ্ন জিজ্ঞাসা করা এবং এটি সত্য কিনা তা মূল্যায়ন করা, এই ক্ষেত্রে। ভেরিয়েবলের মান একটি নির্দিষ্ট মানের সমান কিনা তা যাচাই করার জন্য আমরা সমান (ডবল সমান চিহ্ন, যেমন: ==) ব্যবহার করি। একটি ডিজিটাল রিড () উচ্চ বা নিম্ন ফেরত দেয়।
If () else if / else ব্যবহার করে আমরা অনেক শর্ত বা সমস্ত শর্ত পরীক্ষা করতে পারি এবং যদি আপনি Arduino Basics- এ ফিরে যান, আপনি যে তুলনাগুলি করতে পারেন তার কিছু দেখতে পাবেন।
এখন… আমাদের কোড সম্পূর্ণ মনে হতে পারে… কিন্তু আমাদের একটি সমস্যা আছে।
দেখুন, সিমুলেটরে থাকলে এটি সত্যিই ভাল কাজ করে। কিন্তু বাস্তব বিদ্যুতের গোলমাল আছে, বিশেষ করে ডিসি ইলেকট্রনিক্স। তাই আমাদের বোতাম কখনও কখনও একটি মিথ্যা পড়া ফিরে আসতে পারে। এবং এটি একটি সমস্যা, কারণ আপনার প্রকল্প ব্যবহারকারীর জন্য সঠিক ভাবে সাড়া নাও দিতে পারে।
এটা ঠিক করা যাক!
ধাপ 5: একটি সামান্য debounce
আমরা আমাদের বোতামের সমস্যা কাটিয়ে উঠতে ডিবাউন্স নামক একটি পদ্ধতি ব্যবহার করি। এটি মূলত একটি নির্দিষ্ট সময়ের জন্য অপেক্ষা করে যখন বোতামটি ধাক্কা দেওয়া হয় এবং আসলে ধাক্কায় সাড়া দেয়। এটি এখনও ব্যবহারকারীর কাছে স্বাভাবিক মনে হয় (যদি না আপনি সময়টাকে খুব দীর্ঘ করে দেন)। আপনি প্রেসের দৈর্ঘ্য পরীক্ষা করার জন্য এটি ব্যবহার করতে পারেন, যাতে আপনি প্রতিবার ভিন্নভাবে সাড়া দিতে পারেন। আপনার কোন তারের পরিবর্তন করার দরকার নেই!
আসুন কোডটি দেখি:
#ডিফাইন বাটন 2#ডিবাউন্স টাইমআউট 100 নির্ধারণ করুন
প্রথম পরিবর্তনটি বৈশ্বিক পরিসরে। আপনি মনে রাখবেন যে যেখানে আমরা ভেরিয়েবলগুলি সংজ্ঞায়িত করি আমাদের অনেকগুলি ফাংশন ব্যবহার করতে পারে বা যেগুলি প্রতিবার লুপ ফায়ার করার সময় পুনরায় সেট করা যায় না। সুতরাং, আমরা সংজ্ঞায়িত ধ্রুবকগুলিতে debounceTimeout যোগ করেছি। আমরা এই 100 টি তৈরি করেছি (যা পরে 100ms এ অনুবাদ করবে), কিন্তু এটি ছোট হতে পারে। আর কোন দিন এবং এটি অস্বাভাবিক মনে হবে।
long int lastDebounceTime;
এই পরিবর্তনশীল ধ্রুবক নীচে ঘোষণা করা হয়। এটি একটি দীর্ঘ int টাইপ, যা মূলত আমাদের স্মৃতিতে দীর্ঘ সংখ্যা সংরক্ষণ করতে দেয়। আমরা এটাকে LastDebounceTime বলেছিলাম।
অকার্যকর সেটআপ () ফাংশনে আমাদের কিছু পরিবর্তন করার দরকার নেই। আসুন সেটিকে ছেড়ে দেই।
অকার্যকর লুপ () {// ডিজিটাল পিন পড়ুন বাটনের অবস্থা পরীক্ষা করার জন্য int pressed = digitalRead (button); দীর্ঘ int currentTime = মিলিস (); // বোতাম কোড}
লুপ () ফাংশনে আমরা প্রথম যে পরিবর্তনটি করি তা হল বোতামটি পড়ার জন্য কলের অধীনে। আমাদের বর্তমান সময়ের হিসাব রাখতে হবে। আরডুইনো মিলিসেকেন্ডে বুট হওয়ার পর থেকে মিলিস () ফাংশন ঘড়ির বর্তমান সময় ফিরিয়ে দেয়। আমাদের এটি একটি দীর্ঘ int টাইপ ভেরিয়েবলে সংরক্ষণ করতে হবে।
এখন, আমাদের নিশ্চিত করতে হবে যে আমরা বোতামটি চাপার সময় থেকে সচেতন, তাই আমরা যখন টাইমারটি চাপানো হয় না তখন পুনরায় সেট করি। দেখা যাক:
অকার্যকর লুপ () {// ডিজিটাল পিন পড়ুন বাটনের অবস্থা পরীক্ষা করার জন্য int pressed = digitalRead (button); দীর্ঘ int currentTime = মিলিস (); যদি (চাপানো == নিম্ন) {// গণনা সময় পুনরায় সেট করুন যখন বোতাম টিপানো হয় না LastDebounceTime = currentTime; } // বোতাম কোড}
যদি (চাপানো == নিম্ন) অ্যালগরিদম চেক করে যে বোতামটি টিপে নেই। যদি এটি না হয়, তাহলে কোডটি সর্বশেষ ডিবাউন্স থেকে বর্তমান সময় সংরক্ষণ করে। এইভাবে, প্রতিবার বোতাম টিপলে, আমাদের সময় একটি বিন্দু থাকে যা থেকে আমরা পরীক্ষা করতে পারি কখন বোতামটি চাপানো হয়েছিল। আমরা তারপর একটি দ্রুত গাণিতিক গণনা করতে পারি কতক্ষণ ধরে বোতাম টিপে ছিল তা দেখতে এবং সঠিকভাবে সাড়া দিতে। আসুন বাকি কোডটি দেখি:
অকার্যকর লুপ () {// ডিজিটাল পিন পড়ুন বাটনের অবস্থা পরীক্ষা করার জন্য int pressed = digitalRead (button); দীর্ঘ int currentTime = মিলিস (); যদি (চাপানো == নিম্ন) {// গণনা সময় পুনরায় সেট করুন যখন বোতাম টিপানো হয় না LastDebounceTime = currentTime; } // একটি নির্দিষ্ট সময়ের জন্য বোতাম টিপানো হয়েছে যদি (((currentTime - lastDebounceTime)> debounceTimeout)) {// যদি টাইমআউট হয়ে যায়, বোতাম টিপুন! Serial.println ("চাপা!"); }}
কোডের শেষ ব্লকটি বর্তমান সময় নেয়, শেষ ডিবাউন্স সময়টি বিয়োগ করে এবং এটি আমাদের নির্ধারিত সময়সীমার সাথে তুলনা করে। যদি এটি বেশি হয়, কোডটি ধরে নেয় যে বোতামটি সেই সময়ের জন্য চাপানো হয়েছে এবং সাড়া দেয়। ঝরঝরে!
আপনার কোড চালান এবং এটি কাজ করে তা পরীক্ষা করুন। যদি আপনার ত্রুটি থাকে, আপনার কোড পরীক্ষা করুন!
এখন, একটি বাস্তব উদাহরণ তাকান।
ধাপ 6: একটি মেনু তৈরি করা
বোতামগুলি আকর্ষণীয়, কারণ তাদের সাথে অনেক সম্ভাবনা রয়েছে! এই উদাহরণে, আমরা একটি মেনু করতে যাচ্ছি। ধরা যাক আপনি এই সত্যিই দুর্দান্ত ডিভাইসটি তৈরি করেছেন, এবং ব্যবহারকারীদের কিছু জিনিস চালু বা বন্ধ করার জন্য বিকল্পগুলি পরিবর্তন করতে সক্ষম হতে হবে, অথবা একটি সেটিংয়ের জন্য একটি নির্দিষ্ট মান নির্ধারণ করতে হবে। এই তিনটি বোতামের নকশা এটি করতে পারে!
সুতরাং, এই প্রকল্পের জন্য আমাদের প্রয়োজন:
- তিনটি বোতাম
- তিনটি প্রতিরোধক 10kΩ সেট
আমাদের ইতিমধ্যে এর মধ্যে একটি আছে, আমাদের কেবল অন্য দুটি দরকার। তাই এগুলিকে বোর্ডে যুক্ত করুন। ওয়্যারিং আপ একটু বেশি জটিল, কিন্তু শুধুমাত্র কারণ আমি এটি সত্যিই কম্প্যাক্ট রাখতে চেয়েছিলাম। আপনি প্রথম বোতামের জন্য একই প্যাটার্ন অনুসরণ করতে পারেন, অথবা উপরের ছবিটি অনুসরণ করতে পারেন।
তিনটি বোতাম হল একটি মেনু খোলা/পরবর্তী বিকল্প, একটি পরিবর্তন বিকল্প (যেমন, সেটিংস পরিবর্তন), এবং একটি সংরক্ষণ/বন্ধ মেনু বোতাম।
এটা তারে, কোড দেখা যাক!
ধাপ 7: কোড ব্রেকডাউন - গ্লোবাল
ঠিক আছে, এটি একটি দীর্ঘ ধাপ হতে যাচ্ছে, কিন্তু আমি কোডের প্রতিটি বিভাগ দিয়ে যাচ্ছি।
প্রথমে, বিশ্বব্যাপী প্রয়োজনীয় ভেরিয়েবলগুলি দেখি।
// ধ্রুবক সংজ্ঞায়িত করুন #মেনু নির্ধারণ করুন বাটন 2 #মেনু নির্ধারণ করুন 3 নির্বাচন করুন #মেনু নির্ধারণ করুন 4 সংরক্ষণ করুন #ডিবাউন্স টাইমআউট 50 নির্ধারণ করুন // ভেরিয়েবলগুলি সংজ্ঞায়িত করুন int menuButtonPreviousState = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; long int lastDebounceTime; // Menu options char * menuOptions = {"Temp Check", "Check Light"}; bool featureSetting = {মিথ্যা, মিথ্যা}; বুল মেনু মোড = মিথ্যা; bool menuNeedsPrint = মিথ্যা; int optionSelected = 0;
এই তিনটি ব্লক মোটামুটি একই রকম যা আমরা আগে দেখেছি। প্রথমটিতে, আমি তিনটি বোতাম এবং সময়সীমা নির্ধারণ করেছি। প্রকল্পের এই অংশের জন্য, আমি এটি 50ms এ সেট করেছি তাই এটি কাজ করতে একটি ইচ্ছাকৃত প্রেস লাগে।
দ্বিতীয় ব্লক হল সব ভেরিয়েবল। আমাদের বাটনপ্রেসিভ স্টেট -এর ট্র্যাক রাখতে হবে এবং আমাদেরকে লাস্টডিবাউন্সটাইমের ট্র্যাক রাখতে হবে। এই সব int টাইপ ভেরিয়েবল, কিন্তু শেষ একটি দীর্ঘ টাইপ কারণ আমি ধরে নিচ্ছি আমাদের মেমরিতে স্পেস দরকার।
মেনু অপশন ব্লকে কয়েকটি নতুন বৈশিষ্ট্য রয়েছে। প্রথমত, গৃহস্থালি * (হ্যাঁ, এটি একটি ইচ্ছাকৃত তারকা চিহ্ন), যা একটি অক্ষর/স্ট্রিং আক্ষরিক পরিবর্তনশীল। এটি মেমরির একটি স্ট্যাটিক স্টোরেজের পয়েন্টার। আপনি এটি পরিবর্তন করতে পারবেন না (যেমন আপনি পাইথনে করতে পারেন, উদাহরণস্বরূপ)। এই অক্ষর *menuOptions লাইনটি স্ট্রিং লিটারেলের একটি অ্যারে তৈরি করে। আপনি যত মেনু আইটেম যোগ করতে পারেন।
বুল ফিচার সেট করা ভেরিয়েবল হল মানগুলির অ্যারে যা প্রতিটি মেনু আইটেমকে প্রতিনিধিত্ব করে। হ্যাঁ, আপনি আপনার পছন্দ মতো কিছু সঞ্চয় করতে পারেন, কেবল পরিবর্তনশীল প্রকার পরিবর্তন করুন (সেগুলি একই ধরণের হতে হবে)। এখন, এটি পরিচালনা করার আরও ভাল উপায় হতে পারে, যেমন অভিধান বা টুপল, কিন্তু এই অ্যাপ্লিকেশনের জন্য এটি সহজ। আমি সম্ভবত একটি নিযুক্ত অ্যাপ্লিকেশনে পরবর্তীগুলির মধ্যে একটি তৈরি করব।
আমি মেনু মোডের ট্র্যাক রেখেছি, তাই যদি আমি আমার ডিসপ্লেতে অন্যান্য জিনিস চাইতাম তবে আমি তা করতে পারতাম। এছাড়াও, যদি আমার সেন্সর যুক্তি থাকে তবে আমি মেনু অপারেশনের সময় বিরতি দিতে পারি, যদি কিছু সংঘাত হয়। আমার একটি মেনুনিডসপ্রিন্ট ভেরিয়েবল আছে কারণ আমি নির্দিষ্ট সময়ে মেনু মুদ্রণ করতে চাই, শুধু সব সময় নয়। অবশেষে, আমার কাছে একটি অপশন সিলেক্টেড ভেরিয়েবল আছে, তাই আমি নির্বাচিত বিকল্পটির ট্র্যাক রাখতে পারি কারণ আমি এটি অনেক জায়গায় অ্যাক্সেস করি।
আসুন ফাংশনের পরবর্তী সেটটি দেখি।
ধাপ 8: কোড ব্রেকডাউন - সেটআপ এবং কাস্টম ফাংশন
সেটআপ () ফাংশন যথেষ্ট সহজ, মাত্র তিনটি ইনপুট ঘোষণা:
অকার্যকর সেটআপ () {পিনমোড (মেনু সিলেক্ট, ইনপুট); পিনমোড (মেনু সেভ, ইনপুট); পিনমোড (মেনু সিলেক্ট, ইনপুট); Serial.begin (9600); }
পরবর্তী তিনটি কাস্টম ফাংশন। আসুন প্রথম দুটি, তারপর শেষটি আলাদাভাবে দেখি।
আমাদের দুটি ফাংশন দরকার যা কিছু তথ্য ফেরত দেয়। কারণ হল, আমরা নিশ্চিত করতে চাই যে এটি মানুষের পাঠযোগ্য। যদি আমাদের কোন সমস্যা হয় তবে এটি কোড ডিবাগ করার ক্ষেত্রেও সাহায্য করবে। কোড:
// বর্তমান নির্বাচিত অপশন ফেরত ফাংশন চার *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // রিটার্ন অপশন নির্বাচিত রিটার্ন মেনু অপশন; } // বর্তমান নির্বাচিত বিকল্প গৃহস্থালীর অবস্থা ফিরিয়ে আনার ফাংশন *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; যদি (optionSetting == false) {optionSettingVal = "মিথ্যা"; } অন্যথায় {optionSettingVal = "True"; } // রিটার্ন optionSetting return optionSettingVal; }
গৃহস্থালি *ReturnOptionSelected () ফাংশন নির্বাচিত বিকল্পটি পরীক্ষা করে (যদি আপনি উপরে দেখেন, আমরা সেটার ট্র্যাক রাখার জন্য একটি ভেরিয়েবল সেট করি), এবং আমরা আগে তৈরি করা অ্যারে থেকে স্ট্রিংটি আক্ষরিক টানছি। এটি তারপর এটি একটি চর টাইপ হিসাবে ফেরত দেয়। আমরা এটা জানি কারণ ফাংশন রিটার্ন টাইপ নির্দেশ করে।
দ্বিতীয় ফাংশন, char *ReturnOptionStatus () অ্যারেতে সংরক্ষিত বিকল্পের স্ট্যাটাস পড়ে এবং একটি স্ট্রিং আক্ষরিক প্রদান করে যা মানকে উপস্থাপন করে। উদাহরণস্বরূপ, যদি আমরা যে সেটিংটি সংরক্ষণ করি তা মিথ্যা হয়, আমি "মিথ্যা" ফিরিয়ে দেব। এর কারণ হল আমরা ব্যবহারকারীকে এই পরিবর্তনশীলটি দেখাই এবং এই সব যুক্তি একসাথে রাখা ভাল। আমি এটি পরে করতে পারতাম, কিন্তু এখানে এটি করা আরও বোধগম্য।
// বর্তমান অপশনবুল টগল করার ফাংশন ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; সত্য ফিরে; }
ফাংশন বুল ToggleOptionSelected () মেনুতে আমরা যে সেটিংটি নির্বাচন করেছি তার মান পরিবর্তন করার জন্য একটি সুবিধাজনক ফাংশন। এটা শুধু মান flips। আপনার যদি বিকল্পগুলির আরও জটিল সেট থাকে তবে এটি বেশ ভিন্ন হতে পারে। আমি এই ফাংশনে সত্য ফিরে আসি, কারণ আমার কলব্যাক (পরে কোডে এই ফাংশনটি চালু করে) একটি সত্য/মিথ্যা উত্তর আশা করে। আমি 100% নিশ্চিত যে এটি কাজ করবে, তাই আমি এটি কাজ না করার জন্য হিসাব করিনি, কিন্তু আমি একটি নিযুক্ত অ্যাপ্লিকেশন (শুধু ক্ষেত্রে) করব।
ধাপ 9: লুপ …
লুপ () ফাংশন মোটামুটি দীর্ঘ, তাই আমরা এটি অংশে করব। আপনি এই ফাংশনের মধ্যে নীড় নীচের সবকিছু অনুমান করতে পারেন:
অকার্যকর লুপ () {
// এখানে কাজ করুন <-----}
ঠিক আছে, আমরা আগে এই জিনিস দেখেছি:
// বোতামগুলি পড়ুন int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // বর্তমান সময় দীর্ঘ int currentTime = মিলিস () পান; যদি (menuButtonPressed == LOW এবং menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; }
আমাকে এখানে যা করতে হয়েছিল তা হল তিনটি ডিজিটাল রিড () কল যোগ করা, এবং নিশ্চিত করুন যে আমি এই সত্যের জন্য হিসাব করেছিলাম যে যদি সমস্ত বোতাম কম থাকে তবে আমাদের টাইমার (lastDebounceTime = currentTime) পুনরায় সেট করা উচিত এবং পূর্ববর্তী সমস্ত রাজ্যগুলিকে কম সেট করা উচিত। আমি কারেন্টটাইমে মিলিস () সংরক্ষণ করি।
পরের অংশটি লাইনের ভিতরে বাসা বাঁধে
যদি (((currentTime - lastDebounceTime)> debounceTimeout)) {
// এখানে কাজ করুন <----}
তিনটি বিভাগ আছে। হ্যাঁ, আমি তাদের তাদের নিজস্ব ফাংশনে স্থানান্তর করতে পারতাম, কিন্তু সরলতার জন্য আমি এখানে তিনটি প্রধান বোতাম অ্যালগরিদম রেখেছিলাম।
if ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // ব্যবহারকারীকে জানতে দিন Serial.println ("মেনু সক্রিয়"); } অন্যথায় যদি (menuMode == true && optionSelected = 1) {// Reset option optionSelected = 0; } // মেনু মেনু প্রিন্ট করুন প্রিন্ট = সত্য; // বোতামটি পূর্বে টগল করুন। শুধুমাত্র মেনু প্রদর্শন করার জন্য রাষ্ট্র // যদি বোতামটি রিলিজ করা হয় এবং আবার চাপলে menuButtonPreviousState = menuButtonPressed; // উচ্চ হবে
এই প্রথমটি যখন মেনু বাটনপ্রেসড উচ্চ হয়, অথবা যখন মেনু বোতামটি চাপানো হয় তখন এটি পরিচালনা করে। এটি পূর্ববর্তী অবস্থাটি কম ছিল কিনা তা যাচাই করে, যাতে বোতামটি আবার চাপার আগে ছেড়ে দিতে হয়, যা প্রোগ্রামটিকে বারবার একই ঘটনাকে বারবার গুলি করা থেকে বিরত রাখে।
এটি তখন চেক করে যে মেনু সক্রিয় না থাকলে, এটি এটি সক্রিয় করে। এটি নির্বাচিত প্রথম বিকল্পটি মুদ্রণ করবে (যা মেনু বিকল্পের অ্যারের মধ্যে প্রথম আইটেম ডিফল্টভাবে। যদি আপনি দ্বিতীয় বা তৃতীয় (ইত্যাদি) সময় বোতাম টিপেন, তাহলে আপনি তালিকায় পরবর্তী বিকল্পটি পাবেন। আমি ঠিক করতে পারি এমন কিছু যে যখন এটি শেষ হয়, এটি শুরুতে ফিরে আসে।
শেষের ছোট অংশটি (// মেনু প্রিন্ট করে) স্পষ্টতই মেনু প্রিন্ট করে, কিন্তু এটি পূর্ববর্তী অবস্থাকেও হাইতে সেট করে তাই একই ফাংশন লুপ করবে না (বাটনটি আগে লো ছিল কিনা তা পরীক্ষা করার জন্য উপরে আমার নোটটি দেখুন)।
// menuSelect চাপানো হয়, logicif প্রদান করুন কিছু হতে পারে bool toggle = ToggleOptionSelected (); যদি (টগল) {menuNeedsPrint = true; } অন্য {Serial.println ("কিছু ভুল হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন"); }} // টগল অবস্থা শুধুমাত্র টগল হলে মুক্তি পায় এবং আবার চাপলে menuSelectPreviousState = menuSelectPressed; }
এই বিট কোডটি একইভাবে মেনু সিলেক্টপ্রেসড বোতামটি পরিচালনা করে, এই সময়টি বাদ দিয়ে আমরা কেবল টগল অপশন সিলেক্টেড () ফাংশনটি চালু করি। যেমনটি আমি আগেই বলেছি, আপনি এই ফাংশনটি পরিবর্তন করতে পারেন তাই এটি আরও বেশি করে, তবে আমার এটি করার জন্য এটিই দরকার।
লক্ষ্য করার প্রধান বিষয় হল টগল ভেরিয়েবল, যা কলব্যাকের সাফল্য ট্র্যাক করে এবং সত্য হলে মেনু প্রিন্ট করে। যদি এটি কিছু না বা মিথ্যা প্রদান করে, এটি ত্রুটি বার্তাটি মুদ্রণ করবে। এখানেই আপনি আপনার কলব্যাক ব্যবহার করে অন্যান্য কাজ করতে পারেন।
যদি ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// মেনু থেকে বেরিয়ে যান // এখানে আপনি যে কোন পরিপাটি করতে পারেন // অথবা EEPROM menuMode = false; Serial.println ("মেনু থেকে বেরিয়ে এসেছে"); // টগল অবস্থা তাই মেনু শুধুমাত্র একবার প্রস্থান করে menuSavePreviousState = menuSavePressed; }}
এই ফাংশনটি মেনু সংরক্ষণ বোতামটি পরিচালনা করে, যা কেবল মেনু থেকে প্রস্থান করে। এখানে আপনি বাতিল বা সংরক্ষণের বিকল্প পেতে পারেন, হয়তো কিছু পরিষ্কার করুন বা EEPROM এ সংরক্ষণ করুন। আমি শুধু "মেনু থেকে বেরিয়ে এসেছি" মুদ্রণ করেছি এবং বোতামের অবস্থাটি হাইতে সেট করেছি যাতে এটি লুপ না হয়।
যদি (menuMode && menuNeedsPrint) {// আমরা মেনু প্রিন্ট করেছি, তাই যদি কিছু // না ঘটে, তাহলে আবার মেনু প্রিন্ট করার দরকার নেই char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); সিরিয়াল.প্রিন্ট ("নির্বাচিত:"); Serial.print (optionActive); সিরিয়াল.প্রিন্ট (":"); Serial.print (optionStatus); Serial.println (); }
এটি মেনুপ্রিন্ট অ্যালগরিদম, যা শুধুমাত্র যখন মেনু সক্রিয় থাকে এবং যখন মেনুনিডপ্রিন্ট ভেরিয়েবলটি সত্যে সেট করা হয়
এটি অবশ্যই তার নিজস্ব কার্যক্রমে স্থানান্তরিত হতে পারে, তবে সরলতার জন্য..!
আচ্ছা, এটাই! পুরো কোড ব্লকের জন্য পরবর্তী ধাপ দেখুন।
ধাপ 10: চূড়ান্ত কোড ব্লক
// ধ্রুবক সংজ্ঞায়িত করুন
#ডিফাইন মেনু বাটন 2 #ডিফাইন মেনু সিলেক্ট 3 #ডিফাইন মেনু সেভ 4 #ডিবাউন্স ডিফাইন টাইমআউট 50 ইন্ট মেনু বাটনপ্রেভিসেট স্টেট = LOW; int menuSelectPreviousState = LOW; int menuSavePreviousState = LOW; // ভেরিয়েবল সংজ্ঞায়িত করুন দীর্ঘ int lastDebounceTime; বুল লাইটসেন্সর = সত্য; বুল tempSensor = সত্য; // Menu options char * menuOptions = {"Temp Check", "Check Light"}; bool featureSetting = {মিথ্যা, মিথ্যা}; বুল মেনু মোড = মিথ্যা; bool menuNeedsPrint = মিথ্যা; int optionSelected = 0; // সেটআপ ফাংশন
অকার্যকর সেটআপ () {পিনমোড (মেনু সিলেক্ট, ইনপুট); পিনমোড (মেনু সেভ, ইনপুট); পিনমোড (মেনু সিলেক্ট, ইনপুট); Serial.begin (9600); }
// বর্তমান নির্বাচিত অপশনটি ফেরত দেওয়ার ফাংশন char *ReturnOptionSelected () {char *menuOption = menuOptions [optionSelected]; // রিটার্ন অপশন নির্বাচিত রিটার্ন মেনু অপশন; } // বর্তমান নির্বাচিত বিকল্প গৃহস্থালীর অবস্থা ফিরিয়ে আনার ফাংশন *ReturnOptionStatus () {bool optionSetting = featureSetting [optionSelected]; char *optionSettingVal; যদি (optionSetting == false) {optionSettingVal = "মিথ্যা"; } অন্যথায় {optionSettingVal = "True"; } // রিটার্ন optionSetting return optionSettingVal; } // বর্তমান অপশন বুল টগল করার ফাংশন ToggleOptionSelected () {featureSetting [optionSelected] =! FeatureSetting [optionSelected]; সত্য ফিরে; } // প্রধান লুপ
অকার্যকর লুপ () {// বোতামগুলি পড়ুন int menuButtonPressed = digitalRead (menuButton); int menuSelectPressed = digitalRead (menuSelect); int menuSavePressed = digitalRead (menuSave); // বর্তমান সময় দীর্ঘ int currentTime = মিলিস () পান; যদি (menuButtonPressed == LOW এবং menuButtonPreviousState = LOW; menuSelectPreviousState = LOW; menuSavePreviousState = LOW; } যদি (((currentTime - lastDebounceTime)> debounceTimeout)) {// যদি সময়সীমা শেষ হয়ে যায়, বোতাম টিপুন!
// মেনু বাটন চাপানো হয়, যুক্তি প্রদান করুন
// কেবলমাত্র তখনই আগুন লাগে যখন বাটনটি পূর্বে রিলিজ করা হয়েছে যদি ((menuButtonPressed == HIGH) && (menuButtonPreviousState == LOW)) {if (menuMode == false) {menuMode = true; // ব্যবহারকারীকে জানতে দিন Serial.println ("মেনু সক্রিয়"); } অন্যথায় যদি (menuMode == true && optionSelected = 1) {// Reset option optionSelected = 0; } // মেনু মেনু প্রিন্ট করুন প্রিন্ট = সত্য; // বোতামটি পূর্বে টগল করুন। শুধুমাত্র মেনু প্রদর্শন করার জন্য রাষ্ট্র // যদি বোতামটি রিলিজ করা হয় এবং আবার চাপলে menuButtonPreviousState = menuButtonPressed; // উচ্চ হবে // মেনু নির্বাচন চাপানো হয়, যুক্তি প্রদান করুন যদি ((menuSelectPressed == HIGH) && (menuSelectPreviousState == LOW)) {যদি (menuMode) {// নির্বাচিত বিকল্পটি পরিবর্তন করুন // এই মুহুর্তে, এটি শুধু সত্য/মিথ্যা // কিন্তু কিছু হতে পারে bool toggle = ToggleOptionSelected (); যদি (টগল) {menuNeedsPrint = true; } অন্য {সিরিয়াল.প্রিন্ট ("কিছু ভুল হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন"); }} // টগল অবস্থা শুধুমাত্র টগল হলে মুক্তি পায় এবং আবার চাপলে menuSelectPreviousState = menuSelectPressed; } যদি ((menuSavePressed == HIGH) && (menuSavePreviousState == LOW)) {// মেনু থেকে বেরিয়ে আসুন // এখানে আপনি কোন পরিপাটি করতে পারেন // অথবা EEPROM menuMode = false; Serial.println ("মেনু থেকে বেরিয়ে এসেছে"); // টগল অবস্থা তাই মেনু শুধুমাত্র একবার প্রস্থান করে menuSavePreviousState = menuSavePressed; }} // বর্তমান মেনু অপশনটি প্রিন্ট করুন, কিন্তু শুধুমাত্র একবার প্রিন্ট করুন যদি (menuMode && menuNeedsPrint) {// আমরা মেনু প্রিন্ট করে দিয়েছি, তাই যদি কিছু না হয় // মেনু নিডসপ্রিন্ট = মিথ্যা মুদ্রণ করার প্রয়োজন নেই; char *optionActive = ReturnOptionSelected (); char *optionStatus = ReturnOptionStatus (); সিরিয়াল.প্রিন্ট ("নির্বাচিত:"); Serial.print (optionActive); সিরিয়াল.প্রিন্ট (":"); Serial.print (optionStatus); Serial.println (); }}}
সার্কিট টিঙ্কারকাড সাইটে পাওয়া যায়। আমি নীচের সার্কিটটি এম্বেড করেছি যাতে আপনিও দেখতে পারেন!
বরাবরের মতো, যদি আপনার কোন প্রশ্ন বা সমস্যা থাকে, দয়া করে আমাকে জানান!
প্রস্তাবিত:
কীভাবে একটি রাস্পবেরি পাই সেটআপ করবেন এবং এটি ব্যবহার শুরু করবেন: 4 টি ধাপ
কীভাবে একটি রাস্পবেরি পাই সেটআপ করবেন এবং এটি ব্যবহার শুরু করবেন: ভবিষ্যতের পাঠকদের জন্য, আমরা ২০২০ সালে এসেছি। যে বছর, যদি আপনি ভাগ্যবান হন এবং কোভিড -১ by দ্বারা সংক্রমিত না হন, আপনি হঠাৎ করে , আপনার কল্পনার চেয়ে অনেক বেশি ফ্রি সময় পেয়েছেন। তাহলে আমি কিভাবে নিজেকে খুব বেশি মূid় ভাবে দখল করতে পারি? হ্যাঁ
কীভাবে একটি লিনাক্স বুট ড্রাইভ তৈরি করবেন (এবং এটি কীভাবে ব্যবহার করবেন): 10 টি ধাপ
কীভাবে একটি লিনাক্স বুট ড্রাইভ তৈরি করবেন (এবং এটি কীভাবে ব্যবহার করবেন): এটি লিনাক্স, বিশেষ করে উবুন্টুর সাথে কীভাবে শুরু করা যায় তার একটি সহজ ভূমিকা।
ভিসুইনো এলইডি -র মতো জিনিসগুলি নিয়ন্ত্রণ করতে ইনপুট হিসাবে কীভাবে একটি বোতাম ব্যবহার করবেন: 6 টি ধাপ
ভিসুইনো এলইডি -র মতো জিনিসগুলি নিয়ন্ত্রণ করার জন্য একটি ইনপুট হিসাবে একটি বোতাম কীভাবে ব্যবহার করবেন: এই টিউটোরিয়ালে আমরা শিখব কিভাবে একটি সাধারণ বোতাম এবং ভিসুইনো ব্যবহার করে এলইডি চালু এবং বন্ধ করতে হয়।
আরডুইনোতে একটি বাহ্যিক লাইব্রেরি কীভাবে যুক্ত করবেন: 3 টি ধাপ
আরডুইনোতে একটি বাহ্যিক লাইব্রেরি কীভাবে যুক্ত করবেন: লাইব্রেরি আমাদের তৈরি স্কেচের জন্য অতিরিক্ত ফাংশন সরবরাহ করে। এই ফাংশনগুলি আমাদের স্কেচ সহজ করতে সাহায্য করতে পারে। অনেক লাইব্রেরি আছে যা আমরা ব্যবহার করতে পারি। Arduino IDE- এর ডিফল্ট লাইব্রেরি বা বাহ্যিক লাইব্রেরি যা কেউ বা একটি সম্প্রদায় তৈরি করেছে। এই
অডিও ইনপুট এবং আউটপুট দিয়ে একটি পুশ বোতাম কীভাবে সংযুক্ত করবেন: 13 টি ধাপ
অডিও ইনপুট এবং আউটপুটের সাথে একটি পুশ বোতাম কীভাবে সংযুক্ত করবেন: আপনার ক্রিয়া ক্যাপচারের জন্য একটি পুশ বোতাম একটি মৌলিক উপাদান। আপনি কিছু করার জন্য গতিশীলভাবে একটি বোতাম ধাক্কা দিতে পারেন। থি