فهرست مطالب:

اژدهای سینوسی: 10 مرحله (همراه با تصاویر)
اژدهای سینوسی: 10 مرحله (همراه با تصاویر)

تصویری: اژدهای سینوسی: 10 مرحله (همراه با تصاویر)

تصویری: اژدهای سینوسی: 10 مرحله (همراه با تصاویر)
تصویری: لحظه دستگیری قاتل که دو فرد را در کنار خیابان سر برید ! 2024, جولای
Anonim
اژدهای سینوسی
اژدهای سینوسی

Sine-ese Dragon یک دکوراسیون داخلی خانه است که از حرکات مکانیکی و چراغ هایی استفاده می کند تا پیش بینی آب و هوا را برای سه بازه سه ساعته بعدی به شما بگوید. بنا به تعریف ، محیط پیرامون چیزی را توصیف می کند. بنابراین تصمیم گرفته شد که داده های آب و هوا را در یک نمایشگر محیطی ترکیب کنیم. آب و هوا جنبه ای است که ناخواسته روز مردم را تغییر می دهد و بخشی از اطلاعات است که به طور مداوم در هر دقیقه یا حتی در مرحله دوم تغییر می کند.

اژدهای چینی "نماد قدرت ، قدرت و موفقیت است" و اغلب در شبه قاره آسیا از ارزش فرهنگی و سنتی بالایی برخوردار است. گفته می شود که اژدهای چینی علاوه بر ثروت خوب ، دارای قدرتهای قوی است که "آب ، بارندگی ، طوفان و سیل" را کنترل می کند. در نهایت ، اژدهای چینی برای نشان دادن داده های آب و هوا مناسب تشخیص داده شد.

تجسم

اژدهای Sine-ese در شش نقطه اصلی در سه بخش جداگانه که نشان دهنده پیش بینی آب و هوا برای سه بازه 3 ساعته است ، دستکاری می شود. برای هر 3 ساعت فاصله ، اطلاعات زیر شامل می شود:

  • شرح آب و هوا - رنگ اطلاعات آب و هوای فعلی را تعیین می کند.
  • دما - ارتفاع بدن را مشخص می کند
  • رطوبت - چشمک زدن قطعات LED
  • سرعت باد - سرعت حرکت بدن به چپ و راست را کنترل می کند.

مواد مورد نیاز

  1. تخته سه لا/مقوا
  2. رولپلاک یا چوب چوب 5 میلی متری چوبی
  3. 2 فوتون ذره ای
  4. 3 اسباب بازی Slinky
  5. 6 سروو موتور
  6. چراغ های NeoPixel (چراغ های رشته ای یا جداگانه که به هم دوخته شده اند)
  7. چسب فوق العاده زیاد
  8. نخ هادی
  9. رنگ آکریلیک
  10. پارچه تزئینی
  11. دستگاه برش لیزری
  12. چاپگر سه بعدی

مرحله 1: بالا و پایین

بالا و پایین!
بالا و پایین!
بالا و پایین!
بالا و پایین!
بالا و پایین!
بالا و پایین!

اولین قدم شما برای ساختن اژدهای Sine-ese این است که م componentلفه ای را کنترل کنید که حرکت بالا و پایین بدن را کنترل می کند. چقدر هیجان انگیز!

  1. فایلهای Adobe Illustrator (.ai) را بارگیری کرده و با استفاده از دستگاه برش لیزری آنها را چاپ کنید.

    upDownBoxWithPlatform.ai باید روی مقوا چاپ شود

  2. فایلهای چاپ سه بعدی (.stl) را بارگیری کرده و از چاپگر سه بعدی دلخواه خود برای چاپ آنها استفاده کنید.

    رنگ برای دیسک یا چرخاننده دیسک مهم نیست. در تصویر دوم ، چرخاننده دیسک داخل سوراخ دیسک قرار داده شده است

  3. دو جزء اول را مونتاژ کرده و مطابق شکل 3 تا 5 آنها را به هم بچسبانید.

    1. سکو
    2. شیارهای دیسک
  4. اکنون ، نکات زیر را با توجه به نکات زیر کنار هم قرار دهید.

    1. سیم های سرو باید از طریق دهانه مستطیل شکل کنار جعبه عبور کنند.
    2. کوتاهترین انتهای چرخش دیسک به سر سرو متصل می شود و انتهای بلندتر از سوراخ طرف دیگر جعبه عبور می کند و یک سوراخ دایره ای روی آن وجود دارد. این در تصویر 6 نشان داده شده است.
  5. در حال حاضر ، ما به چیزی نیاز داریم تا از ثابت ماندن پلتفرم هنگام چرخاندن دیسک اطمینان حاصل کنیم. چوب چوب را به چوب های 75 میلی متری برش دهید (تصویر 7) و با استفاده از چسب حرارتی آنها را از بالای جعبه به بالای سکو بچسبانید. اطمینان حاصل کنید که چوبها در 90 درجه به سمت سکو صاف شده اند.
  6. یک چوب به طول 212 میلی متر را در سوراخ وسط بالای جعبه روی سکو قرار دهید.

شیرین! اکنون یک جعبه کامل (تصویر 8) برای حرکت بالا و پایین اژدها در اختیار دارید. حالا ، مراحل بالا را دو بار دیگر تکرار کنید!

مرحله 2: در مورد چپ و راست؟

چپ و راست چی ؟!
چپ و راست چی ؟!
چپ و راست چی ؟!
چپ و راست چی ؟!
چپ و راست چی ؟!
چپ و راست چی ؟!
چپ و راست چی ؟!
چپ و راست چی ؟!

در حال حاضر ، ما نمی توانیم حرکت چپ و راست اژدهای Sine-ese را فراموش کنیم ، درست است؟ بیایید وارد مرحله دوم شویم!

  1. فایلهای Adobe Illustrator (.ai) را بارگیری کرده و با استفاده از دستگاه برش لیزری آنها را چاپ کنید.

    1. leftRightBoxWithPlatforms.ai باید روی مقوا چاپ شود.
    2. فایل armTurner.ai باید روی موادی با ضخامت 3 میلی متر چاپ شود.
  2. فایلهای چاپ سه بعدی (.stl) را بارگیری کرده و از چاپگر سه بعدی دلخواه خود برای چاپ آنها استفاده کنید.

    مطمئن شوید که دو بازو را چاپ کرده اید! رنگ اینجا مهم نیست

  3. همانطور که در تصویر 3 نشان داده شده است ، دو سکو را با استفاده از چسب حرارتی با هم جمع کنید.
  4. جعبه را کنار هم بگذارید. اگرچه ممکن است انجام این کار دشوار باشد ، اما دستیابی به آن آسان تر است:

    1. قرار دادن دو سکو بین دو شکاف بزرگ در دو طرف جعبه.
    2. قرار دادن اولین بازو در بالای سکوی بالایی.
    3. چرخاندن بازو را از طریق بازو و سپس سکوی بالایی عبور دهید.
    4. بازوی دوم را در بالای سکوی پایینی قرار دهید.
    5. چرخش بازو را از طریق بازوی دوم و سپس سکوی پایینی عبور دهید.
    6. چرخاننده بازو را از طریق دهانه مستطیل چرخاننده بازوی چاپ شده سه بعدی بچسبانید.
    7. انتهای دیگر ترنر بالای سروو موتور قرار دارد.
    8. قسمت های بالا ، پایین و پشت را به جعبه اضافه کنید.

جعبه مونتاژ شده نهایی شما باید شبیه تصویر ششم باشد. حالا ، شما باید این کار را دو بار دیگر تکرار کنید!

در پایان این مرحله ، شما باید شش جعبه داشته باشید که هر کدام از آنها دارای سه سیستم حرکت بالا/پایین و چپ/راست است.

مرحله 3: بالا نگه داشتن بدن … چگونه؟

بالا نگه داشتن بدن … چگونه؟
بالا نگه داشتن بدن … چگونه؟

سؤال خوبی بود! این زمانی است که آن دارنده های چاپگر سه بعدی وارد می شوند. فایل.stl موجود را بارگیری کرده و با استفاده از چاپگر سه بعدی چاپ کنید. مطمئن شوید که برای 6 جعبه مختلف در مجموع 6 نگهدارنده چاپ کنید.

اگر تصویر نگهدارنده شلخته را در بالا مشاهده کرده اید ، شگفتی خراب شده است - این رنگ اژدهای Sine -ese ما است!

مرحله 4: اما آن جعبه ها چندان زیبا نیستند…

و من موافقم! به همین دلیل است که ما از یک برش لیزری برای برش یک جعبه بسیار جذابتر استفاده می کنیم تا همه آن جعبه ها را مخفی کرده و آنها را پنهان کنیم.

آن فایل های Adobe Illustrator را بارگیری کرده و با استفاده از برش لیزری آنها را برش دهید. طراحی ابرها توسط یکی از مشارکت کنندگان طراحی شده است. با حذف آنها در داخل فایل تصویرگر و افزودن طرح دلخواه خود به دلخواه ، آنها را اصلاح کنید! در زیر مراحل پیشنهادی برای ترکیب همه چیز آمده است.

  1. هر سه قطعه را از اولین فایل (externalBoxFinal_1) با هم جمع کرده و بچسبانید.
  2. قطعه را از فایل دوم (outerBoxFinal_2) هنوز اضافه نکنید.
  3. قطعه را از فایل سوم (externalBoxFinal_3) به پایین جعبه قرار دهید و باید در بالا بسته شود. فقط در انتهای جعبه بچسبانید.
  4. innerBoxesPlatform را دوبار چاپ کنید. دو قطعه ای که سوراخ مستطیل بزرگی در آنها وجود دارد را به هم بچسبانید. سپس سه قطعه باقی مانده را به هم بچسبانید. در نهایت ، آن را به ست چسبانده شده دیگر با سوراخ هایی در آنها بچسبانید.
  5. سکو را در پایین جعبه بزرگ قرار دهید.
  6. هر 6 جعبه کوچکتر را در نقاط مربوط به خود روی سکو قرار دهید.
  7. اکنون ، قطعه را از فایل دوم (outerBoxFinal_2) در بالای جعبه قرار دهید و دور لبه را بچسبانید. سوراخ های روی قطعه بالا باید با سوراخ های جعبه های کوچکتر هم تراز باشد. اگر نه ، جعبه های کوچکتر خود را دوباره مرتب کنید. به هیچ وجه به جعبه های کوچکتر چسب نزنید.
  8. اگر از تخته نان استفاده می کنید که یک قطعه چسبناک در پایین دارد ، این قسمت را در نزدیکی قطعه پایینی در جایی قرار دهید که وقتی جعبه را می بندید ، تخته نان به همراه فوتون ها ناپدید شوند. در قسمت زیرین شکاف های کوچکی وجود دارد که اتصال به خارج را برای شما آسان تر می کند.

مرحله 5: اسباب بازی های اسلینکی ؟؟ ای وای

اسباب بازی های اسلینکی ؟؟ ای وای!
اسباب بازی های اسلینکی ؟؟ ای وای!
اسباب بازی های اسلینکی ؟؟ ای وای!
اسباب بازی های اسلینکی ؟؟ ای وای!

بدن اژدها:

1. با استفاده از چسب داغ یا نوار ، سه اسلینک را با هم ترکیب کنید.

2. طول و قطر اسلینک ها را اندازه بگیرید و یک تکه پارچه تزئینی را ببرید.

3. دو سر پارچه را بیاورید و به هم بدوزید.

4. پس از اتمام دوخت آنها ، slinkies را مانند جوراب داخل کنید.

5. انتهای اسلینکی را به پارچه دوخته شده بدوزید.

مرحله 6: اژدهای خود را چاپ کنید

قطعات اژدها با چاپ سه بعدی:

1. قطعات از https://www.thingiverse.com/thing:854575 گرفته شده است.

2. ما فقط از سر ، پاها و چشم ها استفاده کردیم.

3. پس از چاپ سه بعدی قطعه ، آن را با استفاده از کاغذ سنباده و استون صاف کنید.

4. قطعات را به صورتی که می خواهید تزئین کنید رنگ آمیزی کنید.

مرحله 7: زمان افزایش اژدهای خود با NeoPixels

زمان افزایش اژدهای خود با NeoPixels!
زمان افزایش اژدهای خود با NeoPixels!
زمان افزایش اژدهای خود با NeoPixels!
زمان افزایش اژدهای خود با NeoPixels!

بخش نور:

1. در صورت تمایل می توانید از یک رشته نئوپیکسل برای ایجاد چراغ استفاده کنید. (ما رشته ها را تمام کردیم).

2. ما از 20 چراغ نئوپیکسلی استفاده کردیم و آنها را با استفاده از سیم به هم وصل کردیم. این سیم ها روی آنها لحیم شده و با استفاده از سیم کشی قرمز به فوتون متصل شده اند تا با موضوع اژدها مطابقت داشته باشد.

3. شما همچنین می توانید چراغ های نئوپیکسلی خود را بر روی یک پارچه بلند بدوزید ، اما ما از آنها استفاده نکردیم زیرا اسلینکی ساخته شده از فلز داشتیم.

مونتاژ قطعات: قسمت نوری داخل بدنه اژدها را با استفاده از نخ یا سیم محکم کنید. مطمئن شوید که قادر به اتصال چراغ ها به فوتون داخل جعبه پایه هستید. سر ، پاها و دم را با استفاده از چسب به بدن وصل کنید. هنگامی که آنها در جای خود قرار گرفتند ، بدنه را در نگهدارنده های چسبنده ای که قبلا چاپ کردیم محکم کنید. اکنون بدن آماده برنامه ریزی است.

مرحله 8: زمان برنامه نویسی

از آنجایی که ما از دو فوتون ذره برای کار با شش موتور سروو جداگانه استفاده می کنیم (یک فوتون فقط می تواند با چهار موتور کار کند) ، ما دو کد جداگانه اما مشابه برای نوشتن روی میکروکنترلرها می نویسیم.

اکنون ، برای اولین میکروکنترلر…

در یک فایل آردوینو (.ino) ، کتابخانه های زیر را وارد کنید و تعریف کنید:

#شامل "neopixel.h"

#شامل "ArduinoJson.h"

#PIXEL_PIN D4 را #تعریف کنید

#تعریف PIXEL_COUNT 18

بعد ، متغیرهای زیر را اعلام کنید:

نوار Adafruit_NeoPixel = Adafruit_NeoPixel (PIXEL_COUNT ، PIXEL_PIN) ؛

سرو سرو لیفت رایت_1؛ servoUpDown_1 ؛ سروو سرو چپ راست 2؛ سرو سرو UPDown_2 ؛ int positionLeftRight_1 = 0 ؛ int positionUpDown_1 = 0 ؛ int leftRight_1 = 1؛ int upDown_1 = 1 ؛ int positionLeftRight_2 = 100 ؛ // باید بین 0 تا 180 (در درجه) int positionUpDown_2 = 180 باشد؛ // باید بین 0 تا 180 (در درجه) int leftRight_2 = 1 باشد ؛ // 0 = چپ ، 1 = راست int upDown_2 = 1 ؛ // 0 = بالا ، 1 = پایین const size_t بافر SizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JJE_S_S_S_S 390؛ توایع size_t bufferSizeForecast = 38 * JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2 * JSON_OBJECT_SIZE (0) + 112 * JSON_OBJECT_SIZE (1) + 39 * JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (3) + 38 * JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490 ؛ String weatherArray [3]؛ float temperatureArray [3]؛ رطوبت شناورآرایه [3]؛ float windSpeedArray [3]؛ stest timestampArray [3]؛ int upDownMaxDegree [3]؛ int leftRightSpeed [3]؛ رشته allData5DaysForecast ؛

برای آشنایی با نحوه راه اندازی webhook ها اینجا را کلیک کنید. پس از اتمام کار ، بیانیه ها و توابع زیر را اضافه کنید و در صورت لزوم تغییرات مناسب را اعمال کنید:

void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast") ؛ allData5DaysForecast = ""؛ } Timer timerWeatherForecast (60000 ، getWeather5DayForecast) ؛ void getCurrentWeather () {Particle.publish ("get_currentWeather") ؛ } Timer timerWeatherCurrent (60000 ، getCurrentWeather) ؛

عملکردهای زیر حرکات بالا/پایین و چپ/راست اژدها را کنترل می کند:

void changeLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0] ؛ if (positionLeftRight_1> 100) {leftRight_1 = 0 ؛ }} else {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]؛ if (positionLeftRight_1 <0) {leftRight_1 = 1؛ }} servoLeftRight_1.write (positionLeftRight_1)؛ }

void changeLeftRight2 () {

if (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1] ؛ if (positionLeftRight_2> 100) {leftRight_2 = 0 ؛ }} else {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1] ؛ if (positionLeftRight_2 <0) {leftRight_2 = 1 ؛ }} servoLeftRight_2.write (positionLeftRight_2)؛ }

void changeUpDown1 () {

if (upDown_1) {positionUpDown_1 ++؛ if (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0 ؛ }} else {positionUpDown_1--؛ if (positionUpDown_1 <1) {upDown_1 = 1؛ }} servoUpDown_1.write (positionUpDown_1) ؛ }

void changeUpDown2 () {

if (upDown_2) {positionUpDown_2 ++ ؛ if (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0 ؛ }} else {positionUpDown_2--؛ if (positionUpDown_2 <1) {upDown_2 = 1 ؛ }} servoUpDown_2.write (positionUpDown_2) ؛ }

برای اینکه بتوانید حرکات را در یک بازه زمانی تغییر دهید ، تایمر ایجاد می شود.

تایمر تایمر LeftRight1 (100 ، changeLeftRight1) ؛

تایمر تایمر LeftRight2 (100 ، changeLeftRight2) ؛ تایمر timerUpDown1 (10 ، changeUpDown1) ؛ تایمر timerUpDown2 (10 ، changeUpDown2) ؛

تابع راه اندازی بالاخره بعداً اضافه می شود. مطمئن شوید که تغییرات مناسبی را در خطوط کدی که با قلاب های وب سروکار دارد ، اعمال کنید.

void setup () {// زمان سنج آب و هوا را شروع کنید timerWeatherForecast.start ()؛ timerWeatherCurrent.start ()؛ // Neopixels strip.begin ()؛ // مقداردهی اولیه را مانند pinMode قرار دهید و توابع را در اینجا شروع کنید. // راه اندازی Micro Servo servoLeftRight_1.attach (D1) ؛ servoUpDown_1.attach (D0) ؛ servoLeftRight_2.attach (D3) ؛ servoUpDown_2.attach (D2) ؛ servoLeftRight_1.write (positionLeftRight_1) ؛ // مقداردهی اولیه سروو servoUpDown_1.write (positionUpDown_1) ؛ // مقداردهی اولیه سروو servoLeftRight_2.write (positionLeftRight_2) ؛ // مقداردهی اولیه سروو servoUpDown_2.write (positionUpDown_2) ؛ // مقداردهی اولیه سروو timerLeftRight1.start ()؛ timerLeftRight2.start ()؛ timerUpDown1.start ()؛ timerUpDown2.start ()؛ // باز کردن کنسول Serial.begin (9600) ؛ تاخیر (2000) ؛ Serial.println ("سلام!")؛ // عضویت در get_weather5DayForecast و get_currentWeather webhooks Particle.subscribe ("hook-respond/get_weather5DayForecast"، gotWeather5DayForecast، MY_DEVICES)؛ Particle.subscribe ("hook-respond/get_currentWeather/0"، gotCurrentWeatherData، MY_DEVICES)؛ getCurrentWeather ()؛ getWeather5DayForecast ()؛ }

یک تابع حلقه برای این پروژه استفاده نمی شود. ما نمی توانیم عملکردهای مربوط به رسیدگی به داده های دریافت شده از webhook ها را فراموش کنیم!

void gotWeather5DayForecast (const char *event، const char *data) {allData5DaysForecast += data؛ // همه داده ها را در یک رشته ذخیره می کند. int allData5DaysForecastLen = allData5DaysForecast.length ()؛ char buffer [allData5DaysForecastLen + 1] ؛ allData5DaysForecast.toCharArray (بافر ، allData5DaysForecastLen + 1) ؛ // ایجاد بافر برای رشته int bufferLength = sizeof (بافر) ؛ DynamicJsonBuffer jsonBufferWeather (bufferLength) ؛ JsonObject & root = jsonBufferWeather.parseObject (بافر) ؛ // اگر تجزیه موفق شد ، آزمایش کنید. if (! root.success ()) {//Serial.println(" تجزیه و تحلیل آب و هوا برای 5 روز پیش بینی … ERROR! ")؛ برگشت؛ } int i = 1؛ JsonArray & list = root ["list"]؛ برای (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]؛ دمای شناور = main ["temp"]؛ رطوبت int = main ["رطوبت"]؛ JsonObject & weather = currentObject ["آب و هوا"] [0]؛ const char* weatherInfo = آب و هوا ["اصلی"]؛ float windSpeed = currentObject ["باد"] ["سرعت"]؛ const char* timestamp = currentObject ["dt_txt"]؛ int tempFah = convertToFahrenheit (دما) ؛ int servoMaxDegree = updateUpDown (tempFah)؛ upDownMaxDegree = servoMaxDegree؛ int servoIncrement = updateleftRight (windSpeed) ؛ leftRightSpeed = servoIncrement؛ setColor (weatherInfo ، i) ؛ temperatureArray = tempFah؛ humidityArray = رطوبت ؛ weatherArray = weatherInfo؛ windSpeedArray = windSpeed؛ timestampArray = timestamp؛ من ++ ؛ } else {break؛ }}}

void gotCurrentWeatherData (const char *event، const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent) ؛ JsonObject & root = jsonBufferWeather.parseObject (داده) ؛ // اگر تجزیه موفق شد ، آزمایش کنید. if (! root.success ()) {//Serial.println(" تجزیه و تحلیل آب و هوای کنونی … ERROR! ")؛ برگشت؛ } JsonObject & weather = root ["weather"] [0]؛ const char* weather_main = weather ["main"]؛ JsonObject & main = root ["اصلی"]؛ float main_temp = main ["temp"]؛ int main_humidity = main ["رطوبت"]؛ float wind_speed = ریشه ["باد"] ["سرعت"]؛ const char* timestamp = root ["dt_txt"]؛ int tempFah = convertToFahrenheit (main_temp) ؛ int servoMaxDegree = updateUpDown (tempFah)؛ upDownMaxDegree [0] = servoMaxDegree؛ int servoIncrement = updateleftRight (سرعت باد)؛ leftRightSpeed [0] = servoIncrement؛ setColor (آب و هوا ، اصلی ، 0) ؛ weatherArray [0] = weather_main؛ temperatureArray [0] = tempFah؛ humidityArray [0] = main_humidity؛ windSpeedArray [0] = wind_speed؛ timestampArray [0] = timestamp؛ }

در زیر ، می توانید عملکردهای اضافی را که کنترل به روزرسانی موقعیت سرو موتورها ، تبدیل دما از کلوین به فارنهایت و تنظیم رنگ LED ها را کنترل می کند ، بیابید.

int updateUpDown (دمای شناور) {// درجه را در محدوده [0، 180] float servoMaxDegree = temp * 45 /31 + (990 /31)؛ Serial.print ("درجه سروو جدید:") ؛ Serial.println (servoMaxDegree) ؛ return servoMaxDegree؛ }

int updateleftRight (float windSpeed) {

// نقشه سرعت باد را در محدوده [1 ، 100] float servoIncrement = windSpeed * 99 /26 + 1 ؛ Serial.print ("مقدار افزایش سروو جدید:") ؛ Serial.println (servoIncrement) ؛ بازگشت سروو افزایش }

int convertToFahrenheit (floK tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67 ؛ بازگشت tempFah؛ }

void setColor (String weatherDesc ، index int) {

int ledIndex = 0؛ if (index == 0) {ledIndex = 0؛ } else if (index == 1) {ledIndex = 6؛ } else if (index == 2) {ledIndex = 12؛ } else {return؛ } if (weatherDesc == "Clear") {// yellow for (int j = ledIndex؛ j <ledIndex+6؛ j ++) {strip.setPixelColor (j، strip. Color (253، 219، 62))؛ // نوار زرد. نمایش ()؛ تأخیر (20) ؛ }} else if (weatherDesc == "ابر") {// خاکستری برای (int j = ledIndex؛ j <ledIndex+6؛ j ++) {strip.setPixelColor (j، strip. Color (223، 229، 237))؛ // نوار خاکستری. نمایش ()؛ تأخیر (20) ؛ }} else if (weatherDesc == "برف") {// سفید برای (int j = ledIndex؛ j <ledIndex+6؛ j ++) {strip.setPixelColor (j، strip. Color (255، 225، 225))؛ // نوار سفید. نمایش ()؛ تأخیر (20) ؛ }} else if (weatherDesc == "باران") {// آبی برای (int j = ledIndex؛ j <ledIndex+6؛ j ++) {strip.setPixelColor (j، strip. Color (119، 191، 246))؛ // blue strip.show ()؛ تأخیر (20) ؛ }} else {// red for (int j = ledIndex؛ j <ledIndex+6؛ j ++) {strip.setPixelColor (j، strip. Color (254، 11، 5))؛ // red strip.show ()؛ تأخیر (20) ؛ }}}

هنگامی که همه چیز را به فایل Arduino خود اضافه کردید ، آن را کامپایل کنید. در صورت عدم وجود خطا ، کد را به اولین فوتون فلش کنید. در مرحله بعد کدهای مشابهی در اختیار شما قرار می گیرد تا در فوتون دوم چشمک بزنید.

مرحله نهم: برنامه نویسی ادامه دارد

از آنجا که کد فوتون دوم تقریباً مشابه کد اول است ، کل کد کپی شده و در زیر جایگذاری می شود:

#شامل "ArduinoJson.h"

سروو سرو چپ راست 3؛

سرو سرووپدان_3؛

int positionLeftRight_3 = 45 ؛

int positionUpDown_3 = 0؛ int leftRight_3 = 1؛ int upDown_3 = 1 ؛

const size_t bufferSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE_SIZE_SIZE_SIZE

توایع size_t bufferSizeForecast = 38 * JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2 * JSON_OBJECT_SIZE (0) + 112 * JSON_OBJECT_SIZE (1) + 39 * JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (3) + 38 * JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490 ؛

String weatherArray [3]؛

float temperatureArray [3]؛ رطوبت شناورآرایه [3]؛ float windSpeedArray [3]؛ stest timestampArray [3]؛ int upDownMaxDegree [3]؛ int leftRightSpeed [3]؛

رشته allData5DaysForecast ؛

void getWeather5DayForecast ()

{Particle.publish ("get_weather5DayForecast2") ؛ allData5DaysForecast = ""؛ }

تایمر تایمرWeatherForecast (60000 ، getWeather5DayForecast) ؛ // 10 ، 800 ، 000 ms = 3 روز

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2") ؛ }

تایمر timerWeatherCurrent (60000 ، getCurrentWeather) ؛

void changeLeftRight3 () {

if (leftRight_3) {positionLeftRight_3 = positionLeftRight_3 + leftRightSpeed [2] ؛ if (positionLeftRight_3> 100) {leftRight_3 = 0 ؛ }} else {positionLeftRight_3 = positionLeftRight_3 - leftRightSpeed [2]؛ if (positionLeftRight_3 <0) {leftRight_3 = 1؛ }} servoLeftRight_3.write (positionLeftRight_3)؛ }

void changeUpDown3 () {

if (upDown_3) {positionUpDown_3 ++؛ if (positionUpDown_3> upDownMaxDegree [2]) {upDown_3 = 0 ؛ }} else {positionUpDown_3-- ؛ if (positionUpDown_3 <1) {upDown_3 = 1؛ }} servoUpDown_3.write (positionUpDown_3) ؛ }

تایمر تایمر LeftRight3 (100 ، changeLeftRight3) ؛

تایمر timerUpDown3 (10 ، changeUpDown3) ؛

void setup () {

// تایمرهای آب و هوا را شروع کنید timerWeatherForecast.start ()؛ timerWeatherCurrent.start ()؛ // مقداردهی اولیه را مانند pinMode قرار دهید و توابع را در اینجا شروع کنید. // راه اندازی Micro Servo servoLeftRight_3.attach (D1) ؛ servoUpDown_3.attach (D0) ؛

servoLeftRight_3.write (positionLeftRight_3) ؛ // مقداردهی اولیه سروو

servoUpDown_3.write (positionUpDown_3) ؛ // مقداردهی اولیه سروو

timerLeftRight3.start ()؛

timerUpDown3.start ()؛ // باز کردن کنسول Serial.begin (9600) ؛ تاخیر (2000) ؛ Serial.println ("سلام!")؛ // مشترک شدن در get_weather5DayForecast و get_currentWeather webhooks Particle.subscribe ("hook-respond/get_weather5DayForecast2"، gotWeather5DayForecast، MY_DEVICES)؛ Particle.subscribe ("hook-respond/get_currentWeather2/0"، gotCurrentWeatherData، MY_DEVICES)؛ getCurrentWeather ()؛ getWeather5DayForecast ()؛ }

void gotWeather5DayForecast (const char *event، const char *data)

{allData5DaysForecast += data؛ // همه داده ها را در یک رشته ذخیره می کند. int allData5DaysForecastLen = allData5DaysForecast.length ()؛ char buffer [allData5DaysForecastLen + 1] ؛ allData5DaysForecast.toCharArray (بافر ، allData5DaysForecastLen + 1) ؛ // ایجاد بافر برای رشته int bufferLength = sizeof (بافر) ؛ DynamicJsonBuffer jsonBufferWeather (bufferLength) ؛ JsonObject & root = jsonBufferWeather.parseObject (بافر) ؛ //Serial.println(allData5DaysForecast) ؛ // اگر تجزیه موفق شد ، آزمایش کنید. if (! root.success ()) {//Serial.println(" تجزیه و تحلیل آب و هوا برای 5 روز پیش بینی … ERROR! ")؛ برگشت؛ } int i = 1؛ JsonArray & list = root ["list"]؛ برای (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]؛ دمای شناور = main ["temp"]؛ رطوبت int = main ["رطوبت"]؛ JsonObject & weather = currentObject ["آب و هوا"] [0]؛ const char* weatherInfo = آب و هوا ["اصلی"]؛ float windSpeed = currentObject ["باد"] ["سرعت"]؛ const char* timestamp = currentObject ["dt_txt"]؛ int tempFah = convertToFahrenheit (دما) ؛ int servoMaxDegree = updateUpDown (tempFah)؛ upDownMaxDegree = servoMaxDegree؛ int servoIncrement = updateleftRight (windSpeed) ؛ leftRightSpeed = servoIncrement؛ temperatureArray = tempFah؛ humidityArray = رطوبت ؛ weatherArray = weatherInfo؛ windSpeedArray = windSpeed؛ timestampArray = timestamp؛ من ++ ؛ } else {break؛ }}}

void gotCurrentWeatherData (const char *event، const char *data)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent) ؛ JsonObject & root = jsonBufferWeather.parseObject (داده) ؛ //Serial.println (داده) ؛ // اگر تجزیه موفق شد ، آزمایش کنید. if (! root.success ()) {//Serial.println(" تجزیه و تحلیل آب و هوای کنونی … ERROR! ")؛ برگشت؛ } JsonObject & weather = root ["weather"] [0]؛ const char* weather_main = weather ["main"]؛ JsonObject & main = root ["اصلی"]؛ float main_temp = main ["temp"]؛ int main_humidity = main ["رطوبت"]؛ float wind_speed = ریشه ["باد"] ["سرعت"]؛ const char* timestamp = root ["dt_txt"]؛ int tempFah = convertToFahrenheit (main_temp) ؛ int servoMaxDegree = updateUpDown (tempFah)؛ upDownMaxDegree [0] = servoMaxDegree؛ int servoIncrement = updateleftRight (سرعت باد)؛ leftRightSpeed [0] = servoIncrement؛ weatherArray [0] = weather_main؛ temperatureArray [0] = tempFah؛ humidityArray [0] = main_humidity؛ windSpeedArray [0] = wind_speed؛ timestampArray [0] = timestamp؛ }

int updateUpDown (دمای شناور) {

// درجه را در محدوده [0، 180] float servoMaxDegree = temp * 45 /31 + (990 /31)؛ Serial.print ("درجه سروو جدید:") ؛ Serial.println (servoMaxDegree) ؛ return servoMaxDegree؛ }

int updateleftRight (float windSpeed) {

// نقشه سرعت باد را در محدوده [1 ، 100] float servoIncrement = windSpeed * 99 /26 + 1 ؛ Serial.print ("مقدار افزایش سروو جدید:") ؛ Serial.println (servoIncrement) ؛ بازگشت سروو افزایش }

int convertToFahrenheit (floK tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67 ؛ بازگشت tempFah؛ }

توانجامش دادی! شما بخش برنامه نویسی پروژه را پشت سر گذاشته اید! در حال حاضر ، مطمئن شوید که تمام سیم کشی و اتصالات را از موتورهای سروو و نئوپیکسل ها به تخته نان و میکروکنترلرها انجام می دهید. انتهای دیگر باید به بدن اژدها متصل شود.

مرحله 10: از اژدهای خود لذت ببرید

تبریک می گویم! شما یک اژدهای Sine-ese را از ابتدا ساخته اید! اکنون تنها کاری که باید انجام دهید این است که بنشینید و از نمایشگر محیطی خود لذت ببرید!

توجه: این پروژه به عنوان بخشی از دوره آموزشی توسط Joan Bempong و Soundarya Muthuvel ساخته شده است. صفحه دوره را می توانید در اینجا پیدا کنید.

توصیه شده: