INHOUDSOPGAWE:

Sinese-draak: 10 stappe (met prente)
Sinese-draak: 10 stappe (met prente)

Video: Sinese-draak: 10 stappe (met prente)

Video: Sinese-draak: 10 stappe (met prente)
Video: Paper dragon designs 2024, Julie
Anonim
Sinese-draak
Sinese-draak

Sine-ese Dragon is 'n omringende huisversiering wat meganiese bewegings en ligte gebruik om die weervoorspelling vir die volgende drie uur tussenposes te vertel. Per definisie beskryf ambient die onmiddellike omgewing van iets; daarom is besluit om gepaste weerdata in 'n omringende skerm op te neem. Weer is 'n aspek wat mense se dag per ongeluk verander en is 'n stukkie inligting wat elke minuut of selfs tot die tweede verander.

Die Chinese draak is ''n simbool van krag, sterkte en geluk' en word gereeld op 'n hoë kulturele en tradisionele waarde in die Asiatiese subkontinent gehou. Behalwe dat dit geluk bring, word gesê dat die Chinese draak ook kragtige kragte het wat 'water, reënval, tifone en vloede' beheer. Uiteindelik is die Chinese draak gepas geag om weerdata voor te stel.

Visualisering

Die Sinese-draak word op ses hoofpunte op drie afsonderlike afdelings gemanipuleer wat die weervoorspelling vir drie 3 uur intervalle voorstel. Die volgende inligting sal vir elke interval van 3 uur ingesluit word:

  • Weerbeskrywing - bepaal die kleur van die huidige weerinligting.
  • Temperatuur - spesifiseer die hoogte van die liggaam
  • Humiditeit - knipper van LED -segmente
  • Windspoed - beheer die spoed van die liggaam wat na links en regs beweeg.

Materiaal benodig

  1. 3 mm laaghout/karton
  2. 5 mm houtstokkies of eetstokkies
  3. 2 Deeltjiefotone
  4. 3 Slink speelgoed
  5. 6 servomotors
  6. NeoPixel -ligte (óf 'n draad of individuele ligte wat aan mekaar vasgewerk is)
  7. Baie supergom
  8. Geleidende draad
  9. Akrielverf
  10. Dekoratiewe stof
  11. Lasersnyer
  12. 3D -drukker

Stap 1: op en af

Op en af!
Op en af!
Op en af!
Op en af!
Op en af!
Op en af!

U heel eerste stap om die sinus-draak te bou, is om die komponent te bou wat die op en af beweging van die liggaam beheer. Hoe opwindend!

  1. Laai die Adobe Illustrator -lêers (.ai) af en druk dit af met 'n lasersnyer.

    upDownBoxWithPlatform.ai moet op 'n karton gedruk word

  2. Laai die 3D -druklêers (.stl) af en gebruik u gunsteling 3D -drukker om dit uit te druk.

    Die kleur maak nie saak vir die skyf of die skyfdraaier nie. In die tweede prentjie is die skyfdraaier in die gat van die skyf geplaas

  3. Monteer die eerste twee komponente en plak dit vas soos in die foto's 3 tot 5.

    1. Die platform
    2. Die groewe vir die skyf
  4. Stel nou die boks saam volgens die onderstaande wenke.

    1. Die servo se drade moet deur die reghoekige opening aan die kant van die boks gaan.
    2. Die kortste punt van die skyfdraaier word aan die servokop vasgemaak en die langste punt gaan deur die gat aan die ander kant van die boks met 'n sirkelvormige gat daarop. Dit word getoon in prent 6.
  5. Nou het ons iets nodig om te verseker dat die platform gelyk bly wanneer die skyf draai. Sny die eetstokkie in 75 mm lang stokke (prent 7) en plak dit met warm gom deur die bokant van die boks bo -op die platform. Maak seker dat die stokke 90 grade tot by die platform gelykgemaak is.
  6. Steek 'n 212 mm lange stok in die middelste gat bo -op die boks op die platform.

Soet! Nou het u 'n volledige boks (prent 8) vir die op en af beweging van die draak. Herhaal die stappe hierbo nog twee keer!

Stap 2: Wat van links en regs ?

Wat van links en regs ?!
Wat van links en regs ?!
Wat van links en regs ?!
Wat van links en regs ?!
Wat van links en regs ?!
Wat van links en regs ?!
Wat van links en regs ?!
Wat van links en regs ?!

Nou kan ons nie vergeet van die linker- en regterbeweging van die Sinees-draak nie? Kom ons spring in die tweede stap!

  1. Laai die Adobe Illustrator -lêers (.ai) af en druk dit af met 'n lasersnyer.

    1. leftRightBoxWithPlatforms.ai moet op 'n karton gedruk word.
    2. armTurner.ai -lêer moet op 'n materiaal van 3 mm dik gedruk word.
  2. Laai die 3D -druklêers (.stl) af en gebruik u gunsteling 3D -drukker om dit uit te druk.

    Maak seker dat u twee van die arms druk! Die kleur maak nie hier saak nie

  3. Monteer die twee platforms saam met warm gom soos op foto 3 getoon.
  4. Sit die boks saam. Alhoewel dit moeilik is om dit te doen, is dit makliker om dit te bereik deur:

    1. Plaas die twee platforms tussen die twee groot gleuwe aan weerskante van die boks.
    2. Plaas die eerste arm bo -op die boonste platform.
    3. Ryg die armdraaier deur die arm en dan die boonste platform.
    4. Plaas die tweede arm bo -op die onderste platform.
    5. Ryg die armdraaier deur die tweede arm en dan die onderste platform.
    6. Steek die armdraaier deur die reghoekige opening van die 3D -gedrukte armdraaier.
    7. Die ander kant van die draaier loop bo -op die servomotor.
    8. Voeg die boonste, onderste en agterste stukke by die boks.

U finale boks moet soos die sesde prentjie lyk. Nou, u moet dit nog twee keer herhaal!

Aan die einde van hierdie stap behoort u ses bokse te hê met drie elk van die op/af en links/regs bewegingstelsels.

Stap 3: Hou die liggaam vas … HOE?

Hou die liggaam vas … HOE?
Hou die liggaam vas … HOE?

Goeie vraag! Dit is wanneer die 3D -gedrukte glashouers inkom. Laai die.stl -lêer wat bygevoeg is af en druk dit af met 'n 3D -drukker. Druk in totaal 6 houers vir die 6 verskillende bokse.

As u die prentjie van die gladde houer hierbo gesien het, is die verrassing verwoes - dit is die kleur van ons Sinees -draak!

Stap 4: Maar die bokse is nie so mooi nie …

En ek stem saam! Daarom gaan ons 'n lasersnyer gebruik om 'n baie aantrekliker boks te sny om al die bokse te bevat en dit te verberg.

Laai die Adobe Illustrator -lêers af en sny dit uit met die lasersnyer. Die ontwerp van die wolke is met die hand geteken deur een van die bydraers. Verander dit gerus deur dit in die illustrator -lêer te verwyder en u eie ontwerp by te voeg soos u wil! Hieronder is die voorgestelde stappe om alles aanmekaar te sit.

  1. Monteer en plak al drie stukke uit die eerste lêer (outerBoxFinal_1) saam.
  2. Moenie die stuk uit die tweede lêer (outerBoxFinal_2) nog byvoeg nie.
  3. Plaas die stuk van die derde lêer (buitenste boksFinal_3) onder in die boks, en dit moet aan die bokant toemaak. Plak SLEGS aan die onderkant van die boks.
  4. Druk innerBoxesPlatform twee keer uit. Plak die twee stukke met groot reghoekgate in mekaar vas. Plak dan drie van die oorblywende stukke aan mekaar vas. Plak dit uiteindelik aan die ander vasgemaakte stel met gate daarin.
  5. Plaas die platform onderaan die groot boks.
  6. Plaas al 6 kleiner bokse op hul ooreenstemmende plekke op die platform.
  7. Plaas nou die stuk uit die tweede lêer (outerBoxFinal_2) bo -op die boks en plak om die rand. Die gate op die boonste stuk moet in lyn wees met die gate op die kleiner bokse. Indien nie, herrangskik u kleiner bokse. Moet glad nie gom by die kleiner bokse voeg nie.
  8. As u 'n broodbord met 'n taai stuk aan die onderkant gebruik, plaas dit naby die middel van die onderste stuk op 'n plek sodat die broodbord saam met die fotone verdwyn wanneer u die boks toemaak. Daar is klein splete aan die onderkant wat dit makliker maak om van buite aan die fotone te koppel.

Stap 5: Slinky Toys ?? O, myne

Slinky Toys ?? O, myne!
Slinky Toys ?? O, myne!
Slinky Toys ?? O, myne!
Slinky Toys ?? O, myne!

Liggaam van die draak:

1. Kombineer drie slinkies met warm gom of band.

2. Meet die lengte en deursnee van die snye en sny 'n stuk dekoratiewe stof.

3. Bring die twee ente van die stof en werk dit vas.

4. As u klaar is met die naaldwerk, skuif u die slinkies soos 'n sokkie in.

5. Werk die punte van die slinky vas aan die toegewerkte stof.

Stap 6: Druk u draak af

3D -gedrukte dele van die draak:

1. Die onderdele is geneem van

2. Ons het slegs die kop, bene en die oë gebruik.

3. Na 3D -druk van die deel, maak dit glad met skuurpapier en asetoon.

4. Verf die dele soos jy dit wil versier.

Stap 7: Tyd om u draak op te skerp met NeoPixels

Tyd om u draak op te skerp met NeoPixels!
Tyd om u draak op te skerp met NeoPixels!
Tyd om u draak op te skerp met NeoPixels!
Tyd om u draak op te skerp met NeoPixels!

Ligte segment:

1. U kan eenvoudig 'n neopixel -draad gebruik om die ligte te skep as u wil (ons het uit die drade gehardloop).

2. Ons het 20 neopixel ligte gebruik en dit met drade verbind. Hierdie drade is daarop gesoldeer en met rooi bedrading aan die foton verbind, sodat dit by die tema van die draak pas.

3. U kan u neopixelligte ook op 'n lang stuk lap vaswerk, maar ons het dit nie gebruik nie, want ons het 'n gladde metaal gemaak.

Montering van die dele: Bevestig die ligte segment binne -in die liggaam van die draak met drade of drade. Maak seker dat u die ligte kan koppel aan die foton in die basiskas. Heg die kop, bene en die stert met gom aan die lyf vas. Sodra hulle op hul plek is, bevestig die liggaam in die gladde houers wat ons voorheen gedruk het. Nou is die liggaam gereed om geprogrammeer te word.

Stap 8: programmeertyd

Aangesien ons twee deeltjiefotone sal gebruik om met ses afsonderlike servomotore te werk (een foton kan slegs met vier werk), skryf ons twee afsonderlike maar soortgelyke kodes wat op die mikrobeheerders geflits moet word.

Nou, vir die eerste mikrobeheerder …

Sluit die volgende biblioteke en definisies in 'n Arduino -lêer (.ino) in:

#sluit "neopixel.h" in

#sluit "ArduinoJson.h" in

#definieer PIXEL_PIN D4

#definieer PIXEL_COUNT 18

Verklaar vervolgens die volgende veranderlikes:

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; // moet tussen 0 en 180 (in grade) int positionUpDown_2 = 180 wees; // moet tussen 0 en 180 (in grade) int leftRight_2 = 1 wees; // 0 = links, 1 = regs int upDown_2 = 1; // 0 = up, 1 = down 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) + 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 (2) + JSON_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; float temperatureArray [3]; float humiditeitArray [3]; dryf windSpeedArray [3]; Stem tydstempelArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Klik hier om te leer hoe u webhooks instel. As u klaar is, voeg die volgende verklarings en funksies by en maak, indien nodig, toepaslike veranderings:

void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Timer timerWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } Timer timerWeatherCurrent (60000, getCurrentWeather);

Die volgende funksies beheer die op/af en links/regs bewegings van die draak:

void changeLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; as (positionLeftRight_1> 100) {leftRight_1 = 0; }} anders {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; as (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }

leegte changeLeftRight2 () {

as (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1]; as (positionLeftRight_2> 100) {leftRight_2 = 0; }} anders {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1]; as (positionLeftRight_2 <0) {leftRight_2 = 1; }} servoLeftRight_2.write (positionLeftRight_2); }

leegte veranderUpDown1 () {

as (upDown_1) {positionUpDown_1 ++; as (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} anders {positionUpDown_1--; as (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }

leegte veranderUpDown2 () {

as (upDown_2) {positionUpDown_2 ++; as (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} anders {positionUpDown_2--; as (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }

Om die bewegings binne 'n interval te kan verander, word timers geskep.

Timer timerLeftRight1 (100, changeLeftRight1);

Timer timerLeftRight2 (100, changeLeftRight2); Timer timerUpDown1 (10, changeUpDown1); Timer timerUpDown2 (10, changeUpDown2);

Die opstelfunksie word uiteindelik vervolgens bygevoeg. Maak seker dat u die kodereëls wat met webhooks handel, toepaslik verander.

ongeldige opstelling () {// begin die weertydteller timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Plaas inisialisering soos pinMode en begin funksies hier. // Stel die Micro Servo servoLeftRight_1.attach op (D1); servoUpDown_1.aanheg (D0); servoLeftRight_2.aanheg (D3); servoUpDown_2.aanheg (D2); servoLeftRight_1.write (positionLeftRight_1); // initialiseer servoposisie servoUpDown_1.write (positionUpDown_1); // initialiseer servoposisie servoLeftRight_2.write (positionLeftRight_2); // initialiseer servoposisie servoUpDown_2.write (positionUpDown_2); // initialiseer servoposisie timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Maak 'n konsole oop Serial.begin (9600); vertraging (2000); Serial.println ("Hallo!"); // Teken in op die get_weather5DayForecast en get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

'N Lusfunksie word nie vir hierdie projek gebruik nie. Ons kan nie die funksies vergeet om die data wat van die webhooks ontvang is, te hanteer nie!

void gotWeather5DayForecast (const char *event, const char *data) {allData5DaysForecast += data; // stoor al die data in een string. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // skep 'n buffer vir die string int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); // Toets of ontleding slaag. as (! root.success ()) {//Serial.println("Parsing vir weervoorspelling vir 5 dae … FOUT! "); terugkeer; } int i = 1; JsonArray & list = root ["lys"]; vir (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; vlottemperatuur = main ["temp"]; int humiditeit = main ["humiditeit"]; JsonObject & weather = currentObject ["weer"] [0]; const char* weatherInfo = weer ["main"]; float windSpeed = currentObject ["wind"] ["snelheid"]; const char* tydstempel = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatuur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; humiditeitArray = humiditeit; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = tydstempel; ek ++; } anders {breek; }}}

void gotCurrentWeatherData (const char *event, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); // Toets of ontleding slaag. as (! root.success ()) {//Serial.println("Parsering vir huidige weer … FOUT! "); terugkeer; } JsonObject & weather = root ["weer"] [0]; const char* weather_main = weer ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["humiditeit"]; float wind_speed = root ["wind"] ["spoed"]; const char* tydstempel = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (weer_hoof, 0); weatherArray [0] = weer_hoof; temperatureArray [0] = tempFah; humiditeitArray [0] = hoofvochtigheid; windSpeedArray [0] = windspoed; timestampArray [0] = tydstempel; }

Hieronder vind u addisionele funksies wat die opdatering van die posisies van die servomotore beheer, die omskakeling van temperatuur van Kelvin na Fahrenheit en die kleure van die LED's.

int updateUpDown (float temp) {// Map die graad tot 'n reeks [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("nuwe servograad:"); Serial.println (servoMaxDegree); stuur servoMaxDegree terug; }

int updateleftRight (float windSpeed) {

// Stel die windsnelheid in 'n reeks [1, 100] vlot servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("nuwe servo -inkrementwaarde:"); Serial.println (servoIncrement); stuur servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67; terugkeer tempFah; }

void setColor (String weatherDesc, int index) {

int ledIndex = 0; as (indeks == 0) {ledIndex = 0; } anders as (indeks == 1) {ledIndex = 6; } anders as (index == 2) {ledIndex = 12; } anders {terugkeer; } if (weatherDesc == "Clear") {// geel vir (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // geel strook.vertoon (); vertraging (20); }} anders as (weatherDesc == "Wolke") {// grys vir (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // grys strook.show (); vertraging (20); }} anders as (weatherDesc == "Sneeu") {// wit vir (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // wit strook.show (); vertraging (20); }} anders as (weatherDesc == "Rain") {// blou vir (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // blou strook.show (); vertraging (20); }} anders {// rooi vir (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // rooi strip.show (); vertraging (20); }}}

Sodra u alles by u Arduino -lêer gevoeg het, stel dit saam. As daar geen foute is nie, moet u die kode na die eerste foton flits. Die volgende stap gee u 'n soortgelyke kode wat op die tweede foton geplaas moet word.

Stap 9: Die programmering gaan voort

Omdat die kode vir die tweede foton byna identies is aan die een vir die eerste, word die hele kode hieronder gekopieer en geplak:

#sluit "ArduinoJson.h" in

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_SON (3) + 6)

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

String weatherArray [3];

float temperatureArray [3]; float humiditeitArray [3]; dryf windSpeedArray [3]; Stem tydstempelArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String allData5DaysForecast;

void getWeather5DayForecast ()

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

Timer timerWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 dae

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Timer timerWeatherCurrent (60000, getCurrentWeather);

leegte changeLeftRight3 () {

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

leegte veranderUpDown3 () {

as (upDown_3) {positionUpDown_3 ++; as (positionUpDown_3> upDownMaxDegree [2]) {upDown_3 = 0; }} anders {positionUpDown_3--; as (positionUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (positionUpDown_3); }

Timer timerLeftRight3 (100, changeLeftRight3);

Timer timerUpDown3 (10, changeUpDown3);

ongeldige opstelling () {

// begin die weer -tydteller timerWeatherForecast.start (); timerWeatherCurrent.start (); // Plaas inisialisering soos pinMode en begin funksies hier. // Stel die Micro Servo servoLeftRight_3.attach (D1) op; servoUpDown_3.aanheg (D0);

servoLeftRight_3.write (positionLeftRight_3); // initialiseer servoposisie

servoUpDown_3.write (positionUpDown_3); // initialiseer servoposisie

timerLeftRight3.start ();

timerUpDown3.start (); // Maak 'n konsole oop Serial.begin (9600); vertraging (2000); Serial.println ("Hallo!"); // Teken in op die get_weather5DayForecast en 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 *gebeurtenis, const char *data)

{allData5DaysForecast += data; // stoor al die data in een string. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // skep 'n buffer vir die string int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); //Serial.println(allData5DaysForecast); // Toets of ontleding slaag. as (! root.success ()) {//Serial.println("Parsing vir weervoorspelling vir 5 dae … FOUT! "); terugkeer; } int i = 1; JsonArray & list = root ["lys"]; vir (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; vlottemperatuur = main ["temp"]; int humiditeit = main ["humiditeit"]; JsonObject & weather = currentObject ["weer"] [0]; const char* weatherInfo = weer ["main"]; float windSpeed = currentObject ["wind"] ["snelheid"]; const char* tydstempel = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatuur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; humiditeitArray = humiditeit; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = tydstempel; ek ++; } anders {breek; }}}

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

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); //Serial.println (data); // Toets of ontleding slaag. as (! root.success ()) {//Serial.println("Parsering vir huidige weer … FOUT! "); terugkeer; } JsonObject & weather = root ["weer"] [0]; const char* weather_main = weer ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["humiditeit"]; float wind_speed = root ["wind"] ["spoed"]; const char* tydstempel = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; weatherArray [0] = weer_hoof; temperatureArray [0] = tempFah; humiditeitArray [0] = hoofvochtigheid; windSpeedArray [0] = windspoed; timestampArray [0] = tydstempel; }

int updateUpDown (float temp) {

// Kaart die graad tot 'n reeks [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("nuwe servograad:"); Serial.println (servoMaxDegree); stuur servoMaxDegree terug; }

int updateleftRight (float windSpeed) {

// Stel die windsnelheid in 'n reeks [1, 100] vlot servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("nuwe servo -inkrementwaarde:"); Serial.println (servoIncrement); stuur servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67; terugkeer tempFah; }

Jy het dit gedoen! U het die programmeringsafdeling van die projek bereik! Maak nou seker dat u alle bedrading en aansluitings van die servomotors en neopixels na die broodbord en mikrobeheerders maak. OPMERKING: steek die ekstra pluggies/eetstokkies deur die vertikale gleuwe op die bokse vir die linker- en regterbewegings van die liggaam. Die ander kant moet aan die liggaam van die draak gekoppel word.

Stap 10: Geniet u draak

Baie geluk! U het 'n Sinese-draak van nuuts af gebou! Al wat u hoef te doen is om agteroor te sit en te geniet van u omringende vertoning!

LET WEL: Hierdie projek is gebou as deel van 'n kursus deur Joan Bempong en Soundarya Muthuvel. Die kursusbladsy kan hier gevind word.

Aanbeveel: