Sisukord:

Sine-ese Dragon: 10 sammu (koos piltidega)
Sine-ese Dragon: 10 sammu (koos piltidega)

Video: Sine-ese Dragon: 10 sammu (koos piltidega)

Video: Sine-ese Dragon: 10 sammu (koos piltidega)
Video: ВСЕ БОССЫ DARK SOULS 2 ОТ ХУДШЕГО К ЛУЧШЕМУ ТОП 2024, Juuli
Anonim
Mõnus draakon
Mõnus draakon

Sine-ese Dragon on ümbritseva sisekujundusega tükk, mis kasutab mehaanilisi liigutusi ja tulesid, et öelda teile järgmise kolme kolmetunnise intervalliga ilmateade. Definitsiooni järgi kirjeldab ambient millegi lähiümbrust; seetõttu otsustati kaasata ilmastikuandmed ümbritsevale ekraanile. Ilm on aspekt, mis muudab tahtmatult inimeste päeva ja on teave, mis muutub pidevalt iga minuti või isegi sekundi jooksul.

Hiina draakon on "võimu, jõu ja õnne sümbol" ning seda peetakse kogu Aasia subkontinendil sageli kõrge kultuurilise ja traditsioonilise väärtusega. Lisaks õnne toomisele on Hiina draakonil väidetavalt ka tugev jõud, mis kontrollib "vett, sademeid, taifuune ja üleujutusi". Lõppkokkuvõttes peeti Hiina draakoni ilmateadete esitamiseks sobivaks.

Visualiseerimine

Sine-ese Dragoniga manipuleeritakse kuues põhipunktis kolmes eraldi osas, mis esindavad ilmateadet kolme 3-tunnise intervalliga. Iga 3-tunnise intervalli kohta lisatakse järgmine teave:

  • Ilmakirjeldus - määrab praeguse ilmateabe värvi.
  • Temperatuur - määrab keha kõrguse
  • Niiskus - LED -segmentide vilkumine
  • Tuule kiirus - kontrollib vasakule ja paremale liikuva keha kiirust.

Vajalikud materjalid

  1. 3 mm vineer/papp
  2. 5 mm puidust tüüblid või söögipulgad
  3. 2 Osakeste footonid
  4. 3 libisevad mänguasjad
  5. 6 servomootorit
  6. NeoPixeli tuled (kas kiud või üksikud tuled kokku õmmeldud)
  7. Palju superliimi
  8. Juhtiv niit
  9. Akrüülvärv
  10. Dekoratiivne kangas
  11. Laserlõikur
  12. 3D printer

Samm: üles ja alla

Üles ja alla!
Üles ja alla!
Üles ja alla!
Üles ja alla!
Üles ja alla!
Üles ja alla!

Teie esimene samm Sine-ese Dragoni ehitamiseks on konstrueerida komponent, mis kontrollib keha üles ja alla liikumist. Kui põnev!

  1. Laadige alla Adobe Illustratori failid (.ai) ja printige need välja laserlõikuri abil.

    upDownBoxWithPlatform.ai tuleks trükkida papile

  2. Laadige alla 3D -printimisfailid (.stl) ja kasutage nende printimiseks oma lemmik -3D -printerit.

    Värv pole ketta ega ketaspööraja jaoks oluline. Teisel pildil on ketaspööraja sisestatud ketta ava sisse

  3. Pange kaks esimest komponenti kokku ja liimige need kokku, nagu on näidatud piltidel 3 kuni 5.

    1. Platvorm
    2. Ketta sooned
  4. Nüüd pange kast kokku, järgides alltoodud näpunäiteid.

    1. Servo juhtmed peaksid läbima karbi küljel asuva ristkülikukujulise ava.
    2. Kettapööraja lühim ots kinnitatakse servopea külge ja pikem ots läheb läbi karbi teise külje augu, millel on ümmargune auk. Seda näitab pilt 6.
  5. Nüüd vajame midagi, et platvorm jääks ketta pööramisel tasaseks. Lõika söögipulk 75 mm pikkusteks pulgadeks (joonis 7) ja liimige need kuuma liimi abil läbi karbi ülaosa platvormi ülaossa. Veenduge, et pulgad oleksid platvormi suhtes 90 kraadi allapoole tasandatud.
  6. Sisestage platvormile kasti ülaosas asuvasse keskmisse auku 212 mm pikkune kepp.

Kallis! Nüüd on teil draakoni üles ja alla liikumiseks täielik kast (joonis 8). Nüüd korrake ülaltoodud samme veel kaks korda!

2. samm: kuidas on vasakul ja paremal ?

Aga vasak ja parem ?!
Aga vasak ja parem ?!
Aga vasak ja parem ?!
Aga vasak ja parem ?!
Aga vasak ja parem ?!
Aga vasak ja parem ?!
Aga vasak ja parem ?!
Aga vasak ja parem ?!

Nüüd ei saa me unustada Sine-ese Dragoni vasakut ja paremat liikumist? Hüppame teisele astmele!

  1. Laadige alla Adobe Illustratori failid (.ai) ja printige need välja laserlõikuri abil.

    1. leftRightBoxWithPlatforms.ai tuleks trükkida papile.
    2. ArmTurner.ai fail tuleks printida 3 mm paksusele materjalile.
  2. Laadige alla 3D -printimisfailid (.stl) ja kasutage nende printimiseks oma lemmik -3D -printerit.

    Printige kindlasti kaks kätt! Värv pole siin oluline

  3. Pange kaks platvormi kokku kuuma liimi abil, nagu on näidatud pildil 3.
  4. Pange kast kokku. Kuigi see võib olla keeruline, on seda lihtsam saavutada järgmiselt.

    1. Kahe platvormi sisestamine kasti mõlemal küljel asuva kahe suure pilu vahele.
    2. Esimese käe asetamine ülemise platvormi ülaosale.
    3. Keerake käepööramine läbi õla ja seejärel ülemise platvormi.
    4. Teise käe asetamine alumise platvormi ülaosale.
    5. Keerake trenažöör läbi teise käe ja seejärel alumise platvormi.
    6. Käsipööraja torgamine läbi 3D -prinditud käsivarre ristkülikukujulise ava.
    7. Turniiri teine ots läheb servomootori peale.
    8. Lisage kasti ülemine, alumine ja tagumine osa.

Teie viimane kokkupandud kast peaks välja nägema nagu kuues pilt. Nüüd peate seda veel kaks korda kordama!

Selle sammu lõpuks peaks teil olema kuus kasti, millel on kolm üles/alla ja vasakule/paremale liikumissüsteemi.

3. samm: keha üleval hoidmine … KUIDAS?

Keha üleval hoidmine … KUIDAS?
Keha üleval hoidmine … KUIDAS?

Hea küsimus! See on siis, kui need 3D -prinditud libedad hoidikud tulevad sisse. Laadige alla kaasasolev.stl -fail ja printige see 3D -printeriga. Printige 6 erineva kasti jaoks kindlasti kokku 6 hoidikut.

Kui olete ülaltoodud pilti hoidjast näinud, on üllatus rikutud - see on meie Sine -ese Dragoni värv!

Samm: aga need kastid pole päris ilusad …

Ja olen nõus! Seetõttu lõikame laserlõikuriga palju atraktiivsema karbi, mis sisaldab kõiki neid kaste ja varjab neid.

Laadige need Adobe Illustratori failid alla ja lõigake need laserlõikuri abil välja. Pilvede kujunduse joonistas üks kaasautor käsitsi. Muutke neid julgelt, eemaldades need illustraatori failist ja lisades oma kujunduse oma äranägemise järgi! Allpool on välja pakutud sammud, kuidas kõike kokku panna.

  1. Pange kokku ja liimige kõik kolm tükki esimesest failist (externalBoxFinal_1) kokku.
  2. Ärge lisage tükki teisest failist (externalBoxFinal_2) veel.
  3. Pange tükk kolmandast failist (externalBoxFinal_3) kasti põhja ja see peaks ülaosas sulguma. Liimi AINULT karbi põhjas.
  4. Printige sisemisi kaste kaks korda. Liimige kaks tükki, millel on suured ristkülikukujulised augud. Seejärel liimige kolm ülejäänud tükki kokku. Lõpuks liimige see teise liimitud komplekti külge, milles on augud.
  5. Asetage platvorm suure kasti põhja.
  6. Sisestage kõik 6 väiksemat kasti platvormi vastavatesse kohtadesse.
  7. Nüüd asetage tükk teisest failist (externalBoxFinal_2) kasti ülaosale ja liimige serva ümber. Ülemise detaili augud peaksid joonduma väiksemate kastide aukudega. Kui ei, siis korraldage väiksemad kastid ümber. Ärge lisage väiksematele kastidele üldse liimi.
  8. Kui kasutate leivaplaati, mille põhjas on kleepuv tükk, asetage see alumise osa keskpunkti lähedale kohta, kus karbi sulgemisel peaks leivaplaat koos footonitega kaduma. Alumisel tükil on väikesed pilud, mis hõlbustavad fotonitega väljastpoolt ühendamist.

5. samm: libedad mänguasjad ?? Issand

Laiskad mänguasjad ?? Issand!
Laiskad mänguasjad ?? Issand!
Laiskad mänguasjad ?? Issand!
Laiskad mänguasjad ?? Issand!

Draakoni keha:

1. Ühendage kolm slinkit kuuma liimi või teibiga.

2. Mõõda slinkide pikkus ja läbimõõt ning lõika tükike dekoratiivkangast.

3. Too kanga kaks otsa ja õmble need kokku.

4. Kui oled nende õmblemise lõpetanud, libista slinkid sokina sisse.

5. Õmble slinky otsad õmmeldud kanga külge.

6. samm: printige oma draakon

Draakoni 3D -trükitud osad:

1. Osad võeti aadressilt

2. Kasutasime ainult pead, jalgu ja silmi.

3. Pärast detaili 3D -printimist siluge seda liivapaberi ja atsetooniga.

4. Värvige osad nii, nagu soovite seda kaunistada.

Samm: aeg oma draakonit võimendada NeoPixelite abil

Aeg oma draakonit võimendada NeoPixelite abil!
Aeg oma draakonit võimendada NeoPixelite abil!
Aeg oma draakonit võimendada NeoPixelite abil!
Aeg oma draakonit võimendada NeoPixelite abil!

Valguse segment:

1. Soovi korral saate tulede loomiseks kasutada lihtsalt neopikseli kiudu. (Lõngad said otsa).

2. Kasutasime 20 neopiksellampi ja ühendasime need juhtmete abil. Need juhtmed joodeti nende külge ja ühendati footoniga punase juhtmestiku abil, nii et see sobiks draakoni teemaga.

3. Võite õmmelda oma neopiksellambid ka pikale riidetükile, kuid me ei kasutanud neid, sest meil oli metallist valmistatud läikiv.

Osade kokkupanek: Kinnitage valgusegment draakoni kere sisse niitide või juhtmete abil. Veenduge, et saate ühendada tuled baaskasti sees oleva footoniga. Kinnitage pea, jalad ja saba liimi abil keha külge. Kui need on paigas, kinnitage korpus eelnevalt trükitud libisemiskindlatesse hoidikutesse. Nüüd on keha programmeerimiseks valmis.

8. samm: aja programmeerimine

Kuna me kasutame kuue eraldi servomootoriga töötamiseks kahte osakeste footonit (üks footon saab töötada ainult neljaga), kirjutame mikrokontrolleritele kaks eraldi, kuid sarnast koodi.

Nüüd esimese mikrokontrolleri jaoks…

Sisestage Arduino faili (.ino) järgmised teegid ja määratlused:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Seejärel deklareerige järgmised muutujad:

Adafruit_NeoPixel riba = 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; // peab olema vahemikus 0 kuni 180 (kraadides) int positionUpDown_2 = 180; // peab olema vahemikus 0 kuni 180 (kraadides) int leftRight_2 = 1; // 0 = vasakule, 1 = paremale int upDown_2 = 1; // 0 = üles, 1 = alla 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_SIZE (5) + 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; String weatherArray [3]; ujuktemperatuurArray [3]; ujuki niiskusArray [3]; float windSpeedArray [3]; Stringi ajatempelArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Veebikonksude seadistamise kohta lisateabe saamiseks klõpsake siin. Kui olete lõpetanud, lisage järgmised deklaratsioonid ja funktsioonid ning tehke vajadusel vajalikud muudatused:

void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Taimeri taimerWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } Taimer taimerWeatherCurrent (60000, getCurrentWeather);

Järgmised funktsioonid juhivad draakoni üles/alla ja vasakule/paremale liikumist:

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 () {

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

void changeUpDown2 () {

kui (ülesDown_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); }

Liikumiste muutmiseks intervalliga luuakse taimerid.

Taimer taimerLeftRight1 (100, muudaLeftRight1);

Taimer taimerLeftRight2 (100, muudaLeftRight2); Taimer timerUpDown1 (10, changeUpDown1); Taimer timerUpDown2 (10, changeUpDown2);

Lõpuks lisatakse häälestusfunktsioon. Tehke veebihaakidega tegelevatel koodiridadel kindlasti asjakohased muudatused.

void setup () {// ilmataimerite käivitamine timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopikselite riba.begin (); // Pane initsialiseerimine nagu pinMode ja alusta funktsioone siit. // Mikroservo seadistamine servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // initsialiseerida servoasend servoUpDown_1.write (positionUpDown_1); // servoasendi initsialiseerimine servoLeftRight_2.write (positionLeftRight_2); // servoasendi initsialiseerimine servoUpDown_2.write (positionUpDown_2); // initsialiseerida servoasendi taimerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Konsooli avamine Serial.begin (9600); viivitus (2000); Serial.println ("Tere!"); // Telli veebihakul get_weather5DayForecast ja get_currentWeather Webhooks Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Selle projekti jaoks tsüklifunktsiooni ei kasutata. Me ei saa unustada veebihaakidest saadud andmete töötlemise funktsioone!

void gotWeather5DayForecast (const char *sündmus, const char *andmed) {allData5DaysForecast += andmed; // salvestab kõik andmed ühte stringi. int allData5DaysForecastLen = allData5DaysForecast.length (); söe puhvri [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (puhver, allData5DaysForecastLen + 1); // luua stringile puhver int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (puhverPikkus); JsonObject & root = jsonBufferWeather.parseObject (puhver); // Testi, kas parsimine õnnestub. if (! root.success ()) {//Serial.println("Parsing for weather 5 days prognoz … ERROR! "); tagasipöördumine; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["peamine"]; ujuktemperatuur = peamine ["temp"]; int niiskus = peamine ["niiskus"]; JsonObject & weather = currentObject ["ilm"] [0]; const char* weatherInfo = ilm ["peamine"]; float windSpeed = currentObject ["tuul"] ["kiirus"]; const char* ajatempel = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatuur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatuurArray = tempFah; niiskuseArray = niiskus; weatherArray = weatherInfo; windSpeedArray = tuulekiirus; timestampArray = ajatempel; i ++; } muu {murda; }}}

void gotCurrentWeatherData (const char *sündmus, const char *andmed) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (andmed); // Testi, kas parsimine õnnestub. if (! root.success ()) {//Serial.println("Parsing for current weather … ERROR! "); tagasipöördumine; } JsonObject & weather = root ["ilm"] [0]; const char* weather_main = ilm ["peamine"]; JsonObject & main = root ["peamine"]; float main_temp = main ["temp"]; int main_humidity = peamine ["niiskus"]; ujuk tuulekiirus = juur ["tuul"] ["kiirus"]; const char* ajatempel = juur ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (tuulekiirus); leftRightSpeed [0] = servoIncrement; setColor (ilmateade, 0); weatherArray [0] = weather_main; temperatureArray [0] = tempFah; niiskuseArray [0] = peamine_niiskus; windSpeedArray [0] = tuulekiirus; timestampArray [0] = ajatempel; }

Allpool leiate lisafunktsioone, mis juhivad servomootorite asendite värskendamist, temperatuuri teisendamist Kelvinist Fahrenheiti ja LED -ide värvide seadistamist.

int updateUpDown (float temp) {// Kaardista kraad vahemikku [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("uus servokraad:"); Serial.println (servoMaxDegree); tagastada servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Tuule kiiruse kaardistamine vahemikku [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("uus servo juurdekasvu väärtus:"); Serial.println (servoIncrement); tagastusservoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; tagasipöördumise tempFah; }

void setColor (String weatherDesc, int indeks) {

int ledIndex = 0; kui (indeks == 0) {ledIndex = 0; } muu kui (indeks == 1) {ledIndex = 6; } muu kui (indeks == 2) {ledIndex = 12; } muu {return; } if (weatherDesc == "Selge") {// kollane (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // kollane riba.näitus (); viivitus (20); }} else if (weatherDesc == "Clouds") {// hall for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // hall riba.show (); viivitus (20); }} else if (weatherDesc == "Lumi") {// valge (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // valge riba.show (); viivitus (20); }} else if (weatherDesc == "Vihm") {// sinine (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, rib. Color (119, 191, 246)); // sinine riba.show (); viivitus (20); }} else {// punane (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // red strip.show (); viivitus (20); }}}

Kui olete kõik oma Arduino -faili lisanud, kompileerige see. Kui vigu pole, jätkake ja vilgutage kood esimesele footonile. Järgmine samm annab teile sarnase koodi, mida teisel fotonil vilgutada.

9. samm: programmeerimine jätkub

Kuna teise footoni kood on peaaegu identne esimese koodiga, kopeeritakse ja kleebitakse kogu kood allpool:

#include "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_EZJO (JSON_EZJO)

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;

String weatherArray [3];

ujuktemperatuurArray [3]; ujuki niiskusArray [3]; float windSpeedArray [3]; Stringi ajatempelArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String allData5DaysForecast;

void getWeather5DayForecast ()

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

Taimeri taimerWeatherForecast (60000, getWeather5DayForecast); 10, 800, 000 ms = 3 päeva

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Taimer taimerWeatherCurrent (60000, getCurrentWeather);

void changeLeftRight3 () {

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

void changeUpDown3 () {

kui (üles alla_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); }

Taimer taimerLeftRight3 (100, muudaLeftRight3);

Taimer timerUpDown3 (10, changeUpDown3);

tühine seadistus () {

// ilmataimerite käivitamine timerWeatherForecast.start (); timerWeatherCurrent.start (); // Pane initsialiseerimine nagu pinMode ja alusta funktsioone siit. // Mikroservo seadistamine servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // servoasendi lähtestamine

servoUpDown_3.write (positionUpDown_3); // servoasendi lähtestamine

timerLeftRight3.start ();

timerUpDown3.start (); // Konsooli avamine Serial.begin (9600); viivitus (2000); Serial.println ("Tere!"); // Telli get_weather5DayForecast ja 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 *sündmus, const char *andmed)

{allData5DaysForecast += andmed; // salvestab kõik andmed ühte stringi. int allData5DaysForecastLen = allData5DaysForecast.length (); söe puhvri [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (puhver, allData5DaysForecastLen + 1); // luua stringile puhver int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (puhverPikkus); JsonObject & root = jsonBufferWeather.parseObject (puhver); //Serial.println(allData5DaysForecast); // Testi, kas parsimine õnnestub. if (! root.success ()) {//Serial.println("Parsing for weather 5 days prognoz … ERROR! "); tagasipöördumine; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["peamine"]; ujuktemperatuur = peamine ["temp"]; int niiskus = peamine ["niiskus"]; JsonObject & weather = currentObject ["ilm"] [0]; const char* weatherInfo = ilm ["peamine"]; float windSpeed = currentObject ["tuul"] ["kiirus"]; const char* ajatempel = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatuur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatuurArray = tempFah; niiskuseArray = niiskus; weatherArray = weatherInfo; windSpeedArray = tuulekiirus; timestampArray = ajatempel; i ++; } muu {murda; }}}

void gotCurrentWeatherData (const char *sündmus, const char *andmed)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (andmed); //Seriaalne.println (andmed); // Testi, kas parsimine õnnestub. if (! root.success ()) {//Serial.println("Parsing for current weather … ERROR! "); tagasipöördumine; } JsonObject & weather = root ["ilm"] [0]; const char* weather_main = ilm ["peamine"]; JsonObject & main = root ["peamine"]; float main_temp = main ["temp"]; int main_humidity = peamine ["niiskus"]; ujuk tuulekiirus = juur ["tuul"] ["kiirus"]; const char* ajatempel = juur ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (tuulekiirus); leftRightSpeed [0] = servoIncrement; weatherArray [0] = weather_main; temperatureArray [0] = tempFah; niiskuseArray [0] = peamine_niiskus; windSpeedArray [0] = tuulekiirus; timestampArray [0] = ajatempel; }

int updateUpDown (float temp) {

// Kraadi kaardistamine vahemikku [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("uus servokraad:"); Serial.println (servoMaxDegree); tagastada servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Tuule kiiruse kaardistamine vahemikku [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("uus servo juurdekasvu väärtus:"); Serial.println (servoIncrement); tagastusservoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; tagasipöördumise tempFah; }

Sa tegid seda! Olete teinud läbi projekti programmeerimise osa! Nüüd tehke kindlasti kõik juhtmed ja ühendused servomootoritest ja neopikslitest leivaplaadile ja mikrokontrolleritele. MÄRKUS: sisestage täiendavad tüüblid/söögipulgad läbi keha vasakule ja paremale liikumiseks olevate kastide vertikaalsete pilude. Teine ots tuleks ühendada draakoni kehaga.

Samm: nautige oma draakonit

Palju õnne! Olete loonud Sine-ese Dragoni nullist! Nüüd peate vaid istuma ja nautima oma ümbritsevat väljapanekut!

MÄRKUS. See projekt koostati Joan Bempongi ja Soundarya Muthuveli kursuste osana. Kursuse lehe leiate siit.

Soovitan: