Turinys:

Sine-ese Dragon: 10 žingsnių (su nuotraukomis)
Sine-ese Dragon: 10 žingsnių (su nuotraukomis)

Video: Sine-ese Dragon: 10 žingsnių (su nuotraukomis)

Video: Sine-ese Dragon: 10 žingsnių (su nuotraukomis)
Video: Diles - Bad Bunny, Ozuna, Farruko, Arcangel, Ñengo Flow 2024, Liepa
Anonim
Sine-ese Dragon
Sine-ese Dragon

„Sine-ese Dragon“yra aplinkos namų dekoro elementas, kuriame naudojami mechaniniai judesiai ir šviesos, kad būtų pranešta apie orų prognozę per ateinančius tris trijų valandų intervalus. Pagal apibrėžimą „ambient“apibūdina artimiausią kažko aplinką; todėl buvo nuspręsta, kad tikslinga orų duomenis įtraukti į aplinkos ekraną. Oras yra aspektas, kuris netyčia keičia žmonių dieną ir yra informacija, kuri nuolat keičiasi kiekvieną minutę ar net iki sekundės.

Kinijos drakonas yra „galios, stiprybės ir sėkmės simbolis“ir dažnai vertinamas kaip didelė kultūrinė ir tradicinė Azijos subkontinento vertė. Kinijos drakonas ne tik atneša sėkmės, bet ir turi galingų galių, valdančių „vandenį, kritulius, taifūnus ir potvynius“. Galiausiai Kinijos drakonas buvo laikomas tinkamu pateikti orų duomenis.

Vizualizacija

„Sine-ese Dragon“yra manipuliuojamas šešiuose pagrindiniuose taškuose trijose atskirose sekcijose, atspindinčiose orų prognozes trimis 3 valandų intervalais. Į kiekvieną 3 valandų intervalą bus įtraukta ši informacija:

  • Orų aprašymas - nustato dabartinės orų informacijos spalvą.
  • Temperatūra - nurodo kūno aukštį
  • Drėgmė - mirksi LED segmentai
  • Vėjo greitis - valdo kūno greitį, judantį į kairę ir į dešinę.

Reikalingos medžiagos

  1. 3 mm fanera/kartonas
  2. 5 mm mediniai kaiščiai arba lazdelės
  3. 2 Dalelių fotonai
  4. 3 Minkšti žaislai
  5. 6 servo varikliai
  6. „NeoPixel“žibintai (siūlai arba atskiri žibintai, susiūti kartu)
  7. Daug super klijų
  8. Laidus laidas
  9. Akriliniai dažai
  10. Dekoratyvinis audinys
  11. Lazerinis pjoviklis
  12. 3D spausdintuvas

1 žingsnis: aukštyn ir žemyn

Į viršų ir žemyn!
Į viršų ir žemyn!
Į viršų ir žemyn!
Į viršų ir žemyn!
Į viršų ir žemyn!
Į viršų ir žemyn!

Pirmasis žingsnis kuriant „Sine-ese Dragon“yra komponento, valdančio kūno judėjimą aukštyn ir žemyn, sukūrimas. Kaip įdomu!

  1. Atsisiųskite „Adobe Illustrator“failus (.ai) ir atsispausdinkite naudodami lazerinį pjaustytuvą.

    upDownBoxWithPlatform.ai turėtų būti atspausdintas ant kartono

  2. Atsisiųskite 3D spausdinimo failus (.stl) ir atsispausdinkite naudodami mėgstamą 3D spausdintuvą.

    Spalva nesvarbu diskui ar disko tekintojui. Antrame paveikslėlyje disko tekintojas buvo įdėtas į disko angą

  3. Surinkite pirmuosius du komponentus ir priklijuokite juos, kaip parodyta 3–5 paveikslėliuose.

    1. Platforma
    2. Disko grioveliai
  4. Dabar sudėkite dėžutę vadovaudamiesi žemiau pateiktais patarimais.

    1. Servo laidai turėtų eiti per stačiakampę angą dėžutės šone.
    2. Trumpiausias disko suktuvo galas pritvirtinamas prie servo galvutės, o ilgesnis galas eina per kitos dėžutės pusės skylę, ant kurios yra apskrito skylė. Tai parodyta 6 paveiksle.
  5. Dabar mums reikia kažko, kad platforma išliktų lygi, kai diskas pasukamas. Supjaustykite lazdelę į 75 mm ilgio lazdeles (7 pav.) Ir klijuokite jas per dėžutės viršų į platformos viršų, naudodami karštus klijus. Įsitikinkite, kad lazdos 90 laipsnių kampu išlygintos prie platformos.
  6. Įdėkite 212 mm ilgio lazdelę į vidurinę dėžutės viršuje esančią skylę ant platformos.

Saldus! Dabar jūs turite pilną dėžutę (8 pav.) Slibino judėjimui aukštyn ir žemyn. Dabar pakartokite aukščiau nurodytus veiksmus dar du kartus!

2 žingsnis: Ką apie kairę ir dešinę ?

Ką apie kairę ir dešinę ?!
Ką apie kairę ir dešinę ?!
Ką apie kairę ir dešinę ?!
Ką apie kairę ir dešinę ?!
Ką apie kairę ir dešinę ?!
Ką apie kairę ir dešinę ?!
Ką apie kairę ir dešinę ?!
Ką apie kairę ir dešinę ?!

Dabar negalime pamiršti apie kairiojo ir dešiniojo „Sine-ese Dragon“judėjimą, ar ne? Pereikime prie antro žingsnio!

  1. Atsisiųskite „Adobe Illustrator“failus (.ai) ir atsispausdinkite naudodami lazerinį pjaustytuvą.

    1. leftRightBoxWithPlatforms.ai turėtų būti atspausdintas ant kartono.
    2. ArmTurner.ai failas turi būti atspausdintas ant 3 mm storio medžiagos.
  2. Atsisiųskite 3D spausdinimo failus (.stl) ir atsispausdinkite naudodami mėgstamą 3D spausdintuvą.

    Būtinai atspausdinkite dvi rankas! Spalva čia nesvarbu

  3. Sumontuokite abi platformas, kaip parodyta 3 paveiksle, naudodami karštus klijus.
  4. Sudėkite dėžutę. Nors tai padaryti gali būti sudėtinga, lengviau tai padaryti:

    1. Įdėkite dvi platformas tarp dviejų didelių plyšių abiejose dėžutės pusėse.
    2. Pirmosios rankos uždėjimas ant viršutinės platformos viršaus.
    3. Rankos sukimo sriegis perveriamas per ranką, o po to - viršutinę platformą.
    4. Antrosios rankos uždėjimas ant apatinės platformos viršaus.
    5. Rankos tekinimo sriegis per antrą ranką, o po to - apatinė platforma.
    6. Rankų tekintuvo iškišimas per stačiakampę 3D spausdinto rankos tekintuvo angą.
    7. Kitas tekintuvo galas eina ant servo variklio.
    8. Pridėkite viršutinę, apatinę ir galines dalis prie dėžutės.

Jūsų galutinė surinkta dėžutė turėtų atrodyti kaip šeštoji nuotrauka. Dabar jūs turite tai pakartoti dar du kartus!

Pasibaigus šiam žingsniui, turėtumėte turėti šešias dėžes, kuriose yra trys judėjimo aukštyn/žemyn ir kairė/dešinė sistemos.

3 žingsnis: Kūno laikymas… KAIP?

Kūno laikymas… KAIP?
Kūno laikymas… KAIP?

Geras klausimas! Būtent tada ateina tie 3D atspausdinti slinky laikikliai. Atsisiųskite.stl failą ir atsispausdinkite naudodami 3D spausdintuvą. Būtinai išspausdinkite 6 laikiklius iš 6 skirtingų dėžių.

Jei matėte aukščiau esantį slinkio laikiklio paveikslėlį, staigmena buvo sugadinta - tokia yra mūsų „Sine -ese Dragon“spalva!

4 žingsnis: Bet tos dėžutės nėra tokios gražios …

Ir aš sutinku! Štai kodėl mes ketiname lazeriniu pjaustytuvu iškirpti daug patrauklesnę dėžutę, kurioje bus visos tos dėžės ir jas paslėpti.

Atsisiųskite tuos „Adobe Illustrator“failus ir iškirpkite juos naudodami lazerinį pjaustytuvą. Debesų dizainą ranka nupiešė vienas iš bendradarbių. Nesivaržykite juos keisti, pašalindami juos iliustratoriaus faile ir pridėdami savo dizainą, kaip jums atrodo tinkama! Žemiau yra siūlomi veiksmai, kaip viską sujungti.

  1. Surinkite ir priklijuokite visas tris pirmojo failo dalis (externalBoxFinal_1).
  2. Dar nepridėkite kūrinio iš antrojo failo (externalBoxFinal_2).
  3. Įdėkite kūrinį iš trečiojo failo (externalBoxFinal_3) į dėžutės apačią ir jis turėtų būti uždarytas viršuje. Klijuokite TIK dėžutės apačioje.
  4. Spausdinkite „internalBoxesPlatform“du kartus. Klijuokite dvi dalis, kuriose yra didelės stačiakampio formos skylės. Tada klijuokite tris likusius gabalus. Galiausiai priklijuokite jį prie kito klijuoto rinkinio, kuriame yra skylių.
  5. Padėkite platformą didelės dėžutės apačioje.
  6. Įdėkite visas 6 mažesnes dėžes į atitinkamas platformos vietas.
  7. Dabar padėkite gabalėlį iš antrojo failo (externalBoxFinal_2) ant dėžutės viršaus ir klijuokite aplink kraštą. Viršutinės dalies skylės turi sutapti su mažesnių dėžių skylėmis. Jei ne, pertvarkykite mažesnes dėžutes. Į mažesnes dėžutes visiškai nepilkite klijų.
  8. Jei naudojate duonos lentą, kurios apačioje yra lipnus gabalas, padėkite ją šalia apatinio gabalo centro toje vietoje, kur uždarius dėžutę, duonos lentelė kartu su fotonais turėtų išnykti. Apatinėje dalyje yra nedideli plyšiai, palengvinantys prisijungimą prie fotonų iš išorės.

5 žingsnis: Slenkantys žaislai ?? O, mano

Slenkantys žaislai ?? O, mano!
Slenkantys žaislai ?? O, mano!
Slenkantys žaislai ?? O, mano!
Slenkantys žaislai ?? O, mano!

Drakono kūnas:

1. Naudodami karštus klijus arba juostelę, sumaišykite tris lipdukus.

2. Išmatuokite slankstelių ilgį ir skersmenį ir nupjaukite dekoratyvinio audinio gabalėlį.

3. Atneškite du audinio galus ir susiuvkite.

4. Kai baigsite juos siūti, įkiškite slinkes kaip kojines.

5. Siuvamosios dalies galus prisiūti prie pasiūto audinio.

6 žingsnis: atspausdinkite savo drakoną

3D spausdintos drakono dalys:

1. Dalys buvo paimtos iš

2. Naudojome tik galvą, kojas ir akis.

3. Po 3D spausdinimo detalę išlyginkite švitriniu popieriumi ir acetonu.

4. Dažykite dalis taip, kaip norite papuošti.

7 žingsnis: laikas sustiprinti savo drakoną naudojant „NeoPixels“

Laikas sustiprinti savo drakoną naudojant „NeoPixels“!
Laikas sustiprinti savo drakoną naudojant „NeoPixels“!
Laikas sustiprinti savo drakoną naudojant „NeoPixels“!
Laikas sustiprinti savo drakoną naudojant „NeoPixels“!

Šviesos segmentas:

1. Jei norite, galite tiesiog naudoti neopikselio sruogą, kad sukurtumėte žibintus. (Mums pritrūko sruogų).

2. Mes panaudojome 20 neopikselinių žibintų ir sujungėme juos laidais. Šie laidai buvo lituojami ant jų ir prijungiami prie fotono naudojant raudoną laidą, kad jis atitiktų drakono temą.

3. Taip pat galite siūti savo neopikselines lemputes ant ilgo audinio gabalo, tačiau mes jų nenaudojome, nes turėjome plunksną iš metalo.

Dalių surinkimas: sriegiais ar laidais pritvirtinkite šviesos segmentą drakono kūno viduje. Įsitikinkite, kad galite prijungti žibintus prie fotono, esančio bazinėje dėžutėje. Pritvirtinkite galvą, kojas ir uodegą prie kūno klijais. Kai jie yra vietoje, pritvirtinkite kūną prie slidžių laikiklių, kuriuos spausdinome anksčiau. Dabar kūnas yra paruoštas užprogramuoti.

8 žingsnis: laiko programavimas

Kadangi mes naudosime du dalelių fotonus darbui su šešiais atskirais servo varikliais (vienas fotonas gali veikti tik su keturiais), rašysime du atskirus, bet panašius kodus, kurie bus rodomi mikrovaldikliuose.

Dabar dėl pirmojo mikrovaldiklio …

Į „Arduino“failą (.ino) įtraukite šias bibliotekas ir apibrėžimus:

#include "neopixel.h"

#įtraukti „ArduinoJson.h“

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Tada deklaruokite šiuos kintamuosius:

Adafruit_NeoPixel strip = 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; // turi būti nuo 0 iki 180 (laipsniais) int positionUpDown_2 = 180; // turi būti nuo 0 iki 180 (laipsniais) int leftRight_2 = 1; // 0 = kairė, 1 = dešinė int upDown_2 = 1; // 0 = aukštyn, 1 = žemyn 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_OBJECT_SIZE (5) + JSON_OBJECT_SIZE (5) + JSON_OBJECT_SISE 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_SISIE (2) + JSON (2) + JSON (2) + JSON (5) + 76*JSON_OBJECT_SIZE (8) + 12490; Styginis orasArray [3]; plūdės temperatūraArray [3]; plūdės drėgmėArray [3]; float windSpeedArray [3]; Styginių laiko žymėArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; Eilutės allData5DaysForecast;

Spustelėkite čia, kad sužinotumėte, kaip nustatyti žiniatinklio kabliukus. Kai baigsite, pridėkite šias deklaracijas ir funkcijas ir, jei reikia, atlikite atitinkamus pakeitimus:

void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Laikmačio laikmatisWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } Laikmačio laikmatisWeatherCurrent (60000, getCurrentWeather);

Šios funkcijos valdo slibino judesius aukštyn/žemyn ir kairėn/dešinėn:

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

void changeUpDown2 () {

if (upDown_2) {positionUpDown_2 ++; if (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} else {positionUpDown_2--; jei (pozicijos aukštyn_2 <1) {aukštyn žemyn_2 = 1; }} servoUpDown_2.write (pozicijaUpDown_2); }

Kad būtų galima keisti judesius tam tikru intervalu, sukuriami laikmačiai.

Laikmačio laikmatisLeftRight1 (100, keistiLeftRight1);

Laikmačio laikmatisLeftRight2 (100, keistiLeftRight2); Laikmatis timerUpDown1 (10, keistiUpDown1); Laikmatis timerUpDown2 (10, keistiUpDown2);

Galiausiai pridėta sąrankos funkcija. Būtinai atlikite tinkamus kodo eilučių, susijusių su žiniatinklio kabliukais, pakeitimus.

void setup () {// paleisti orų laikmačius timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopikselių juostelė.begin (); // Įdėkite inicializaciją kaip „pinMode“ir pradėkite funkcijas čia. // Nustatykite „Micro Servo servoLeftRight_1.attach“(D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // inicijuoti servo padėtį servoUpDown_1.write (positionUpDown_1); // inicijuoti servo padėtį servoLeftRight_2.write (positionLeftRight_2); // inicijuoti servo padėtį servoUpDown_2.write (positionUpDown_2); // inicijuoti servo padėties laikmatįLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Atidaryti konsolę Serial.begin (9600); vėlavimas (2000 m.); Serial.println („Sveiki!“); // Prenumeruokite „get_weather5DayForecast“ir „get_currentWeather webhooks Particle.subscribe“(„hook-response/get_weather5DayForecast“, gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Šiam projektui ciklinė funkcija nenaudojama. Mes negalime pamiršti funkcijų, skirtų tvarkyti duomenis, gautus iš žiniatinklio kabliukų!

void gotWeather5DayForecast (const char *event, const char *data) {allData5DaysForecast += duomenys; // išsaugo visus duomenis vienoje eilutėje. int allData5DaysForecastLen = allData5DaysForecast.length (); anglies buferis [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buferis, allData5DaysForecastLen + 1); // sukurti buferį eilutei int bufferLength = sizeof (buferis); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buferis); // Patikrinkite, ar sėkmingas analizavimas. if (! root.success ()) {//Serial.println("Parašomas 5 dienų orų prognozė … KLAIDA! "); grįžti; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; plūdės temperatūra = pagrindinė ["temp"]; int drėgmė = pagrindinė ["drėgmė"]; JsonObject & weather = currentObject ["oras"] [0]; const char* weatherInfo = oras ["pagrindinis"]; float windSpeed = currentObject ["vėjas"] ["greitis"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatūra); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; kosteumasArray = drėgmė; weatherArray = weatherInfo; windSpeedArray = vėjo greitis; timestampArray = laiko žymė; i ++; } else {break; }}}

void gotCurrentWeatherData (const char *event, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (duomenys); // Patikrinkite, ar sėkmingas analizavimas. if (! root.success ()) {//Serial.println(" Analizuojamas dabartinis oras … KLAIDA! "); grįžti; } JsonObject & weather = root ["oras"] [0]; const char* weather_main = oras ["pagrindinis"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["drėgmė"]; float wind_speed = šaknis ["vėjas"] ["greitis"]; const char* laiko žyma = šaknis ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (vėjo greitis); leftRightSpeed [0] = servoIncrement; setColor (weather_main, 0); weatherArray [0] = weather_main; temperatureArray [0] = tempFah; drėgmėArray [0] = pagrindinis_drėgmė; windSpeedArray [0] = vėjo greitis; timestampArray [0] = laiko žymė; }

Žemiau rasite papildomų funkcijų, kurios valdo servo variklių padėties atnaujinimą, temperatūros keitimą iš Kelvino į Farenheitą ir šviesos diodų spalvų nustatymą.

int updateUpDown (float temp) {// Priskirkite laipsnį diapazonui [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("naujas servo laipsnis:"); Serial.println (servoMaxDegree); return servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Susieti vėjo greitį su [1, 100] plūdės servoIncrement = windSpeed * 99 /26 + 1 diapazonu; Serial.print ("nauja servo prieaugio vertė:"); Serial.println (servoIncrement); grąžinimo servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; grąžinimo tempFah; }

void setColor (String weatherDesc, int index) {

int ledIndex = 0; jei (indeksas == 0) {ledIndex = 0; } else if (indeksas == 1) {ledIndex = 6; } else if (indeksas == 2) {ledIndex = 12; } else {return; } if (weatherDesc == "Clear") {// geltona, skirta (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // geltona juostelė.parodyti (); vėlavimas (20); }} else if (weatherDesc == "Debesys") {// pilka, skirta (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // pilka juostelė.show (); vėlavimas (20); }} else if (weatherDesc == "Sniegas") {// balta, skirta (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // balta juostelė.show (); vėlavimas (20); }} else if (weatherDesc == "Lietus") {// mėlyna, skirta (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // mėlyna juostelė.show (); vėlavimas (20); }} else {// red for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // raudona juostelė.show (); vėlavimas (20); }}}

Kai viską pridėsite prie „Arduino“failo, sukompiliuokite jį. Jei nėra klaidų, eikite į priekį ir paleiskite kodą iki pirmojo fotono. Kitas žingsnis suteiks jums panašų kodą, kuris bus rodomas antrame fotone.

9 žingsnis: programavimas tęsiamas

Kadangi antrojo fotono kodas yra beveik identiškas pirmojo kodui, visas kodas nukopijuojamas ir įklijuojamas žemiau:

#įtraukti „ArduinoJson.h“

Servo servoLeftRight_3;

Servo servoUpDown_3;

int positionLeftRight_3 = 45;

int pozicijaUpDown_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_E_JOJE

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_SISIE (2) + JSON (2) + JSON (2) + JSON (5) + 76*JSON_OBJECT_SIZE (8) + 12490;

Styginis orasArray [3];

plūdės temperatūraArray [3]; plūdės drėgmėArray [3]; float windSpeedArray [3]; Styginių laiko žymėArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

Eilutės allData5DaysForecast;

void getWeather5DayForecast ()

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

Laikmačio laikmatisWeatherForecast (60000, getWeather5DayForecast); 10, 800, 000 ms = 3 dienos

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Laikmačio laikmatisWeatherCurrent (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 (pozicijaLeftRight_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--; jei (pozicijaUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (pozicijaUpDown_3); }

Laikmačio laikmatisLeftRight3 (100, keistiLeftRight3);

Laikmatis timerUpDown3 (10, keistiUpDown3);

void setup () {

// paleisti orų laikmačius timerWeatherForecast.start (); timerWeatherCurrent.start (); // Įdėkite inicializaciją kaip „pinMode“ir pradėkite funkcijas čia. // Nustatykite „Micro Servo servoLeftRight_3.attach“(D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (pozicijaLeftRight_3); // inicijuoti servo padėtį

servoUpDown_3.write (pozicijaUpDown_3); // inicijuoti servo padėtį

timerLeftRight3.start ();

timerUpDown3.start (); // Atidaryti konsolę Serial.begin (9600); vėlavimas (2000 m.); Serial.println („Sveiki!“); // Prenumeruokite „get_weather5DayForecast“ir „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 *įvykis, const char *duomenys)

{allData5DaysForecast += duomenys; // išsaugo visus duomenis vienoje eilutėje. int allData5DaysForecastLen = allData5DaysForecast.length (); anglies buferis [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buferis, allData5DaysForecastLen + 1); // sukurti buferį eilutei int bufferLength = sizeof (buferis); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buferis); //Serial.println(allData5DaysForecast); // Patikrinkite, ar sėkmingas analizavimas. if (! root.success ()) {//Serial.println("Parašomas 5 dienų orų prognozė … KLAIDA! "); grįžti; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; plūdės temperatūra = pagrindinė ["temp"]; int drėgmė = pagrindinė ["drėgmė"]; JsonObject & weather = currentObject ["oras"] [0]; const char* weatherInfo = oras ["pagrindinis"]; float windSpeed = currentObject ["vėjas"] ["greitis"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatūra); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; kosteumasArray = drėgmė; weatherArray = weatherInfo; windSpeedArray = vėjo greitis; timestampArray = laiko žymė; i ++; } else {break; }}}

void gotCurrentWeatherData (const char *įvykis, const char *duomenys)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (duomenys); //Serial.println(data); // Patikrinkite, ar sėkmingas analizavimas. if (! root.success ()) {//Serial.println(" Analizuojamas dabartinis oras … KLAIDA! "); grįžti; } JsonObject & weather = root ["oras"] [0]; const char* weather_main = oras ["pagrindinis"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["drėgmė"]; float wind_speed = šaknis ["vėjas"] ["greitis"]; const char* laiko žyma = šaknis ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (vėjo greitis); leftRightSpeed [0] = servoIncrement; weatherArray [0] = weather_main; temperatureArray [0] = tempFah; drėgmėArray [0] = pagrindinis_drėgmė; windSpeedArray [0] = vėjo greitis; timestampArray [0] = laiko žymė; }

int updateUpDown (float temp) {

// Priskirkite laipsnį diapazonui [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("naujas servo laipsnis:"); Serial.println (servoMaxDegree); return servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Susieti vėjo greitį su [1, 100] plūdės servoIncrement = windSpeed * 99 /26 + 1 diapazonu; Serial.print ("nauja servo prieaugio vertė:"); Serial.println (servoIncrement); grąžinimo servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; grąžinimo tempFah; }

Tu tai padarei! Jūs tai padarėte per projekto programavimo skyrių! Dabar būtinai prijunkite visus laidus ir jungtis nuo servo variklių ir neopikselių iki duonos lentos ir mikrovaldiklių. PASTABA: įkiškite papildomus kaiščius/lazdeles per vertikalius plyšius ant kairiojo ir dešiniojo kūno judesių dėžėse. Kitas galas turi būti prijungtas prie drakono kūno.

10 žingsnis: mėgaukitės drakonu

Sveikinu! Jūs sukūrėte „Sine-ese Dragon“nuo nulio! Dabar viskas, ką jums reikia padaryti, tai atsisėsti ir mėgautis aplinkos vaizdu!

PASTABA: Šis projektas buvo sukurtas kaip Joan Bempong ir Soundarya Muthuvel kursinio darbo dalis. Kurso puslapį rasite čia.

Rekomenduojamas: