Բովանդակություն:
- Քայլ 1: Վեր և վար:
- Քայլ 2: Ինչ վերաբերում է ձախին և աջին:
- Քայլ 3. Մարմինը բարձր պահելը … ԻՆՉՊԵՍ:
- Քայլ 4: Բայց այդ տուփերն այնքան էլ գեղեցիկ չեն…
- Քայլ 5: Slinky Խաղալիքներ ԱԽ իմ
- Քայլ 6: Տպեք ձեր վիշապին:
- Քայլ 7: NeoPixels- ով ձեր վիշապին ուժեղացնելու ժամանակը:
- Քայլ 8: mingրագրավորման ժամանակը:
- Քայլ 9: mingրագրավորումը շարունակվում է
- Քայլ 10: Վայելեք ձեր վիշապին:
Video: Sine-ese Dragon: 10 քայլ (նկարներով)
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:51
Sine-ese Dragon- ը տան դեկոր է, որն օգտագործում է մեխանիկական շարժումներ և լույսեր, որոնք ձեզ կասեն եղանակի կանխատեսումը հաջորդ երեք ժամվա ընդմիջումների համար: Ըստ սահմանման, շրջապատը նկարագրում է ինչ -որ բանի անմիջական շրջապատը. ուստի որոշվեց, որ տեղին է եղանակի տվյալները ներառել շրջապատող էկրանին: Եղանակը մի ասպեկտ է, որն ակամա փոխում է մարդկանց օրը և տեղեկատվության մի կտոր է, որն անընդհատ փոխվում է ամեն րոպե, կամ նույնիսկ մինչև երկրորդը:
Չինական վիշապը «ուժի, ուժի և հաջողության խորհրդանիշ է» և հաճախ պահվում է բարձր մշակութային և ավանդական արժեքով Ասիական թերակղզում: Բացի բախտ բերելուց, չինական վիշապը նաև ունի հզոր ուժեր, որոնք վերահսկում են «ջուրը, անձրևները, թայֆուններն ու ջրհեղեղները»: Ի վերջո, չինական վիշապը նպատակահարմար համարվեց ներկայացնել եղանակի տվյալները:
Տեսողականացում
Sine-ese Dragon- ը շահագործվում է վեց հիմնական կետերում `երեք առանձին հատվածներում, որոնք ներկայացնում են եղանակի կանխատեսումը երեք 3 ժամ տևողությամբ: Յուրաքանչյուր 3-ժամյա ընդմիջման համար ներառվելու են հետևյալ տեղեկությունները.
- Եղանակի նկարագրություն - որոշում է ընթացիկ եղանակի տեղեկատվության գույնը:
- Temերմաստիճանը - սահմանում է մարմնի բարձրությունը
- Խոնավություն - LED հատվածների թարթում
- Քամու արագություն - վերահսկում է ձախ և աջ մարմնի շարժման արագությունը:
Պահանջվող նյութեր
- 3 մմ նրբատախտակ/Ստվարաթուղթ
- 5 մմ փայտե dowels կամ chopsticks
- 2 մասնիկի ֆոտոն
- 3 Slinky խաղալիքներ
- 6 servo շարժիչ
- NeoPixel լույսեր (կամ թել կամ առանձին լույսեր, որոնք կարված են միասին)
- Շատ սուպեր սոսինձ
- Հաղորդիչ թել
- Ակրիլային ներկ
- Դեկորատիվ հյուսվածք
- Լազերային կտրիչ
- 3D տպիչ
Քայլ 1: Վեր և վար:
Ձեր առաջին քայլը Sine-ese Dragon- ի կառուցման համար այն բաղադրիչի կառուցումն է, որը վերահսկում է մարմնի վեր ու վար շարժումը: Որքա excitingն հուզիչ:
-
Ներբեռնեք Adobe Illustrator ֆայլերը (.ai) և տպեք դրանք լազերային կտրիչ մեքենայի միջոցով:
upDownBoxWithPlatform.ai- ը պետք է տպվի ստվարաթղթի վրա:
-
Ներբեռնեք 3D տպման ֆայլերը (.stl) և դրանք տպելու համար օգտագործեք ձեր նախընտրած 3D տպիչը:
Սկավառակի կամ սկավառակի պտույտի համար գույնը նշանակություն չունի: Երկրորդ նկարում սկավառակի պտույտը տեղադրված է սկավառակի անցքի ներսում:
-
Հավաքեք առաջին երկու բաղադրիչները և դրանք սոսնձեք, ինչպես ցույց է տրված 3 -ից 5 -րդ նկարներում:
- Հարթակը
- Սկավառակի համար նախատեսված ակոսներ
-
Այժմ հավաքեք տուփը ՝ հետևելով ստորև նշված խորհուրդներին:
- Servo- ի լարերը պետք է անցնեն տուփի կողքի ուղղանկյուն բացվածքով:
- Սկավառակի պտույտի ամենակարճ ծայրը ամրացվում է servo գլխին, իսկ ավելի երկար ծայրը անցնում է տուփի մյուս կողմի անցքով, որի վրա շրջանաձև անցք կա: Սա ցուցադրված է նկար 6 -ում:
- Այժմ մեզ ինչ -որ բան պետք է `ապահովելու համար, որ սկավառակը շրջվի, երբ հարթակը մնում է հարթ: Կտրեք փայտիկը 75 մմ երկարությամբ ձողերի մեջ (նկար 7) և դրանք սոսնձեցրեք տուփի վերևի հարթակի վերևում ՝ օգտագործելով տաք սոսինձ: Համոզվեք, որ ձողերը 90 աստիճանով հարթեցված են հարթակին:
- Տեղադրեք 212 մմ երկարությամբ փայտ, տուփի վերևի միջին անցքի մեջ հարթակի վրա:
Անուշ! Այժմ դուք ունեք ամբողջական տուփ (նկար 8) վիշապի վեր ու վար շարժման համար: Այժմ, կրկնեք վերը նշված քայլերը ևս երկու անգամ:
Քայլ 2: Ինչ վերաբերում է ձախին և աջին:
Հիմա, մենք չե՞նք կարող մոռանալ Sine-ese Dragon- ի ձախ և աջ շարժումների մասին: Եկեք անցնենք երկրորդ քայլին:
-
Ներբեռնեք Adobe Illustrator ֆայլերը (.ai) և տպեք դրանք լազերային կտրող մեքենայի միջոցով:
- leftRightBoxWithPlatforms.ai- ը պետք է տպվի ստվարաթղթի վրա:
- armTurner.ai ֆայլը պետք է տպվի 3 մմ հաստությամբ նյութի վրա:
-
Ներբեռնեք 3D տպման ֆայլերը (.stl) և օգտագործեք ձեր նախընտրած 3D տպիչը `դրանք տպելու համար:
Համոզվեք, որ տպել եք երկու թևերը: Այստեղ գույնը նշանակություն չունի:
- Հավաքեք երկու հարթակները միասին, ինչպես ցույց է տրված նկար 3 -ում ՝ օգտագործելով տաք սոսինձ:
-
Միացրեք տուփը: Թեև դա կարող է դժվար լինել, բայց ավելի հեշտ է հասնել դրան ՝
- Տեղադրեք երկու հարթակները տուփի երկու կողմերում գտնվող երկու մեծ ճեղքերի միջև:
- Առաջին թևը տեղադրելով վերին հարթակի վերևում:
- Ձեռքի պտույտը թեքեք թևի միջով, այնուհետև վերին հարթակը:
- Երկրորդ թևը տեղադրելով ներքևի հարթակի վերևում:
- Թևը պտտեցրեք երկրորդ թևի միջոցով, այնուհետև ներքևի հարթակի միջով:
- Ձեռքի պտտիչը կպցրեք եռաչափ տպված ձեռքի պտտիչի ուղղանկյուն բացվածքի միջով:
- Շրջադարձի մյուս ծայրը անցնում է servo շարժիչի վերևում:
- Տուփին ավելացրեք վերին, ստորին և հետևի մասերը:
Ձեր վերջնական հավաքված տուփը պետք է նմանվի վեցերորդ նկարի: Այժմ, դուք պետք է կրկնեք դա ևս երկու անգամ:
Այս քայլի ավարտին դուք պետք է ունենաք վեց տուփ, որոնցից յուրաքանչյուրը երեքն են ՝ վեր/վար և ձախ/աջ շարժման համակարգերից յուրաքանչյուրը:
Քայլ 3. Մարմինը բարձր պահելը … ԻՆՉՊԵՍ:
Լավ հարց է! Դա այն ժամանակ է, երբ գալիս են այդ 3D տպագրված slinky կրիչները: Ներբեռնեք ներառված.stl ֆայլը և տպեք այն 3D տպիչի միջոցով: Համոզվեք, որ 6 տարբեր տուփերի համար տպեք ընդհանուր առմամբ 6 պահարան:
Եթե տեսել եք վերևի անփայլ բռնիչի նկարը, անակնկալը փչացել է. Դա մեր Sine -ese Dragon- ի գույնն է:
Քայլ 4: Բայց այդ տուփերն այնքան էլ գեղեցիկ չեն…
Եվ ես համաձայն եմ! Ահա թե ինչու մենք պատրաստվում ենք լազերային դանակով կտրել շատ ավելի գրավիչ տուփ ՝ այդ բոլոր տուփերը պարունակելու և դրանք թաքցնելու համար:
Ներբեռնեք այդ Adobe Illustrator ֆայլերը և կտրեք դրանք լազերային դանակի միջոցով: Ամպերի դիզայնը ձեռքով գծել է մասնակիցներից մեկը: Ազատորեն փոփոխեք դրանք ՝ դրանք հանելով պատկերազարդող ֆայլի ներսում և ավելացնելով ձեր սեփական դիզայնը ՝ ըստ ձեր հայեցողության: Ստորև ներկայացված են ամեն ինչ միացնելու առաջարկվող քայլերը:
- Հավաքեք և կպցրեք բոլոր երեք կտորները առաջին ֆայլից (outerBoxFinal_1) միասին:
- Երկրորդ ֆայլից (outerBoxFinal_2) կտորը դեռ մի ավելացրեք:
- Երրորդ ֆայլից (outerBoxFinal_3) կտորը դրեք տուփի ներքևում, և այն պետք է փակվի վերևում: Կպչեք ՄԻԱՅՆ տուփի ներքևում:
- Երկու անգամ տպեք ներքին արկղերը: Սոսնձեցրեք երկու կտորները, որոնցում կան մեծ ուղղանկյուն անցքեր: Այնուհետև կպցրեք մնացած մասերից երեքը միասին: Ի վերջո, կպցրեք այն մյուս սոսնձված հավաքածուին ՝ դրանց մեջ անցքերով:
- Տեղադրեք հարթակը մեծ տուփի ներքևում:
- Տեղադրեք բոլոր 6 փոքր տուփերը հարթակում գտնվող իրենց համապատասխան բծերի մեջ:
- Այժմ տեղադրեք կտորը երկրորդ ֆայլից (outerBoxFinal_2) տուփի վերևում և սոսնձեք եզրին: Վերին մասի անցքերը պետք է համահունչ լինեն փոքր արկղերի վրայի անցքերին: Եթե ոչ, վերադասավորեք ձեր փոքր տուփերը: Փոքր արկղերին ընդհանրապես սոսինձ մի ավելացրեք:
- Եթե դուք օգտագործում եք տախտակ, որը ներքևում կպչուն կտոր ունի, տեղադրեք այն ներքևի մասի կենտրոնի մոտ մի վայրում, որտեղ տուփը փակելիս ֆոտոնների հետ միասին հացաթուղթը պետք է անհետանա: Ներքևի մասում կան փոքր ճեղքեր, որոնք ձեզ համար ավելի հեշտ են դարձնում արտաքինից միանալու ֆոտոններին:
Քայլ 5: Slinky Խաղալիքներ ԱԽ իմ
Վիշապի մարմին.
1. Միացրեք երեք սլաքներ `օգտագործելով տաք սոսինձ կամ ժապավեն:
2. Չափել սլաքների երկարությունը և տրամագիծը և կտրել դեկորատիվ կտորի մի կտոր:
3. Բերեք գործվածքների երկու ծայրերը եւ կարեք դրանք միասին:
4. Ավարտելուց հետո դրանք կարեք, գուլպաների պես սահեցրեք դրանք:
5. Կարիքի ծայրերը կարել կարված գործվածքին:
Քայլ 6: Տպեք ձեր վիշապին:
Վիշապի 3D տպագիր մասեր.
1. Մասերը վերցված են https://www.thingiverse.com/thing:854575 կայքից:
2. Մենք օգտագործում էինք միայն գլուխը, ոտքերը և աչքերը:
3. Մասը 3D տպելուց հետո հարթեցրեք այն հղկաթղթի և ացետոնի միջոցով:
4. Ներկեք մասերը այնպես, ինչպես ցանկանում եք այն զարդարել:
Քայլ 7: 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ոան Բեմպոնգի և Սունդարիա Մութուվելի կողմից: Դասընթացի էջը կարող եք գտնել այստեղ:
Խորհուրդ ենք տալիս:
Switch-Adapt Toys. Water-Breathing Walking Dragon Made Accessable: 7 քայլ (նկարներով)
Switch-Adapt Toys. Water-Breathing Walking Dragon Made Access! Շատ դեպքերում այն երեխաները, ովքեր պահանջում են հարմարեցված խաղալիքներ, չեն կարողանում մտնել
Dragon Escape: 3 քայլ
Dragon Escape. Սա կոդավորված կլինի code.org կայքում: Խաղի ամբողջ հիմքն է `խուսափել վիշապներից և որոշակի անգամ հաղթել` ուրվականին գրավելու համար: Դուք կարող եք զարմացնել ձեր ընկերներին այս հիանալի խաղի գաղափարով, որը կարող է փոխվել ձեր սրտով
Pure Sine Wave Inverter: 8 քայլ
Pure Sine Wave Inverter: Իմ հետազոտությունը
Sine Wave Control Board- ի արտադրություն `5 քայլ
Սինուս ալիքի կառավարման տախտակի արտադրություն. Այս անգամ դա միաֆազ սինուսային ալիքի անջատիչ կառավարման տախտակ է, որին հաջորդում է միաֆազ սինուս ալիքի ցանցից դուրս կառավարման տախտակ, այնուհետև եռաֆազ սինուս ալիքի անջատիչ կառավարման տախտակ, և, վերջապես, եռաֆազ սինուսային ալիքի անջատիչ ցանցի կառավարման տախտակ: Հույս ունենք, որ
ESP8266/Arduino SmartThings Bearded Dragon Habitat Controller/Monitor: 4 քայլ
ESP8266/Arduino SmartThings Bearded Dragon Habitat Controller/Monitor. DaVinci our Dragon- ը պետք է ծրագրային ապահովման բարելավվեր իր Vivarium's Controller- ի համար: Ես որոշեցի անցնել լավ ավանդական «լրիվ» Arduino տրամաբանությունից, որը վերջին մեկ տարում բավականին հուսալիորեն խեղդվում էր դեպի ST_Anything SmartThings int