Բովանդակություն:

Sine-ese Dragon: 10 քայլ (նկարներով)
Sine-ese Dragon: 10 քայլ (նկարներով)

Video: Sine-ese Dragon: 10 քայլ (նկարներով)

Video: Sine-ese Dragon: 10 քայլ (նկարներով)
Video: Չէ ինձ ով կարա ծեծի😂👊 2024, Հուլիսի
Anonim
Sine-ese Dragon
Sine-ese Dragon

Sine-ese Dragon- ը տան դեկոր է, որն օգտագործում է մեխանիկական շարժումներ և լույսեր, որոնք ձեզ կասեն եղանակի կանխատեսումը հաջորդ երեք ժամվա ընդմիջումների համար: Ըստ սահմանման, շրջապատը նկարագրում է ինչ -որ բանի անմիջական շրջապատը. ուստի որոշվեց, որ տեղին է եղանակի տվյալները ներառել շրջապատող էկրանին: Եղանակը մի ասպեկտ է, որն ակամա փոխում է մարդկանց օրը և տեղեկատվության մի կտոր է, որն անընդհատ փոխվում է ամեն րոպե, կամ նույնիսկ մինչև երկրորդը:

Չինական վիշապը «ուժի, ուժի և հաջողության խորհրդանիշ է» և հաճախ պահվում է բարձր մշակութային և ավանդական արժեքով Ասիական թերակղզում: Բացի բախտ բերելուց, չինական վիշապը նաև ունի հզոր ուժեր, որոնք վերահսկում են «ջուրը, անձրևները, թայֆուններն ու ջրհեղեղները»: Ի վերջո, չինական վիշապը նպատակահարմար համարվեց ներկայացնել եղանակի տվյալները:

Տեսողականացում

Sine-ese Dragon- ը շահագործվում է վեց հիմնական կետերում `երեք առանձին հատվածներում, որոնք ներկայացնում են եղանակի կանխատեսումը երեք 3 ժամ տևողությամբ: Յուրաքանչյուր 3-ժամյա ընդմիջման համար ներառվելու են հետևյալ տեղեկությունները.

  • Եղանակի նկարագրություն - որոշում է ընթացիկ եղանակի տեղեկատվության գույնը:
  • Temերմաստիճանը - սահմանում է մարմնի բարձրությունը
  • Խոնավություն - LED հատվածների թարթում
  • Քամու արագություն - վերահսկում է ձախ և աջ մարմնի շարժման արագությունը:

Պահանջվող նյութեր

  1. 3 մմ նրբատախտակ/Ստվարաթուղթ
  2. 5 մմ փայտե dowels կամ chopsticks
  3. 2 մասնիկի ֆոտոն
  4. 3 Slinky խաղալիքներ
  5. 6 servo շարժիչ
  6. NeoPixel լույսեր (կամ թել կամ առանձին լույսեր, որոնք կարված են միասին)
  7. Շատ սուպեր սոսինձ
  8. Հաղորդիչ թել
  9. Ակրիլային ներկ
  10. Դեկորատիվ հյուսվածք
  11. Լազերային կտրիչ
  12. 3D տպիչ

Քայլ 1: Վեր և վար:

Վեր ու վար!
Վեր ու վար!
Վեր ու վար!
Վեր ու վար!
Վեր ու վար!
Վեր ու վար!

Ձեր առաջին քայլը Sine-ese Dragon- ի կառուցման համար այն բաղադրիչի կառուցումն է, որը վերահսկում է մարմնի վեր ու վար շարժումը: Որքա excitingն հուզիչ:

  1. Ներբեռնեք Adobe Illustrator ֆայլերը (.ai) և տպեք դրանք լազերային կտրիչ մեքենայի միջոցով:

    upDownBoxWithPlatform.ai- ը պետք է տպվի ստվարաթղթի վրա:

  2. Ներբեռնեք 3D տպման ֆայլերը (.stl) և դրանք տպելու համար օգտագործեք ձեր նախընտրած 3D տպիչը:

    Սկավառակի կամ սկավառակի պտույտի համար գույնը նշանակություն չունի: Երկրորդ նկարում սկավառակի պտույտը տեղադրված է սկավառակի անցքի ներսում:

  3. Հավաքեք առաջին երկու բաղադրիչները և դրանք սոսնձեք, ինչպես ցույց է տրված 3 -ից 5 -րդ նկարներում:

    1. Հարթակը
    2. Սկավառակի համար նախատեսված ակոսներ
  4. Այժմ հավաքեք տուփը ՝ հետևելով ստորև նշված խորհուրդներին:

    1. Servo- ի լարերը պետք է անցնեն տուփի կողքի ուղղանկյուն բացվածքով:
    2. Սկավառակի պտույտի ամենակարճ ծայրը ամրացվում է servo գլխին, իսկ ավելի երկար ծայրը անցնում է տուփի մյուս կողմի անցքով, որի վրա շրջանաձև անցք կա: Սա ցուցադրված է նկար 6 -ում:
  5. Այժմ մեզ ինչ -որ բան պետք է `ապահովելու համար, որ սկավառակը շրջվի, երբ հարթակը մնում է հարթ: Կտրեք փայտիկը 75 մմ երկարությամբ ձողերի մեջ (նկար 7) և դրանք սոսնձեցրեք տուփի վերևի հարթակի վերևում ՝ օգտագործելով տաք սոսինձ: Համոզվեք, որ ձողերը 90 աստիճանով հարթեցված են հարթակին:
  6. Տեղադրեք 212 մմ երկարությամբ փայտ, տուփի վերևի միջին անցքի մեջ հարթակի վրա:

Անուշ! Այժմ դուք ունեք ամբողջական տուփ (նկար 8) վիշապի վեր ու վար շարժման համար: Այժմ, կրկնեք վերը նշված քայլերը ևս երկու անգամ:

Քայլ 2: Ինչ վերաբերում է ձախին և աջին:

Ինչ վերաբերում է ձախին և աջին
Ինչ վերաբերում է ձախին և աջին
Ինչ վերաբերում է ձախին և աջին
Ինչ վերաբերում է ձախին և աջին
Ինչ վերաբերում է ձախին և աջին
Ինչ վերաբերում է ձախին և աջին
Ինչ վերաբերում է ձախին և աջին
Ինչ վերաբերում է ձախին և աջին

Հիմա, մենք չե՞նք կարող մոռանալ Sine-ese Dragon- ի ձախ և աջ շարժումների մասին: Եկեք անցնենք երկրորդ քայլին:

  1. Ներբեռնեք Adobe Illustrator ֆայլերը (.ai) և տպեք դրանք լազերային կտրող մեքենայի միջոցով:

    1. leftRightBoxWithPlatforms.ai- ը պետք է տպվի ստվարաթղթի վրա:
    2. armTurner.ai ֆայլը պետք է տպվի 3 մմ հաստությամբ նյութի վրա:
  2. Ներբեռնեք 3D տպման ֆայլերը (.stl) և օգտագործեք ձեր նախընտրած 3D տպիչը `դրանք տպելու համար:

    Համոզվեք, որ տպել եք երկու թևերը: Այստեղ գույնը նշանակություն չունի:

  3. Հավաքեք երկու հարթակները միասին, ինչպես ցույց է տրված նկար 3 -ում ՝ օգտագործելով տաք սոսինձ:
  4. Միացրեք տուփը: Թեև դա կարող է դժվար լինել, բայց ավելի հեշտ է հասնել դրան ՝

    1. Տեղադրեք երկու հարթակները տուփի երկու կողմերում գտնվող երկու մեծ ճեղքերի միջև:
    2. Առաջին թևը տեղադրելով վերին հարթակի վերևում:
    3. Ձեռքի պտույտը թեքեք թևի միջով, այնուհետև վերին հարթակը:
    4. Երկրորդ թևը տեղադրելով ներքևի հարթակի վերևում:
    5. Թևը պտտեցրեք երկրորդ թևի միջոցով, այնուհետև ներքևի հարթակի միջով:
    6. Ձեռքի պտտիչը կպցրեք եռաչափ տպված ձեռքի պտտիչի ուղղանկյուն բացվածքի միջով:
    7. Շրջադարձի մյուս ծայրը անցնում է servo շարժիչի վերևում:
    8. Տուփին ավելացրեք վերին, ստորին և հետևի մասերը:

Ձեր վերջնական հավաքված տուփը պետք է նմանվի վեցերորդ նկարի: Այժմ, դուք պետք է կրկնեք դա ևս երկու անգամ:

Այս քայլի ավարտին դուք պետք է ունենաք վեց տուփ, որոնցից յուրաքանչյուրը երեքն են ՝ վեր/վար և ձախ/աջ շարժման համակարգերից յուրաքանչյուրը:

Քայլ 3. Մարմինը բարձր պահելը … ԻՆՉՊԵՍ:

Մարմինը պահելը… ԻՆՉՊԵ՞Ս
Մարմինը պահելը… ԻՆՉՊԵ՞Ս

Լավ հարց է! Դա այն ժամանակ է, երբ գալիս են այդ 3D տպագրված slinky կրիչները: Ներբեռնեք ներառված.stl ֆայլը և տպեք այն 3D տպիչի միջոցով: Համոզվեք, որ 6 տարբեր տուփերի համար տպեք ընդհանուր առմամբ 6 պահարան:

Եթե տեսել եք վերևի անփայլ բռնիչի նկարը, անակնկալը փչացել է. Դա մեր Sine -ese Dragon- ի գույնն է:

Քայլ 4: Բայց այդ տուփերն այնքան էլ գեղեցիկ չեն…

Եվ ես համաձայն եմ! Ահա թե ինչու մենք պատրաստվում ենք լազերային դանակով կտրել շատ ավելի գրավիչ տուփ ՝ այդ բոլոր տուփերը պարունակելու և դրանք թաքցնելու համար:

Ներբեռնեք այդ Adobe Illustrator ֆայլերը և կտրեք դրանք լազերային դանակի միջոցով: Ամպերի դիզայնը ձեռքով գծել է մասնակիցներից մեկը: Ազատորեն փոփոխեք դրանք ՝ դրանք հանելով պատկերազարդող ֆայլի ներսում և ավելացնելով ձեր սեփական դիզայնը ՝ ըստ ձեր հայեցողության: Ստորև ներկայացված են ամեն ինչ միացնելու առաջարկվող քայլերը:

  1. Հավաքեք և կպցրեք բոլոր երեք կտորները առաջին ֆայլից (outerBoxFinal_1) միասին:
  2. Երկրորդ ֆայլից (outerBoxFinal_2) կտորը դեռ մի ավելացրեք:
  3. Երրորդ ֆայլից (outerBoxFinal_3) կտորը դրեք տուփի ներքևում, և այն պետք է փակվի վերևում: Կպչեք ՄԻԱՅՆ տուփի ներքևում:
  4. Երկու անգամ տպեք ներքին արկղերը: Սոսնձեցրեք երկու կտորները, որոնցում կան մեծ ուղղանկյուն անցքեր: Այնուհետև կպցրեք մնացած մասերից երեքը միասին: Ի վերջո, կպցրեք այն մյուս սոսնձված հավաքածուին ՝ դրանց մեջ անցքերով:
  5. Տեղադրեք հարթակը մեծ տուփի ներքևում:
  6. Տեղադրեք բոլոր 6 փոքր տուփերը հարթակում գտնվող իրենց համապատասխան բծերի մեջ:
  7. Այժմ տեղադրեք կտորը երկրորդ ֆայլից (outerBoxFinal_2) տուփի վերևում և սոսնձեք եզրին: Վերին մասի անցքերը պետք է համահունչ լինեն փոքր արկղերի վրայի անցքերին: Եթե ոչ, վերադասավորեք ձեր փոքր տուփերը: Փոքր արկղերին ընդհանրապես սոսինձ մի ավելացրեք:
  8. Եթե դուք օգտագործում եք տախտակ, որը ներքևում կպչուն կտոր ունի, տեղադրեք այն ներքևի մասի կենտրոնի մոտ մի վայրում, որտեղ տուփը փակելիս ֆոտոնների հետ միասին հացաթուղթը պետք է անհետանա: Ներքևի մասում կան փոքր ճեղքեր, որոնք ձեզ համար ավելի հեշտ են դարձնում արտաքինից միանալու ֆոտոններին:

Քայլ 5: Slinky Խաղալիքներ ԱԽ իմ

Slinky Խաղալիքներ ?? ԱԽ իմ!
Slinky Խաղալիքներ ?? ԱԽ իմ!
Slinky Խաղալիքներ ?? ԱԽ իմ!
Slinky Խաղալիքներ ?? ԱԽ իմ!

Վիշապի մարմին.

1. Միացրեք երեք սլաքներ `օգտագործելով տաք սոսինձ կամ ժապավեն:

2. Չափել սլաքների երկարությունը և տրամագիծը և կտրել դեկորատիվ կտորի մի կտոր:

3. Բերեք գործվածքների երկու ծայրերը եւ կարեք դրանք միասին:

4. Ավարտելուց հետո դրանք կարեք, գուլպաների պես սահեցրեք դրանք:

5. Կարիքի ծայրերը կարել կարված գործվածքին:

Քայլ 6: Տպեք ձեր վիշապին:

Վիշապի 3D տպագիր մասեր.

1. Մասերը վերցված են https://www.thingiverse.com/thing:854575 կայքից:

2. Մենք օգտագործում էինք միայն գլուխը, ոտքերը և աչքերը:

3. Մասը 3D տպելուց հետո հարթեցրեք այն հղկաթղթի և ացետոնի միջոցով:

4. Ներկեք մասերը այնպես, ինչպես ցանկանում եք այն զարդարել:

Քայլ 7: NeoPixels- ով ձեր վիշապին ուժեղացնելու ժամանակը:

Timeամանակն է ուժեղացնել ձեր վիշապին NeoPixels- ով
Timeամանակն է ուժեղացնել ձեր վիշապին NeoPixels- ով
Timeամանակն է ուժեղացնել ձեր վիշապին NeoPixels- ով
Timeամանակն է ուժեղացնել ձեր վիշապին NeoPixels- ով

Լուսային հատված.

1. youանկության դեպքում դուք կարող եք պարզապես օգտագործել նեոպիքսելային թել ՝ լույսերը ստեղծելու համար: (Մենք վերջացանք թելերը):

2. Մենք օգտագործեցինք 20 նեոպիքսելային լույսեր և դրանք միացրեցինք լարերի միջոցով: Այս լարերը կպցվեցին դրանց վրա և միացվեցին ֆոտոնին `օգտագործելով կարմիր լարեր, որպեսզի այն համապատասխանի վիշապի թեմային:

3. Կարող եք նաև ձեր նեոպիքսելային լույսերը կարել երկար կտորի վրա, բայց մենք դրանք չօգտագործեցինք, քանի որ ունեինք մետաղից պատրաստված սլիկին:

Մասերի հավաքում. Ամրացրեք վիշապի մարմնի ներսում լուսային հատվածը `օգտագործելով թելեր կամ լարեր: Համոզվեք, որ կարող եք լույսերը միացնել ֆոտոնին հիմնական տուփի ներսում: Կպչեք գլուխը, ոտքերը և պոչը մարմնին, օգտագործելով սոսինձ: Երբ դրանք տեղում լինեն, ամրացրեք մարմինը նախապես տպած մերկապարանների մեջ: Այժմ մարմինը պատրաստ է ծրագրավորման:

Քայլ 8: mingրագրավորման ժամանակը:

Քանի որ մենք կօգտագործենք երկու մասնիկի ֆոտոն `վեց առանձին servo շարժիչներով աշխատելու համար (մեկ Photon- ը կարող է աշխատել միայն չորսով), մենք կգրենք երկու առանձին, բայց նմանատիպ կոդեր, որոնք պետք է լուսավորվեն միկրոկառավարիչների վրա:

Այժմ, առաջին միկրոկոնտրոլերի համար…

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 ձախRight_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) 390; const 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]; բոց ջերմաստիճանԱրեյ [3]; float խոնավությունArray [3]; float windSpeedArray [3]; Լարային ժամանակային կնիքԱրեյ [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; Լարային allData5DaysForecast;

Կտտացրեք այստեղ ՝ վեբ -կեռիկներ տեղադրելու սովորելու համար: Ավարտելուց հետո ավելացրեք հետևյալ հայտարարագրերն ու գործառույթները և անհրաժեշտության դեպքում կատարեք համապատասխան փոփոխություններ.

անվավեր getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Timամաչափի ժամանակաչափWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } Ժամաչափ timerWeatherCurrent (60000, getCurrentWeather);

Հետևյալ գործառույթները վերահսկում են վիշապի վեր/վար և ձախ/աջ շարժումները.

անվավեր changeLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; եթե (positionLeftRight_1> 100) {leftRight_1 = 0; }} else {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; եթե (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }

անվավեր փոփոխությունLeftRight2 () {

եթե (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1]; եթե (positionLeftRight_2> 100) {leftRight_2 = 0; }} else {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1]; եթե (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); }

անվավեր փոփոխությունUpDown2 () {

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); }

Որպեսզի կարողանանք միջակայքում փոխել շարժումները, ստեղծվում են ժամաչափեր:

Erամաչափի ժամաչափLeftRight1 (100, changeLeftRight1);

Erամաչափի ժամաչափLeftRight2 (100, changeLeftRight2); Ժմչփ timerUpDown1 (10, changeUpDown1); Erամաչափի ժամաչափUpDown2 (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); // նախաստորագրել servo դիրքը servoLeftRight_2.write (positionLeftRight_2); // սկզբնականացնել սերվոյի դիրքը servoUpDown_2.write (positionUpDown_2); // սկզբնականացնել servo position 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 (); }

Այս նախագծի համար օղակի գործառույթը չի օգտագործվում: Մենք չենք կարող մոռանալ վեբհուքերից ստացված տվյալների մշակման գործառույթները:

void gotWeather5DayForecast (const char *իրադարձություն, const char *տվյալներ) {allData5DaysForecast += տվյալներ; // պահում է բոլոր տվյալները մեկ տողում: int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (բուֆեր, allData5DaysForecastLen + 1); // ստեղծել բուֆեր տողի համար int bufferLength = sizeof (բուֆեր); DynamicJsonBuffer jsonBufferWeather (բուֆերային երկարություն); JsonObject & root = jsonBufferWeather.parseObject (բուֆեր); // Փորձարկեք, եթե վերլուծությունը հաջողվի: եթե (! root.success ()) {//Serial.println(" Եղանակի վերլուծություն 5 օրվա կանխատեսման համար … ՍԽԱԼ! "); վերադարձ; } int i = 1; JsonArray & list = արմատ ["ցուցակ"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; բոց ջերմաստիճան = հիմնական ["ջերմաստիճան"]; int խոնավություն = հիմնական ["խոնավություն"]; 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; խոնավությունԱրեյ = խոնավություն; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; i ++; } else {ընդմիջում; }}}

void gotCurrentWeatherData (const char *իրադարձություն, const char *տվյալներ) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (տվյալներ); // Փորձարկեք, եթե վերլուծությունը հաջողվի: եթե (! root.success ()) {//Serial.println(" Ընթացիկ եղանակի վերլուծում … ՍԽԱԼ! "); վերադարձ; } JsonObject & weather = արմատ ["եղանակ"] [0]; const char* weather_main = weather ["main"]; JsonObject & main = արմատ ["հիմնական"]; float main_temp = main ["temp"]; int main_humidity = հիմնական ["խոնավություն"]; float wind_speed = արմատ [«քամի»] [«արագություն»]; const char* timestamp = արմատ ["dt_txt"]; int tempFah = convertToFahrenheit (հիմնական_տեմպ); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (եղանակային_ գլխավոր, 0); weatherArray [0] = եղանակի հիմնական; temperatureArray [0] = tempFah; խոնավության զանգված [0] = հիմնական_խոնավություն; windSpeedArray [0] = քամու_ արագություն; timestampArray [0] = timestamp; }

Ստորև կարող եք գտնել լրացուցիչ գործառույթներ, որոնք վերահսկում են servo շարժիչների դիրքերի թարմացումը, ջերմաստիճանի փոխարկումը Kelvin- ից Fahrenheit և LED- ների գույնի կարգավորումը:

int updateUpDown (float temp) {// Քարտեզագրեք աստիճանը մի շարք [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("նոր սերվոյի աստիճան."); Serial.println (servoMaxDeree); վերադարձ servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Քարտի արագության քարտեզավորում [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("servo հավելման նոր արժեք."); Serial.println (servoIncrement); վերադարձ servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67; վերադարձ tempFah; }

void setColor (String weatherDesc, int index) {

int ledIndex = 0; եթե (ինդեքս == 0) {ledIndex = 0; } else if (ինդեքս == 1) {ledIndex = 6; } else if (index == 2) {ledIndex = 12; } else {վերադառնալ; } 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); }} այլ դեպքում (weatherDesc == «Ձյուն») {// սպիտակ (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // սպիտակ շերտ. ցուցադրում (); ուշացում (20); }} այլ դեպքում (weatherDesc == "Անձրև") {// կապույտ (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // կապույտ շերտ. ցուցադրում (); ուշացում (20); }} else {// red for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // կարմիր strip.show (); ուշացում (20); }}}

Երբ ամեն ինչ ավելացվի ձեր Arduino ֆայլին, կազմեք այն: Եթե սխալներ չկան, շարունակեք և ծածկեք կոդը առաջին Photon- ին: Հաջորդ քայլը ձեզ կտրամադրի նմանատիպ ծածկագիր, որը կցուցադրվի երկրորդ Photon- ում:

Քայլ 9: mingրագրավորումը շարունակվում է

Քանի որ երկրորդ ֆոտոնի ծածկագիրը գրեթե նույնն է, ինչ առաջինը, ամբողջ ծածկագիրը պատճենվում և տեղադրվում է ստորև.

#ներառել «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 բուֆերԱզգացում

const 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];

բոց ջերմաստիճանԱրեյ [3]; float խոնավությունArray [3]; float windSpeedArray [3]; Լարային ժամանակային կնիքԱրեյ [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

Լարային allData5DaysForecast;

void getWeather5DayForecast ()

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

Erամաչափի ժամաչափWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 օր

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Erամաչափի ժամաչափWeatherCurrent (60000, getCurrentWeather);

անվավեր փոփոխությունLeftRight3 () {

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

անվավեր փոփոխությունUpDown3 () {

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); }

Erամաչափի ժամաչափLeftRight3 (100, changeLeftRight3);

Erամաչափի ժամաչափUpDown3 (10, changeUpDown3);

void setup () {

// սկսել եղանակի ժամաչափերը timerWeatherForecast.start (); timerWeatherCurrent.start (); // Տեղադրեք pinMode- ի նման սկզբնավորումը և սկսեք գործառույթները այստեղ: // Կարգավորեք Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3. կցել (D0);

servoLeftRight_3. գրել (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 *event, const char *data)

{allData5DaysForecast += տվյալներ; // պահում է բոլոր տվյալները մեկ տողում: int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (բուֆեր, allData5DaysForecastLen + 1); // ստեղծել բուֆեր տողի համար int bufferLength = sizeof (բուֆեր); DynamicJsonBuffer jsonBufferWeather (բուֆերային երկարություն); JsonObject & root = jsonBufferWeather.parseObject (բուֆեր); //Serial.println(allData5DaysForecast); // Փորձարկեք, եթե վերլուծությունը հաջողվի: եթե (! root.success ()) {//Serial.println(" Եղանակի վերլուծություն 5 օրվա կանխատեսման համար … ՍԽԱԼ! "); վերադարձ; } int i = 1; JsonArray & list = արմատ ["ցուցակ"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; բոց ջերմաստիճան = հիմնական ["ջերմաստիճան"]; int խոնավություն = հիմնական ["խոնավություն"]; 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; խոնավությունԱրեյ = խոնավություն; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; i ++; } else {ընդմիջում; }}}

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

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (տվյալներ); //Serial.println (տվյալներ); // Փորձարկեք, եթե վերլուծությունը հաջողվի: եթե (! root.success ()) {//Serial.println(" Ընթացիկ եղանակի վերլուծում … ՍԽԱԼ! "); վերադարձ; } JsonObject & weather = արմատ ["եղանակ"] [0]; const char* weather_main = weather ["main"]; JsonObject & main = արմատ ["հիմնական"]; float main_temp = main ["temp"]; int main_humidity = հիմնական ["խոնավություն"]; float wind_speed = արմատ [«քամի»] [«արագություն»]; const char* timestamp = արմատ ["dt_txt"]; int tempFah = convertToFahrenheit (հիմնական_տեմպ); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; weatherArray [0] = եղանակի հիմնական; temperatureArray [0] = tempFah; խոնավության զանգված [0] = հիմնական_խոնավություն; windSpeedArray [0] = քամու_ արագություն; timestampArray [0] = timestamp; }

int updateUpDown (բոց ջերմաստիճան) {

// Քարտեզագրեք աստիճանը մի շարք [0, 180] float servoMaxDegree = ջերմաստիճան * 45 /31 + (990 /31); Serial.print ("նոր սերվոյի աստիճան."); Serial.println (servoMaxDeree); վերադարձ servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Քարտի արագության քարտեզավորում [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("servo հավելման նոր արժեք."); Serial.println (servoIncrement); վերադարձ servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67; վերադարձ tempFah; }

Դու արեցիր դա! Դուք հասցրել եք ծրագրի ծրագրավորման բաժին: Այժմ, համոզվեք, որ բոլոր էլեկտրագծերը և միացումները servo շարժիչներից և նեոպիքսելներից մինչև տախտակ և միկրոկոնտրոլերներ: ՆՇՈՄ. Մարմնի ձախ և աջ շարժումների համար արկղերի ուղղահայաց ճեղքերի միջոցով տեղադրեք լրացուցիչ գամասեղներ/ձողիկներ: Մյուս ծայրը պետք է կապված լինի վիշապի մարմնին:

Քայլ 10: Վայելեք ձեր վիշապին:

Շնորհավորում եմ: Դուք զրոյից կառուցել եք Sine-ese Dragon: Այժմ ձեզ մնում է միայն նստել և վայելել ձեր շրջապատող էկրանը:

Նշում. Այս նախագիծը կառուցվել է որպես դասընթացների մի մաս Joոան Բեմպոնգի և Սունդարիա Մութուվելի կողմից: Դասընթացի էջը կարող եք գտնել այստեղ:

Խորհուրդ ենք տալիս: