Мазмуну:

Sine-ese Dragon: 10 кадам (сүрөттөр менен)
Sine-ese Dragon: 10 кадам (сүрөттөр менен)

Video: Sine-ese Dragon: 10 кадам (сүрөттөр менен)

Video: Sine-ese Dragon: 10 кадам (сүрөттөр менен)
Video: Пранк над Отцом🤣😱 айфон 124 🤣🤣🤣 2024, Июль
Anonim
Sine-ese Dragon
Sine-ese Dragon

Sine-ese Dragon-бул үйдүн декор бөлүгү, ал механикалык кыймылдарды жана жарыктарды колдонуп, кийинки үч үч сааттык аба ырайын болжолдойт. Аныктама боюнча, чөйрө бир нерсенин жакын чөйрөсүн сүрөттөйт; ошондуктан аба ырайы тууралуу маалыматтарды дисплейге кошуу туура деп чечилди. Аба ырайы - бул адамдардын күндөрүн кокусунан өзгөрткөн жана ар бир мүнөт сайын, ал тургай секундасына чейин өзгөрүп турган маалымат.

Кытай ажыдаары "күчтүн, күчтүн жана ийгиликтин символу" болуп саналат жана көп учурда Азия субконтинентинде жогорку маданий жана салттуу баалуулукта өткөрүлөт. Кытайдын ажыдаарына бакыт алып келүүдөн тышкары, "сууну, жамгырды, тайфундарды жана суу ташкындарын" көзөмөлдөгөн күчтүү күчтөр бар экени айтылат. Акыр -аягы, кытай ажыдаары аба -ырайы маалыматтарын чагылдырууга ылайыктуу деп табылган.

Визуализация

Sine-ese Dragon аба ырайынын үч 3 сааттык интервалын чагылдырган үч бөлүктө алты негизги пунктта башкарылат. Ар бир 3 сааттык интервал үчүн төмөнкү маалыматтар киргизилет:

  • Аба ырайынын сүрөттөлүшү - учурдагы аба ырайы маалыматынын түсүн аныктайт.
  • Температура - дененин бийиктигин аныктайт
  • Нымдуулук - LED сегменттеринин жаркылдашы
  • Шамалдын ылдамдыгы - дененин солго жана оңго жылуу ылдамдыгын көзөмөлдөйт.

Керектүү материалдар

  1. 3 мм фанера/Картон
  2. 5 мм жыгачтан жасалган дубалдар же таякчалар
  3. 2 Бөлүкчөлүк фотондор
  4. 3 Жыпар жыттуу оюнчуктар
  5. 6 servo мотор
  6. NeoPixel чырактары (бир жип же жеке чырактар чогуу тигилген)
  7. Супер клей көп
  8. Өткөргүч жип
  9. Акрил боек
  10. Декоративдүү кездеме
  11. Лазердик кескич
  12. 3D принтер

1 -кадам: Өйдө жана ылдый

Өйдө жана ылдый!
Өйдө жана ылдый!
Өйдө жана ылдый!
Өйдө жана ылдый!
Өйдө жана ылдый!
Өйдө жана ылдый!

Sine-ese Dragonду куруудагы эң биринчи кадамыңыз-дененин өйдө-ылдый кыймылын көзөмөлдөгөн компонентти куруу. Кандай гана кызыктуу!

  1. Adobe Illustrator файлдарын (.ai) жүктөп алып, лазердик кесүүчү машинанын жардамы менен басып чыгарыңыз.

    upDownBoxWithPlatform.ai картонго басылышы керек

  2. 3D басып чыгаруу файлдарын (.stl) жүктөп алып, аларды басып чыгаруу үчүн сүйүктүү 3D принтериңизди колдонуңуз.

    Түсү диск үчүн же диск бурагыч үчүн мааниге ээ эмес. Экинчи сүрөттө, диск айландыргыч дисктин тешигине салынган

  3. Алгачкы эки компонентти чогултуп, 3төн 5ке чейин сүрөттө көрсөтүлгөндөй чаптаңыз.

    1. Платформа
    2. Диск үчүн оюктар
  4. Эми, төмөндөгү кеңештерге ылайык кутучаны чогултуп алыңыз.

    1. Сервонун зымдары кутунун капталындагы тик бурчтуу тешиктен өтүшү керек.
    2. Диск токарынын эң кыска учу серво башына бекитилет жана узун учу тегерек тешиги бар кутунун башка жагындагы тешиктен өтөт. Бул 6 -сүрөттө көрсөтүлгөн.
  5. Эми, диск бурулганда платформанын тегиз болушун камсыздоо үчүн бизге бир нерсе керек. Таякчаны 75 мм узундуктагы таякчаларга бөлүңүз (7 -сүрөт) жана аларды кутучанын үстү аркылуу платформанын үстүнө ысык желим менен чаптаңыз. Таякчалардын платформага 90 градуска тегизделгенине ынангыла.
  6. Кутунун үстүндөгү ортоңку тешикке узундугу 212 мм таякчаны платформага салыңыз.

Таттуу! Эми сизде ажыдаардын өйдө -ылдый кыймылы үчүн толук кутуча бар (8 -сүрөт). Эми жогорудагы кадамдарды дагы эки жолу кайталаңыз!

2 -кадам: Оң жана сол жөнүндө эмне айтууга болот?

Сол жана Оң жөнүндө эмне айтууга болот?!
Сол жана Оң жөнүндө эмне айтууга болот?!
Сол жана Оң жөнүндө эмне айтууга болот?!
Сол жана Оң жөнүндө эмне айтууга болот?!
Сол жана Оң жөнүндө эмне айтууга болот?!
Сол жана Оң жөнүндө эмне айтууга болот?!
Сол жана Оң жөнүндө эмне айтууга болот?!
Сол жана Оң жөнүндө эмне айтууга болот?!

Эми, биз Синусе Ажыдаардын сол жана оң кыймылы жөнүндө унутууга болбойт, туурабы? Экинчи кадамга секирели!

  1. Adobe Illustrator файлдарын (.ai) жүктөп алып, лазердик кесүүчү машинанын жардамы менен басып чыгарыңыз.

    1. leftRightBoxWithPlatforms.ai картонго басылышы керек.
    2. armTurner.ai файлы 3 мм коюу материалда басылышы керек.
  2. 3D басып чыгаруу файлдарын (.stl) жүктөп алып, аларды басып чыгаруу үчүн сүйүктүү 3D принтериңизди колдонуңуз.

    Эки колду басып чыгарганыңызды текшериңиз! Бул жерде түстүн мааниси жок

  3. Эки платформаны 3 -сүрөттө көрсөтүлгөндөй ысык клей менен чогултуп алыңыз.
  4. Кутуну чогулт. Муну жасоо татаал болсо да, ага жетүү оңой:

    1. Кутунун эки жагындагы эки чоң тешиктин ортосуна эки платформаны салуу.
    2. Биринчи колду үстүнкү платформанын үстүнө коюу.
    3. Кол айлангычты кол аркылуу, анан үстүнкү платформадан өткөрүү.
    4. Экинчи колду астыңкы платформанын үстүнө коюу.
    5. Кол айлангычты экинчи кол менен, андан кийин астынкы платформа аркылуу өтүү.
    6. Колдун айлануусун 3D басылган кол бургучтун тик бурчтуу тешиги аркылуу жабыштыруу.
    7. Турниктин экинчи учу servo мотордун үстүнө барат.
    8. Үстүнкү, астыңкы жана арткы бөлүктөрдү кутуга кошуңуз.

Сиздин акыркы чогултулган кутуңуз алтынчы сүрөттө окшош болушу керек. Эми муну дагы эки жолу кайталашыңыз керек!

Бул кадамдын аягында сизде үчтөн жогору/ылдый жана солго/оңго кыймыл системалары бар алты куту болушу керек.

3 -кадам: Денени кармап… КАНТИП?

Денени кармап… КАНТИП?
Денени кармап… КАНТИП?

Жакшы суроо! Мына ошол кезде 3D басып чыгарылган ийкемдүү кармагычтар кирет. Камтылган.stl файлын жүктөп алып, 3D принтер аркылуу басып чыгарыңыз. 6 түрдүү кутуга жалпысынан 6 кармагычты басып чыгарууну унутпаңыз.

Эгерде сиз жогорудагы кармагычтын сүрөтүн көргөн болсоңуз, сюрприз талкаланган - бул биздин Синусе ажыдаардын түсү!

4 -кадам: Бирок бул кутулар анча сулуу эмес …

А мен макулмун! Мына ошондуктан биз лазердик кескичти колдонуп, ошол кутучалардын баарын камтыган жана жашыра турган бир кыйла жагымдуу кутучаны кесебиз.

Ошол Adobe Illustrator файлдарын жүктөп алып, лазер кескичтин жардамы менен кесип салыңыз. Булуттардын дизайнын катышуучулардын бири кол менен тарткан. Аларды иллюстратор файлынын ичинен алып салып, өзүңүз каалагандай кылып өзүңүздүн дизайныңызды кошуп, өзгөртүүнү каалаңыз! Төмөндө баарын бириктирүү үчүн сунушталган кадамдар.

  1. Биринчи файлдан (tashqiBoxFinal_1) үч бөлүктү чогултуп, чаптаңыз.
  2. Экинчи файлдагы бөлүктү (тышкыBoxFinal_2) азырынча кошпоңуз.
  3. Үчүнчү файлдан (tashqiBoxFinal_3) кутучанын түбүнө бөлүгүн коюңуз, ал жогору жакта жабылышы керек. КУТТУКТУН түбүнө гана чаптаңыз.
  4. InnerBoxesPlatformду эки жолу басып чыгарыңыз. Ичинде чоң төрт бурчтуу тешиктери бар эки бөлүктү жабыштырыңыз. Андан кийин, калган үч бөлүгүн бириктиргиле. Акырында, тешиктери бар башка чапталган топтомго чаптаңыз.
  5. Платформаны чоң кутунун түбүнө коюңуз.
  6. Бардык 6 кичинекей кутучаны аянтчанын тиешелүү жерлерине салыңыз.
  7. Эми, экинчи файлдагы бөлүктү (тышкыBoxFinal_2) кутунун үстүнө коюп, четине клей салыңыз. Үстүнкү бөлүктөгү тешиктер кичинекей кутучалардын тешиктерине дал келиши керек. Болбосо, кичинекей кутуларыңызды иретке келтириңиз. Кичирээк кутучаларга таптакыр клей кошпоңуз.
  8. Эгерде сиз түбүндө жабышкак бөлүгү бар нан тактасын колдонуп жатсаңыз, анда муну түбүнүн ортосуна жакын жайгаштырыңыз, аны кутучаны жапканыңызда, нан табакчасы фотондор менен бирге жок болуп кетиши керек. Фотондорго сырттан туташууну жеңилдетүүчү төмөнкү бөлүктө кичинекей тешиктер бар.

5 -кадам: Slinky Toys ?? Ой, менин

Slinky Toys ?? Ой, менин!
Slinky Toys ?? Ой, менин!
Slinky Toys ?? Ой, менин!
Slinky Toys ?? Ой, менин!

Ажыдаардын денеси:

1. Ыссык клей же скотч менен үч лакты бириктириңиз.

2. Slinkies узундугу жана диаметри өлчөө жана кооздук кездеменин бир бөлүгүн кесип.

3. Ткандын эки учун алып келип, тигип коюңуз.

4. Аларды тигип бүткөндөн кийин, байпак сыяктуу слинкилерди жылдырыңыз.

5. Жалбырактын учтарын тигилген кездемеге тигүү.

6 -кадам: Ажыдаарыңызды басып чыгарыңыз

Ажыдаардын 3D басылган бөлүктөрү:

1. Бөлүктөр https://www.thingiverse.com/thing:854575 дарегинен алынды.

2. Биз башты, бутту жана көздү гана колдондук.

3. Бөлүктү 3D басып чыгаргандан кийин, аны зымырак жана ацетон менен тегиздеңиз.

4. Бөлүктөрдү өзүңүз каалагандай кылып кооздоңуз.

7 -кадам: NeoPixels менен ажыдаарыңызды көтөрүү убактысы

NeoPixels менен ажыдаарыңызды көтөрүүгө убакыт келди!
NeoPixels менен ажыдаарыңызды көтөрүүгө убакыт келди!
NeoPixels менен ажыдаарыңызды көтөрүүгө убакыт келди!
NeoPixels менен ажыдаарыңызды көтөрүүгө убакыт келди!

Жарык сегмент:

1. Сиз кааласаңыз, жарыкты түзүү үчүн неопикселдик жипти колдонсоңуз болот. (Биз жиптер түгөндү).

2. Биз 20 неопиксель жарыгын колдонуп, аларды зымдар аркылуу туташтырдык. Бул зымдар аларга ширетилип, ажыдаардын темасына дал келиши үчүн кызыл зым аркылуу фотонго туташтырылган.

3. Ошондой эле неопиксель жарыктарын узун кездемеге тигип койсоңуз болот, бирок бизде металлдан жасалган жалтырак болгондуктан аларды колдонгон жокпуз.

Бөлүктөрдү чогултуу: жиптерди же зымдарды колдонуп, ажыдаардын денесиндеги жарык сегментин бекиңиз. Жарыктарды базалык кутунун ичиндеги фотонго туташтыра алаарыңызды текшериңиз. Башты, буттарды жана куйрукту клей менен денеге бекиңиз. Алар ордунда болгондон кийин, денени биз мурда басып чыгарган ийкемдүү кармагычтарга бекиткиле. Азыр дене программалоого даяр.

8 -кадам: Программалоо убактысы

Биз алты бөлүкчө фото мотор менен иштөө үчүн эки бөлүкчө фотонду колдоно тургандыктан (бир фотон төртөө менен гана иштей алат), биз микроконтроллерлерге чагылдыруу үчүн эки башка, бирок окшош коддорду жазабыз.

Эми, биринчи микроконтроллер үчүн…

Arduino файлында (.ino), төмөнкү китепканаларды камтыйт жана аныктайт:

#"neopixel.h" кошуу

#"ArduinoJson.h" кошуу

#аныктоо PIXEL_PIN D4

#аныктоо PIXEL_COUNT 18

Кийинки, төмөнкү өзгөрмөлөрдү жарыялоо:

Adafruit_NeoPixel тилкеси = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN);

Servo servoLeftRight_1; Servo servoUpDown_1; Servo servoLeftRight_2; Servo servoUpDown_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 bufferSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJEC_SIZE (4) + JSON_OBJEC_SIZE (4) + JSON_OBJEC_SIZE 390; const size_t bufferSizeForecast = 38*JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2*JSON_OBJECT_SIZE (0) + 112*JSON_OBJEC_SIZE (1) + 39*JSON_OBJECE_SIZ_2 (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; float temperatureArray [3]; float moistArray [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Webhooksту кантип орнотууну билүү үчүн бул жерди басыңыз. Бүткөндөн кийин, төмөнкү декларацияларды жана функцияларды кошуп, керек болсо тиешелүү өзгөртүүлөрдү киргизиңиз:

жараксыз getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Таймер timerWeatherForecast (60000, getWeather5DayForecast); жараксыз getCurrentWeather () {Particle.publish ("get_currentWeather"); } Таймер timerWeatherCurrent (60000, getCurrentWeather);

Төмөнкү функциялар ажыдаардын өйдө/ылдый жана солго/оңго кыймылын көзөмөлдөйт:

жараксыз өзгөртүүLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; if (positionLeftRight_1> 100) {leftRight_1 = 0; }} башка {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; }} башка {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1]; if (positionLeftRight_2 <0) {leftRight_2 = 1; }} servoLeftRight_2.write (positionLeftRight_2); }

жараксыз өзгөртүүUpDown1 () {

if (upDown_1) {positionUpDown_1 ++; if (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} башка {positionUpDown_1--; if (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }

жараксыз өзгөртүүUpDown2 () {

if (upDown_2) {positionUpDown_2 ++; if (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} башка {positionUpDown_2--; if (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }

Кыймылдарды интервалда өзгөртө алуу үчүн таймерлер түзүлөт.

Таймер timerLeftRight1 (100, changeLeftRight1);

Таймер timerLeftRight2 (100, changeLeftRight2); Таймер timerUpDown1 (10, changeUpDown1); Таймер timerUpDown2 (10, changeUpDown2);

Орнотуу функциясы акыры кийинки кошулат. Webhooks менен алектенген коддорго тиешелүү өзгөртүүлөрдү киргизүүнү унутпаңыз.

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) servo кызматын инициализациялоо; // servoLeftRight_2.write (servoLeftRight_2) кызматын баштоо // servoUpDown_2.write (positionUpDown_2) servo кызматын инициализациялоо; // servo кызматын инициализациялоо timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Serial.begin (9600) консолун ачуу; кечигүү (2000); Serial.println ("Салам!"); // Get_weather5DayForecast жазылыңыз жана get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Бул долбоор үчүн цикл функциясы колдонулбайт. Webhooksтен алынган маалыматтарды иштетүү функцияларын унутпайбыз!

void gotWeather5DayForecast (const char *окуя, const char *data) {allData5DaysForecast += маалыматтар; // бардык маалыматтарды бир сапка сактайт. int allData5DaysForecastLen = allData5DaysForecast.length (); char буфер [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (буфер, allData5DaysForecastLen + 1); // int bufferLength = sizeof (буфер) сабы үчүн буфер түзүү; DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (буфер); // Талдоо ийгиликтүү болгонун текшериңиз. if (! root.success ()) {//Serial.println("5 күндүк аба ырайын талдоо… КАТА! "); кайтуу; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; сүзүү температурасы = main ["temp"]; int нымдуулук = негизги ["нымдуулук"]; JsonObject & weather = currentObject ["weather"] [0]; const char* weatherInfo = аба ырайы ["негизги"]; float windSpeed = currentObject ["wind"] ["speed"]; 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; moistArray = нымдуулук; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = убакыт белгиси; i ++; } else {break; }}}

void gotCurrentWeatherData (const char *event, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (маалыматтар); // Талдоо ийгиликтүү болгонун текшериңиз. if (! root.success ()) {//Serial.println("Азыркы аба ырайы үчүн талдоо… КАТА! "); кайтуу; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = аба ырайы ["негизги"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = негизги ["нымдуулук"]; float wind_speed = root ["wind"] ["speed"]; const char* timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (weather_main, 0); weatherArray [0] = аба ырайы_башы; temperatureArray [0] = tempFah; moistArray [0] = main_humidity; windSpeedArray [0] = шамалдын ылдамдыгы; timestampArray [0] = убакыт белгиси; }

Төмөндө сиз servo моторлордун позицияларын жаңыртууну, температуранын Келвинден Фаренгейтке которулушун жана Светодиоддордун түстөрүн орнотууну көзөмөлдөгөн кошумча функцияларды таба аласыз.

int updateUpDown (калкып жүрүүчү темп) {// Даражаны [0, 180] диапазонуна картага коюңуз servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("жаңы servo даражасы:"); Serial.println (servoMaxDegree); кайтаруу servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Шамалдын ылдамдыгын [1, 100] калкып жүрүүчү servoIncrement = windSpeed * 99/26 + 1 диапазонуна картаңыз; Serial.print ("жаңы servo increment value:"); Serial.println (servoIncrement); return servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67; кайтаруу tempFah; }

void setColor (String weatherDesc, int index) {

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") {// сары үчүн (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // сары тилке.show (); кечигүү (20); }} else if (weatherDesc == "Clouds") {// grey for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // боз тилке.show (); кечигүү (20); }} else if (weatherDesc == "Snow") {// white for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // ак тилке.show (); кечигүү (20); }} else if (weatherDesc == "Rain") {// blue for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // көк тилке.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 файлыңызга кошкондон кийин, аны түзүңүз. Эгерде каталар жок болсо, анда биринчи Photonго кодду жаркылдатыңыз. Кийинки кадам сизге экинчи Photonдо жаркырай турган окшош кодду берет.

9 -кадам: Программалоо уланууда

Экинчи Фотондун коду биринчисинин коду менен дээрлик окшош болгондуктан, бүт код көчүрүлүп, төмөндө чапталган:

#"ArduinoJson.h" кошуу

Servo servoLeftRight_3;

Servo servoUpDown_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 (5) + JSON_ (J)

const size_t bufferSizeForecast = 38*JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2*JSON_OBJECT_SIZE (1) + 112*JSON_OBJEC_SIZ_ (2) (5) + 76*JSON_OBJECT_SIZE (8) + 12490;

String weatherArray [3];

float temperatureArray [3]; float moistArray [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String allData5DaysForecast;

Void getWeather5DayForecast ()

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

Таймер timerWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 мс = 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; }} башка {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); }

Таймер timerLeftRight3 (100, changeLeftRight3);

Таймер timerUpDown3 (10, changeUpDown3);

жараксыз орнотуу () {

// аба ырайы таймерлерин баштоо timerWeatherForecast.start (); timerWeatherCurrent.start (); // pinMode сыяктуу инициализацияны коюп, функцияларды ушул жерден баштаңыз. // Micro Servo servoLeftRight_3.attachти орнотуу (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // servo абалын баштоо

servoUpDown_3.write (positionUpDown_3); // servo абалын баштоо

timerLeftRight3.start ();

timerUpDown3.start (); // Serial.begin (9600) консолун ачуу; кечигүү (2000); Serial.println ("Салам!"); // Get_weather5DayForecastке жазылыңыз жана get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast2", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather2/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

void gotWeather5DayForecast (const char *окуясы, const char *маалыматы)

{allData5DaysForecast += маалыматтар; // бардык маалыматтарды бир сапка сактайт. int allData5DaysForecastLen = allData5DaysForecast.length (); char буфер [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 күндүк аба ырайын талдоо… КАТА! "); кайтуу; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; сүзүү температурасы = main ["temp"]; int нымдуулук = негизги ["нымдуулук"]; JsonObject & weather = currentObject ["weather"] [0]; const char* weatherInfo = аба ырайы ["негизги"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (температура); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; moistArray = нымдуулук; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = убакыт белгиси; i ++; } else {break; }}}

void gotCurrentWeatherData (const char *окуясы, const char *маалыматы)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (маалыматтар); //Serial.println(data); // Талдоо ийгиликтүү болгонун текшериңиз. if (! root.success ()) {//Serial.println("Азыркы аба ырайы үчүн талдоо… КАТА! "); кайтуу; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = аба ырайы ["негизги"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = негизги ["нымдуулук"]; float wind_speed = root ["wind"] ["speed"]; const char* timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; weatherArray [0] = аба ырайы_башы; temperatureArray [0] = tempFah; moistArray [0] = main_humidity; windSpeedArray [0] = шамалдын ылдамдыгы; timestampArray [0] = убакыт белгиси; }

int updateUpDown (калкып жүрүүчү темп) {

// Даражаны [0, 180] диапазонунда картага коюңуз servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("жаңы servo даражасы:"); Serial.println (servoMaxDegree); кайтаруу servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Шамалдын ылдамдыгын [1, 100] калкып жүрүүчү servoIncrement = windSpeed * 99/26 + 1 диапазонуна картаңыз; Serial.print ("жаңы servo increment value:"); Serial.println (servoIncrement); return servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67; кайтаруу tempFah; }

Сен кылдың! Сиз долбоордун программалоо бөлүмүнөн өттүңүз! Эми, электр өткөргүчтөрүнөн жана неопикселдерден нанга жана микроконтроллерлерге бардык зымдарды жана байланыштарды жасоону унутпаңыз. ЭСКЕРТҮҮ: дененин сол жана оң кыймылдары үчүн кутулардагы вертикалдуу тешиктер аркылуу кошумча дублерди/таякчаларды салыңыз. Башка учу ажыдаардын денесине туташтырылышы керек.

10 -кадам: Ажыдаарыңыздан ырахат алыңыз

Куттуктайм! Сине-эсе ажыдаарды баштан баштап курдуңуз! Эми болгону сиз отуруп, айланаңыздагы дисплейден ырахат алууңуз керек!

ЭСКЕРТҮҮ: Бул долбоор Жоан Бемпонг менен Саундария Мутувелдин курстук бөлүгү катары курулган. Курстун баракчасын бул жерден тапса болот.

Сунушталууда: