সুচিপত্র:

কিভাবে একটি স্টেপ কাউন্টার তৈরি করবেন?: 3 টি ধাপ (ছবি সহ)
কিভাবে একটি স্টেপ কাউন্টার তৈরি করবেন?: 3 টি ধাপ (ছবি সহ)

ভিডিও: কিভাবে একটি স্টেপ কাউন্টার তৈরি করবেন?: 3 টি ধাপ (ছবি সহ)

ভিডিও: কিভাবে একটি স্টেপ কাউন্টার তৈরি করবেন?: 3 টি ধাপ (ছবি সহ)
ভিডিও: মাত্র ৫ মিনিটে কপিরাইট স্ট্রাইক রিমুভ করুন | How to Remove Copyright Strike in Bangla 2024, জুন
Anonim
Image
Image
একটি Blynk প্রকল্প তৈরি করুন
একটি Blynk প্রকল্প তৈরি করুন

আমি অনেক খেলায় ভাল পারফর্ম করতাম: হাঁটা, দৌড়ানো, সাইকেল চালানো, ব্যাডমিন্টন খেলা ইত্যাদি।

আমি অনেক আগে ঘুরে বেড়াতে রাইডিং পছন্দ করি। আচ্ছা, আমার পোর্টলি পেট দেখো ……

ঠিক আছে, যাই হোক, আমি ব্যায়াম পুনরায় আরম্ভ করার সিদ্ধান্ত নিই। আমি কি সরঞ্জাম প্রস্তুত করা উচিত? ক্রীড়া সুবিধা ছাড়াও, হ্যাঁ! আমার একটা যন্ত্র দরকার! আমি এর সাথে বিশ্বাস করি, আমি সঠিক পরিমাণে ব্যায়াম রাখতে পারি। এখানে যন্ত্রটি অস্তিত্বে আসে আসুন একটি ভিডিও দিয়ে শুরু করি ~

যন্ত্রটি কেবল বাস্তব সময়ে পদক্ষেপ (এবং ক্যালোরি) রেকর্ড করতে পারে না, কিন্তু সময় দেখায়। বিশেষ কি হল যে দেখানোর বিন্যাসটি পয়েন্টার ~ এত চমৎকার! আমি সত্যি সত্যি এটি পছন্দ করি!

আপনি আপনার রেকর্ড ইন্টারনেটে আপলোড করতে পারেন

শুধুমাত্র একটি ক্লিকে। সমস্ত রেকর্ড Blynk দ্বারা প্রদর্শিত হতে পারে (একটি স্মার্ট ফোন সফ্টওয়্যার আগে চালু)। পরিধানযোগ্য স্মার্ট ঘড়ির মতোই, যন্ত্রটি লাইনে সময় পায় (সুতরাং আপনি শক্তি এবং সময় আপডেট হওয়ার ভয় পাবেন না)।

মেইডে হার্ডওয়্যার:

ফায়ারবিটল বোর্ড-ইএসপি 32

ফায়ারবিটল কভারস-প্রোটো বোর্ড

OLED12864 ডিসপ্যালি স্ক্রিন

ত্বরণ মডিউল

3.7V ব্যাটারি (অনলাইনে কেনা, ভলিউম প্রায় 600mAH

3 বোতল (অনলাইনে কেনা

Blybk দ্বারা এই প্রকল্পটি নির্মাণ করা খুবই সুবিধাজনক।

ধাপ 1: একটি Blynk প্রকল্প তৈরি করুন

দুটি নিয়ন্ত্রণ যোগ করুন:

মান প্রদর্শন * 1

রিয়েল টাইম ঘড়ি * ১

মান প্রদর্শন নাম ধাপে সেট করা উচিত, কিন্তু রিয়েল-টাইম ঘড়ির বৈশিষ্ট্যগুলির জন্য কোন সেটিং নেই। নীচের হিসাবে দেখানো নিয়ন্ত্রণের বিন্যাসকে সামঞ্জস্য করতে V1 ইনপুট পিন হিসাবে চয়ন করুন।

ধাপ 2: FireBeetle Board-ESP32 এ প্রোগ্রাম ডাউনলোড করুন

Esp32 এ সোর্স কোড ডাউনলোড করতে এখানে ক্লিক করুন। উৎস কোড লাইব্রেরি ফাইল এবং 3D মুদ্রণ ফাইল রয়েছে। আপনার লাইব্রেরি ফাইলটি arduino এর lib এ সংরক্ষণ করা উচিত। এবং 3D ফাইলগুলি সরাসরি ক্রাস্ট মুদ্রণ করতে পারে।

নীচে মূল প্রোগ্রাম

#অন্তর্ভুক্ত #অন্তর্ভুক্ত // শুধুমাত্র Arduino 1.6.5 এবং এর আগে প্রয়োজন #অন্তর্ভুক্ত "SSD1306.h" // উপনাম ' #অন্তর্ভুক্ত "SSD1306Wire.h" " #অন্তর্ভুক্ত" OLEDDisplayUi.h " #অন্তর্ভুক্ত" চিত্র। h " # অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত POWER_KEY 1 #সংজ্ঞা MENU_KEY 2 #সংজ্ঞায়িত UPLOAD_KEY 3 বুলিয়ান আপলোড = মিথ্যা; SSD1306 ডিসপ্লে (0x3c, 18, 0); OLEDDisplayUi ui (& display); সিম্পল টাইমার টাইমার; উইজেটআরটিসি আরটিসি; int পর্দা W = 128; int স্ক্রিন এইচ = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2) +16; // উপরের হলুদ অংশ হল 16 px উচ্চতা int clockRadius = 23; #ডিফাইন ডিভাইস (0x53) // ADXL345 ডিভাইসের ঠিকানা #ডিফাইন TO_READ (6) // বাইটের সংখ্যা আমরা প্রতিবার পড়তে যাচ্ছি (প্রতিটি অক্ষের জন্য দুটি বাইট) বাইট বাফ [TO_READ]; // চারটি str [100] ডিভাইস থেকে পড়া তথ্য সংরক্ষণের জন্য 6 বাইট বাফার; // স্ট্রিং বাফার সিরিয়াল পোর্ট int regAddress = 0x32 এ পাঠানোর আগে ডেটা রূপান্তর করতে; // ADXL345 int xx, yy, zz- এ প্রথম অক্ষ-ত্বরণ-ডেটা নিবন্ধন; // তিন অক্ষ ত্বরণ তথ্য স্ট্যাটিক int currentValue = 0; স্ট্যাটিক স্বাক্ষরবিহীন দীর্ঘ ধাপসম = 0; char auth = "YourAuthToken"; // আপনার ওয়াইফাই শংসাপত্র। // খোলা নেটওয়ার্কের জন্য পাসওয়ার্ড "" সেট করুন। char ssid = "YourNetworkName"; char pass = "YourPassword"; const char running_Logo_bits প্রোগ্রাম = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 Xxx 0xFC 0x00 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0xA0, 0xFF, 0x5F, 0x00, 0x00, 0xC0, 0x3F, 0x3F, 0x00, 0x0 0, 0xE8, 0x1F, 0x3F, 0x00, 0x00, 0xE8, 0xA7, 0x3E, 0x00, 0x00, 0xF0, 0x03, 0x7C, 0x00, 0x00, 0xE0, 0x05, 0x7C, 0x00, 0x00, 0xE0, 0x05, 0xF8, 0x01, 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0x03, 0x40, 0xFC, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0x0F, 0x00, 0xE0, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // ডিজিটাল ঘড়ি প্রদর্শনের জন্য ইউটিলিটি ফাংশন: প্রিন্ট 0 স্ট্রিং দুই ডিজিট (int ডিজিট) {যদি (ডিজিট <10) {স্ট্রিং i = '0'+স্ট্রিং (ডিজিট); আমি ফিরে; } অন্য {ফেরত স্ট্রিং (সংখ্যা); }} void clockOverlay (OLEDDisplay * display, OLEDDisplayUiState * state) {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 0; } অকার্যকর analogClockFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // ঘন্টার টিক (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // ডিসপ্লে সেকেন্ড হ্যান্ড ফ্লোট এঙ্গেল = সেকেন্ড () * 6; কোণ = (কোণ / 57.29577951; display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // ডিসপ্লে মিনিট হাতের কোণ = মিনিট () * 6;; // রেডিয়ান x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 4)) display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // ডিসপ্লে ঘন্টা হাতের কোণ = ঘন্টা () * 30 + int ((মিনিট () / 12) * 6); কোণ = (কোণ / 57.29577951), clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {String date = String (year ())+"/"+twoDigits (month ())+"/"+twoDigits (day ()); স্ট্রিং টাইমন = স্ট্রিং (ঘন্টা ())+":"+দুই ডিজিট (মিনিট ())+":"+দুই ডিজিট (সেকেন্ড ()); display-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX + x, 20, timenow); display-> setFont (ArialMT_Plain_16); প্রদর্শন-> ড্র স্ট্রিং (60, 45, তারিখ); } অকার্যকর writeTo (int device, byte address, byte val) {Wire.beginTransmission (device); // ডিভাইস Wire.write (ঠিকানা) এ ট্রান্সমিশন শুরু করুন; // নিবন্ধন ঠিকানা পাঠান Wire.write (val); // Wire.endTransmission () লিখতে মান পাঠান; // এন্ড ট্রান্সমিশন} // ডিভাইসে অ্যাড্রেস রেজিস্টার থেকে শুরু করে নম্ব বাইট পড়ে বাফ অ্যারে ভয়েড রিডফ্রোম থেকে (int device, byte address, int num, byte buff ) {Wire.beginTransmission (device); // ডিভাইস Wire.write (ঠিকানা) এ ট্রান্সমিশন শুরু করুন; // Wire.endTransmission () থেকে পড়ার জন্য ঠিকানা পাঠায়; // শেষ সংক্রমণ Wire.beginTransmission (ডিভাইস); // ডিভাইস Wire.requestFrom (ডিভাইস, সংখ্যা) থেকে ট্রান্সমিশন শুরু করুন; // ডিভাইস int i = 0 থেকে 6 বাইটের অনুরোধ করুন; যখন (Wire.available ()) // ডিভাইস অনুরোধের চেয়ে কম পাঠাতে পারে (অস্বাভাবিক) {buff = Wire.read (); // একটি বাইট পান i ++; } Wire.endTransmission (); // শেষ ট্রান্সমিশন} অকার্যকর চলমান ফ্রেম (OLEDDisplay*display, OLEDDisplayUiState*state, int16_t x, int16_t y) {float calValue = stepsSum*0.4487; display-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX, clockCenterY, str); sprintf (str, "%.2fcal", calValue); display-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_10); display-> drawString (100, 20, str); display-> drawXbm (10, 14, 34, 50, running_Logo_bits); } void uploadFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "আপলোড ডেটা …"); } // এই অ্যারে সব ফ্রেমে ফাংশন পয়েন্টার রাখে // ফ্রেম হল একক দৃশ্য যা ফ্রেম কলব্যাক ফ্রেমে স্লাইড করে = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // কয়টি ফ্রেম আছে? int frameCount = 4; // ওভারলেগুলি একটি ফ্রেমের উপরে স্থিরভাবে আঁকা হয় যেমন। একটি ঘড়ি OverlayCallback overlays = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} void uiInit (void) {ui.setTargetFPS (30); //ui.setActiveSymbol (ActiveSymbol); //ui.setInactiveSymbol (নিষ্ক্রিয় সিম্বল); ui.setIndicatorPosition (TOP); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (ফ্রেম, ফ্রেমকাউন্ট); ui.setOverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (ডিভাইস, 0x2D, 16); writeTo (ডিভাইস, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // ADXL345 xx = (((int) buff [1]) << 8) থেকে এক্সিলারেশন ডেটা পড়ুন | বাফ [0]; yy = (((int) বাফ [3]) << 8) | বাফ [2]; zz = (((int) বাফ [5]) << 8) | বাফ [4]; if (xx 80) {if (xx <currentValue) {stepsSum ++; } currentValue = xx; } sprintf (str, "%d", stepsSum); } int getKeys (অকার্যকর) {যদি (digitalRead (D2) == LOW) {বিলম্ব (5); যদি (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); ফিরে POWER_KEY; }} if (digitalRead (D3) == LOW) {বিলম্ব (5); যদি (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); MENU_KEY ফেরত দিন; }} if (digitalRead (D4) == LOW) {বিলম্ব (5); যদি (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); UPLOAD_KEY ফেরত দিন; }} 0 ফেরত; } void doKeysFunction (void) {স্ট্যাটিক int uiFrameIndex = 2; int কী = getKeys (); যদি (কী == POWER_KEY) {স্ট্যাটিক চার i = 0; যদি (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } অন্যথায় {display.displayOff (); } আমি = ~ আমি; } if (key == MENU_KEY) {if (upload == false) {uiFrameIndex ++; যদি (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } অন্যথায় {ui.switchToFrame (3); }} if (keys == UPLOAD_KEY) {if (upload == true) {upload = false; ui.switchToFrame (uiFrameIndex); } অন্যথায় {আপলোড = সত্য; ui.switchToFrame (3); }}} অকার্যকর সেটআপ () {পিনমোড (D2, INPUT); পিনমোড (D3, INPUT); পিনমোড (D4, INPUT); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } অকার্যকর লুপ () {int leftTimeBudget = ui.update (); স্ট্যাটিক int testSum = 0; যদি ((testSum 0) {বিলম্ব (অবশিষ্ট সময় বাজেট);} doKeysFunction (); timer.run ();}

সতর্কতা: আপনার নিজের কাছে ওয়াই-ফাই সেটিং, পাসপোর্ট এবং লেখক পরিবর্তন করা উচিত।

char auth = "YourAuthToken"; // আপনার ওয়াইফাই শংসাপত্র। // খোলা নেটওয়ার্কের জন্য পাসওয়ার্ড "" সেট করুন। char ssid = "YourNetworkName"; char pass = "YourPassword";

ধাপ 3: হার্ডওয়্যার সংযোগ

হার্ডওয়্যার সংযোগ
হার্ডওয়্যার সংযোগ
হার্ডওয়্যার সংযোগ
হার্ডওয়্যার সংযোগ
হার্ডওয়্যার সংযোগ
হার্ডওয়্যার সংযোগ

OLED12864 এবং এক্সিলারেশন মডিউল I2C, বটমস D2, D3, D4 এর সাথে সংযুক্ত করুন। তদুপরি, নীচে দেখানো 3.3V পৌঁছানোর জন্য নীচে 51 কে পুল-আপ প্রতিরোধক যুক্ত করুন।

সতর্কতা: পুল-আপ প্রতিরোধকগুলিকে AREF এর সাথে সংযুক্ত করা ভুল, সঠিকটি 3.3V এর সাথে

হার্ডওয়্যার সোল্ডারিং ইমেজ, নিচে দেখানো হয়েছে:

সোল্ডারের পরে, ক্রাস্টে হার্ডওয়্যার মডিউল একত্রিত করা, নীচে দেখানো হয়েছে:

ব্যাপক প্রভাব চিত্র

প্রস্তাবিত: