Talaan ng mga Nilalaman:

Sine-ese Dragon: 10 Hakbang (na may Mga Larawan)
Sine-ese Dragon: 10 Hakbang (na may Mga Larawan)

Video: Sine-ese Dragon: 10 Hakbang (na may Mga Larawan)

Video: Sine-ese Dragon: 10 Hakbang (na may Mga Larawan)
Video: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, Nobyembre
Anonim
Sine-ese Dragon
Sine-ese Dragon

Ang Sine-ese Dragon ay isang nakapaligid na piraso ng dekorasyon sa bahay na gumagamit ng mga paggalaw at ilaw ng mekanikal upang sabihin sa iyo ang pagtataya ng panahon para sa susunod na tatlong tatlong oras na agwat. Sa pamamagitan ng kahulugan, inilalarawan ng paligid ang agarang paligid ng isang bagay; kaya't napagpasyahan na maging angkop na isama ang data ng panahon sa isang nakapaligid na display. Ang panahon ay isang aspeto na hindi sinasadyang binabago ang araw ng mga tao at isang piraso ng impormasyon na patuloy na nagbabago bawat minuto, o kahit na hanggang sa segundo.

Ang Chinese Dragon ay "isang simbolo ng kapangyarihan, lakas, at suwerte" at madalas na gaganapin sa isang mataas na kultural at tradisyonal na halaga sa buong subcontient ng Asya. Bilang karagdagan sa pagdadala ng magandang kapalaran, ang Chinese Dragon ay sinasabing may malakas na kapangyarihan na kumokontrol sa "tubig, ulan, bagyo, at pagbaha." Sa huli, ang Chinese Dragon ay itinuring na angkop na kumatawan sa data ng panahon.

Pagpapakita

Ang Sine-ese Dragon ay minamanipula sa anim na pangunahing puntos sa tatlong magkakahiwalay na seksyon na kumakatawan sa pagtataya ng panahon sa loob ng tatlong 3 oras na agwat. Para sa bawat 3-oras na agwat, isasama ang sumusunod na impormasyon:

  • Paglalarawan ng panahon - tinutukoy ang kulay ng kasalukuyang impormasyon sa panahon.
  • Temperatura - tinutukoy ang taas ng katawan
  • Humidity - kumukurap ng mga LED segment
  • Bilis ng hangin - kinokontrol ang bilis ng katawan na gumagalaw pakaliwa at pakanan.

Mga Materyal na Kinakailangan

  1. 3 mm playwud / Cardboard
  2. 5 mm mga kahoy na dowel o chopstick
  3. 2 Mga Photicle ng Particle
  4. 3 slinky laruan
  5. 6 servo motor
  6. Mga ilaw ng NeoPixel (alinman sa isang strand o indibidwal na mga ilaw na natahi magkasama)
  7. Maraming sobrang Pandikit
  8. Conductive thread
  9. Pinturang acrylic
  10. Pandekorasyon na tela
  11. Laser pamutol
  12. 3d printer

Hakbang 1: Pataas at Pababa

Taas at baba!
Taas at baba!
Taas at baba!
Taas at baba!
Taas at baba!
Taas at baba!

Ang iyong unang hakbang sa pagbuo ng Sine-ese Dragon ay upang buuin ang sangkap na kumokontrol sa pataas at pababang paggalaw ng katawan. Napakaganyak!

  1. I-download ang mga file ng Adobe Illustrator (.ai) at i-print ang mga ito gamit ang isang laser cutter machine.

    ang upDownBoxWithPlatform.ai ay dapat na naka-print sa isang karton

  2. I-download ang mga 3D file sa pag-print (.stl) at gamitin ang iyong paboritong 3D printer upang mai-print ang mga ito.

    Hindi mahalaga ang kulay para sa disk o sa turner ng disk. Sa pangalawang imahe, ang disk turner ay naipasok sa loob ng butas ng disk

  3. Ipunin ang unang dalawang sangkap at idikit ito tulad ng ipinakita sa larawan 3 hanggang 5.

    1. Ang plataporma
    2. Ang mga uka para sa disc
  4. Ngayon, pagsamahin ang kahon sa pagsunod sa mga tip sa ibaba.

    1. Ang mga wire ng servo ay dapat dumaan sa hugis-parihaba na bukana sa gilid ng kahon.
    2. Ang pinakamaikling dulo ng disk turner ay nakakabit sa servo head at ang mas mahabang dulo ay dumaan sa butas ng kabilang panig ng kahon na may isang bilog na butas dito. Ito ay ipinakita sa larawan 6.
  5. Ngayon, kailangan namin ng isang bagay upang matiyak na ang platform ay mananatiling leveled kapag ang disk ay nakabukas. Gupitin ang chopstick sa 75 mm na mahabang stick (larawan 7) at idikit ang mga ito sa tuktok ng kahon sa tuktok ng platform gamit ang mainit na pandikit. Siguraduhin na ang mga stick ay na-level down sa 90 degree sa platform.
  6. Magpasok ng isang 212 mm ang haba ng stick sa gitnang butas sa tuktok ng kahon papunta sa platform.

Ang sweet! Ngayon mayroon kang isang kumpletong kahon (larawan 8) para sa pataas at pababa na paggalaw ng dragon. Ngayon, ulitin ang mga hakbang sa itaas nang dalawang beses pa!

Hakbang 2: Paano Tungkol sa Kaliwa at Kanan ?

Kumusta naman ang Kaliwa't Kanan ?!
Kumusta naman ang Kaliwa't Kanan ?!
Kumusta naman ang Kaliwa't Kanan ?!
Kumusta naman ang Kaliwa't Kanan ?!
Kumusta naman ang Kaliwa't Kanan ?!
Kumusta naman ang Kaliwa't Kanan ?!
Kumusta naman ang Kaliwa't Kanan ?!
Kumusta naman ang Kaliwa't Kanan ?!

Ngayon, hindi natin nakakalimutan ang kaliwa at kanang kilusan ng Sine-ese Dragon, hindi ba? Tumalon tayo sa ikalawang hakbang!

  1. I-download ang mga file ng Adobe Illustrator (.ai) at i-print ang mga ito gamit ang isang laser cutter machine.

    1. leftRightBoxWithPlatforms.ai dapat na naka-print sa isang karton.
    2. Ang armTurner.ai file ay dapat na naka-print sa isang materyal na 3 mm ang kapal.
  2. I-download ang mga 3D file sa pag-print (.stl) at gamitin ang iyong paboritong 3D printer upang mai-print ang mga ito.

    Tiyaking nai-print mo ang dalawa sa mga braso! Hindi mahalaga ang kulay dito

  3. Ipunin ang dalawang platform nang magkasama tulad ng ipinakita sa larawan 3 gamit ang mainit na pandikit.
  4. Isama ang kahon. Habang maaaring mahirap gawin ito, mas madaling makamit ang:

    1. Ipasok ang dalawang platform sa pagitan ng dalawang malalaking slits sa magkabilang panig ng kahon.
    2. Ang paglalagay ng unang braso sa tuktok ng itaas na platform.
    3. Ang pag-thread sa braso sa pamamagitan ng braso at pagkatapos ay ang itaas na platform.
    4. Ang paglalagay ng pangalawang braso sa tuktok ng ilalim na platform.
    5. Ang pag-thread sa braso sa pamamagitan ng pangalawang braso at pagkatapos ay sa ilalim ng platform.
    6. Pagdikit ng turner ng braso sa pamamagitan ng parihabang pagbubukas ng 3D print arm turner.
    7. Ang kabilang dulo ng turner ay napupunta sa tuktok ng motor na servo.
    8. Idagdag ang kahon ng tuktok, ibaba, at likod.

Ang iyong panghuling naka-ipon na kahon ay dapat magmukhang pang-anim na larawan. Ngayon, maaari mo nang ulitin ang dalawa pang beses!

Sa pagtatapos ng hakbang na ito, dapat kang magkaroon ng anim na kahon na may tatlong bawat isa sa mga pataas / pababa at kaliwa / kanang mga sistema ng paggalaw.

Hakbang 3: Pagpigil sa Katawan … PAANO?

Pagpipigil sa Katawan … PAANO?
Pagpipigil sa Katawan … PAANO?

Magandang tanong! Iyon ay kapag dumating ang mga naka-print na slinky na may hawak ng 3D. I-download ang kasama na.stl file at i-print ito gamit ang isang 3D printer. Siguraduhing mai-print ang 6 na may hawak sa kabuuan para sa 6 na magkakaibang mga kahon.

Kung nakita mo ang larawan ng may tsinelas na may-ari sa itaas, ang sorpresa ay nasira - iyon ang kulay ng aming Sine-ese Dragon!

Hakbang 4: Ngunit Ang Mga Kahon Ay Hindi Maganda …

At pumayag ako! Ito ang dahilan kung bakit gagamit kami ng isang laser cutter upang i-cut ang isang mas kaakit-akit na kahon upang maglaman ng lahat ng mga kahon na iyon at maitago ang mga ito.

I-download ang mga file ng Adobe Illustrator at gupitin ang mga ito gamit ang laser cutter. Ang disenyo ng mga ulap ay iginuhit ng kamay ng isa sa mga nag-ambag. Huwag mag-atubiling baguhin ang mga ito sa pamamagitan ng pag-alis sa kanila sa loob ng file ng ilustrador at pagdaragdag ng iyong sariling disenyo ayon sa nakikita mo na naaangkop! Nasa ibaba ang mga iminungkahing hakbang sa pagsasama-sama ng lahat.

  1. Ipunin at idikit ang lahat ng tatlong mga piraso mula sa unang file (panlabas naBoxFinal_1) na magkasama.
  2. Huwag idagdag ang piraso mula sa pangalawang file (panlabas naBoxFinal_2).
  3. Ilagay ang piraso mula sa pangatlong file (externalBoxFinal_3) hanggang sa ilalim ng kahon at dapat itong isara sa itaas. Pandikit LAMANG sa ilalim ng kahon.
  4. I-print ang innerBoxesPlatform nang dalawang beses. Ipako ang dalawang piraso na mayroong magkakasamang mga butas na rektanggulo sa kanila. Pagkatapos, idikit ang tatlo sa mga natitirang piraso. Panghuli, idikit ito sa iba pang nakadikit na hanay na may mga butas sa mga ito.
  5. Ilagay ang platform sa ilalim ng malaking kahon.
  6. Ipasok ang lahat ng 6 na mas maliit na mga kahon sa kanilang kaukulang mga spot sa platform.
  7. Ngayon, ilagay ang piraso mula sa pangalawang file (externalBoxFinal_2) sa tuktok ng kahon at kola sa paligid ng gilid. Ang mga butas sa tuktok na piraso ay dapat na nakahanay sa mga butas sa mas maliit na mga kahon. Kung hindi, muling ayusin ang iyong mas maliit na mga kahon. Huwag magdagdag ng pandikit sa mas maliit na mga kahon.
  8. Kung gumagamit ka ng isang breadboard na may isang malagkit na piraso sa ilalim, ilagay ito malapit sa gitna ng ibabang piraso sa isang lugar na kapag isinara mo ang kahon, dapat mawala ang breadboard kasama ang mga Photon. Mayroong maliliit na slits sa ilalim ng piraso na ginagawang madali para sa iyo upang kumonekta sa mga Larawan mula sa labas.

Hakbang 5: Mga Slinky Laruan ?? Ay naku

Mga Slinky Laruan ?? Ay naku!
Mga Slinky Laruan ?? Ay naku!
Mga Slinky Laruan ?? Ay naku!
Mga Slinky Laruan ?? Ay naku!

Katawan ng dragon:

1. Pagsamahin ang tatlong mga slinky na magkasama gamit ang mainit na pandikit o tape.

2. Sukatin ang haba at diameter ng mga slinkies at gupitin ang isang piraso ng tela ng pandekorasyon.

3. Dalhin ang dalawang dulo ng tela at tahiin ito.

4. Kapag tapos ka na sa pagtahi sa kanila, i-slide ang mga slinky na tulad ng isang medyas.

5. Tahiin ang mga dulo ng madulas sa natahi na tela.

Hakbang 6: I-print ang Iyong Dragon

3D na naka-print na mga bahagi ng dragon:

1. Ang mga bahagi ay kinuha mula sa

2. Ang ulo, binti at mata lamang ang ginamit namin.

3. Matapos i-print ng 3D ang bahagi, pakinisin ito gamit ang liha at acetone.

4. Kulayan ang mga bahagi sa paraang nais mong palamutihan ito.

Hakbang 7: Oras upang Maitaas ang Iyong Dragon Sa Mga NeoPixels

Oras upang Paikutin ang Iyong Dragon Sa Mga NeoPixels!
Oras upang Paikutin ang Iyong Dragon Sa Mga NeoPixels!
Oras upang Paikutin ang Iyong Dragon Sa Mga NeoPixels!
Oras upang Paikutin ang Iyong Dragon Sa Mga NeoPixels!

Banayad na segment:

1. Maaari mo lamang gamitin ang isang neopixel strand upang lumikha ng mga ilaw kung nais mo. (Naubusan kami ng mga hibla).

2. Gumamit kami ng 20 mga ilaw ng neopixel at ikinonekta ito gamit ang mga wire. Ang mga wire na ito ay na-solder sa kanila at nakakonekta sa poton gamit ang pulang mga kable upang tumutugma ito sa tema ng dragon.

3. Maaari mo ring tahiin ang iyong mga ilaw ng neopixel sa isang mahabang tela, ngunit hindi namin ito ginamit dahil mayroon kaming isang slinky na gawa sa metal.

Assembly ng mga bahagi: I-secure ang light segment sa loob ng katawan ng dragon gamit ang mga thread o wires. Tiyaking nakakonekta mo ang mga ilaw sa photon sa loob ng base box. Ikabit ang ulo, binti at buntot sa katawan gamit ang pandikit. Kapag nakalagay na ang mga ito, i-secure ang katawan sa mga slinky na may hawak na na-print namin dati. Ngayon ang katawan ay handa nang mai-program.

Hakbang 8: Oras ng Programming

Dahil gagamit kami ng dalawang Particle Photon upang gumana kasama ang anim na magkakahiwalay na servo motor (ang isang Photon ay maaari lamang gumana sa apat), magsusulat kami ng dalawang magkakahiwalay ngunit magkatulad na mga code na mai-flash sa mga microcontroller.

Ngayon, para sa unang microcontroller…

Sa isang Arduino file (.ino), isama ang mga sumusunod na aklatan at tumutukoy sa:

# isama ang "neopixel.h"

# isama ang "ArduinoJson.h"

# tukuyin ang PIXEL_PIN D4

# tukuyin ang PIXEL_COUNT 18

Susunod, ideklara ang mga sumusunod na variable:

Adafruit_NeoPixel strip = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN);

Servo servoLeftRight_1; Servo servoUpDown_1; Servo servoLeftRight_2; Servo servoUpDown_2; int posisyonLeftRight_1 = 0; int posisyonUpDown_1 = 0; int leftRight_1 = 1; int upDown_1 = 1; int posisyonLeftRight_2 = 100; // ay dapat na nasa pagitan ng 0 at 180 (sa degree) int posisyonUpDown_2 = 180; // ay dapat na nasa pagitan ng 0 at 180 (sa degree) int leftRight_2 = 1; // 0 = left, 1 = right int upDown_2 = 1; // 0 = pataas, 1 = pababa ng laki ng laki_t bufferSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2 * JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + JSONSON_OBJECT (5) + JSONSON_OBJECT 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_SIJECT_SIJECT_SIZE (38) (5) + 76 * JSON_OBJECT_SIZE (8) + 12490; String panahonArray [3]; temperatura ng floatArray [3]; lumutang halumigmig Array [3]; lumutang hanginSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String lahatData5DaysForecast;

Mag-click dito upang malaman kung paano mag-set up ng mga webhook. Kapag tapos ka na, idagdag ang mga sumusunod na deklarasyon at pag-andar at gumawa ng mga naaangkop na pagbabago kung kinakailangan:

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

Kinokontrol ng mga sumusunod na pagpapaandar ang pataas / pababa at kaliwa / kanang paggalaw ng dragon:

void changeLeftRight1 () {if (leftRight_1) {posisyonLeftRight_1 = posisyonLeftRight_1 + leftRightSpeed [0]; kung (posisyonLeftRight_1> 100) {leftRight_1 = 0; }} iba pa {posisyonLeftRight_1 = posisyonLeftRight_1 - leftRightSpeed [0]; kung (posisyonLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (posisyonLeftRight_1); }

walang bisa ChangeLeftRight2 () {

kung (leftRight_2) {posisyonLeftRight_2 = posisyonLeftRight_2 + leftRightSpeed [1]; kung (posisyonLeftRight_2> 100) {leftRight_2 = 0; }} iba pa {posisyonLeftRight_2 = posisyonLeftRight_2 - leftRightSpeed [1]; kung (posisyonLeftRight_2 <0) {leftRight_2 = 1; }} servoLeftRight_2.write (posisyonLeftRight_2); }

walang bisa ang pagbabagoUpDown1 () {

kung (upDown_1) {posisyonUpDown_1 ++; kung (posisyonUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} iba pa {posisyonUpDown_1--; kung (posisyonUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (posisyonUpDown_1); }

walang bisa ang pagbabagoUpDown2 () {

kung (upDown_2) {posisyonUpDown_2 ++; kung (posisyonUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} iba pa {posisyonUpDown_2--; kung (posisyonUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (posisyonUpDown_2); }

Upang mapalitan ang mga paggalaw sa isang agwat, nilikha ang mga timer.

Timer timerLeftRight1 (100, changeLeftRight1);

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

Ang pag-andar ng pag-setup ay sa wakas ay idinagdag sa susunod. Tiyaking gumawa ng mga naaangkop na pagbabago sa mga linya ng code na nakikipag-usap sa mga webhook.

void setup () {// simulan ang mga timer ng timer timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Ilagay ang pagsisimula tulad ng pinMode at simulan ang mga pag-andar dito. // Setup ang Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (posisyonLeftRight_1); // initialize servo posisyon servoUpDown_1.write (posisyonUpDown_1); // initialize servo posisyon servoLeftRight_2.write (posisyonLeftRight_2); // initialize servo posisyon servoUpDown_2.write (posisyonUpDown_2); // initialize servo posisyon timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Buksan ang isang console Serial.begin (9600); pagkaantala (2000); Serial.println ("Hello!"); // Mag-subscribe sa get_weather5DayForecast at get_currentWeather webhooks Particle.subscribe ("hook-response / get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response / get_currentWeather / 0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Ang isang pag-andar ng loop ay hindi ginagamit para sa proyektong ito. Hindi namin makakalimutan ang mga pagpapaandar upang hawakan ang data na natanggap mula sa mga webhooks!

void gotWeather5DayForecast (const char * event, const char * data) {allData5DaysForecast + = data; // nai-save ang lahat ng data sa isang string. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // create a buffer for the string int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); // Subukan kung magtagumpay ang pag-parse. kung (! root.success ()) {//Serial.println("Parsing para sa taya ng panahon 5 araw… ERROR! "); bumalik; } int i = 1; JsonArray & list = root ["list"]; para sa (JsonObject & currentObject: list) {kung (i <3) {JsonObject & main = currentObject ["main"]; temperatura ng float = pangunahing ["temp"]; int halumigmig = pangunahing ["kahalumigmigan"]; JsonObject & panahon = kasalukuyangObject ["panahon"] [0]; const char * weatherInfo = panahon ["main"]; float windSpeed = kasalukuyangObject ["hangin"] ["bilis"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperaturaArray = tempFah; kahalumigmiganArray = halumigmig; panahonArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; ako ++; } iba pa {masira; }}}

void gotCurrentWeatherData (const char * event, const char * data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); // Subukan kung magtagumpay ang pag-parse. kung (! root.success ()) {//Serial.println("Parsing para sa kasalukuyang panahon… ERROR! "); bumalik; } JsonObject & weather = root ["panahon"] [0]; const char * weather_main = panahon ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = pangunahing ["kahalumigmigan"]; float wind_speed = root ["wind"] ["speed"]; const char * timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (weather_main, 0); panahonArray [0] = panahon_main; temperaturaArray [0] = tempFah; kahalumigmiganArray [0] = main_humidity; windSpeedArray [0] = wind_speed; timestampArray [0] = timestamp; }

Sa ibaba, maaari kang makahanap ng mga karagdagang pag-andar na makokontrol ang pag-update ng mga posisyon ng servo motor, ang pagbabago ng temperatura mula sa Kelvin patungong Fahrenheit at pagtatakda ng mga kulay ng mga LED.

int updateUpDown (float temp) {// Mapa ang degree sa isang saklaw na [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("bagong servo degree:"); Serial.println (servoMaxDegree); ibalik ang servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Map ang bilis ng hangin sa isang saklaw ng [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("bagong halaga ng pagtaas ng servo:"); Serial.println (servoIncrement); ibalik ang servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

void setColor (String weatherDesc, int index) {

int ledIndex = 0; kung (index == 0) {ledIndex = 0; } iba pa kung (index == 1) {ledIndex = 6; } iba pa kung (index == 2) {ledIndex = 12; } iba pa {bumalik; } kung (weatherDesc == "I-clear") {// dilaw para sa (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // dilaw na strip.show (); pagkaantala (20); }} iba pa kung (weatherDesc == "Clouds") {// grey para sa (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // grey strip.show (); pagkaantala (20); }} iba pa kung (weatherDesc == "Snow") {// puti para sa (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // white strip.show (); pagkaantala (20); }} iba pa kung (weatherDesc == "Rain") {// blue for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // blue strip.show (); pagkaantala (20); }} iba pa {// pula para sa (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // red strip.show (); pagkaantala (20); }}}

Kapag nakuha mo na ang lahat ng naidagdag sa iyong Arduino file, ipunin ito. Kung walang mga error, magpatuloy at i-flash ang code sa unang Photon. Ang susunod na hakbang ay magbibigay sa iyo ng katulad na code na mai-flash sa pangalawang Photon.

Hakbang 9: Nagpapatuloy ang Programming

Dahil ang code para sa pangalawang Photon ay halos magkapareho sa isa para sa una, ang buong code ay nakopya at na-paste sa ibaba:

# isama ang "ArduinoJson.h"

Servo servoLeftRight_3;

Servo servoUpDown_3;

int posisyonLeftRight_3 = 45;

int posisyonUpDown_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_OBJECT_SIZE (6) + J0_0 (J)

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

String panahonArray [3];

temperatura ng floatArray [3]; lumutang halumigmig Array [3]; lumutang hanginSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String lahatData5DaysForecast;

walang bisa getWeather5DayForecast ()

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

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

walang bisa getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Timer timerWeatherCurrent (60000, getCurrentWeather);

walang bisa ChangeLeftRight3 () {

kung (leftRight_3) {posisyonLeftRight_3 = posisyonLeftRight_3 + leftRightSpeed [2]; kung (posisyonLeftRight_3> 100) {leftRight_3 = 0; }} iba pa {posisyonLeftRight_3 = posisyonLeftRight_3 - leftRightSpeed [2]; kung (posisyonLeftRight_3 <0) {leftRight_3 = 1; }} servoLeftRight_3.write (posisyonLeftRight_3); }

walang bisa ang pagbabagoUpDown3 () {

kung (upDown_3) {posisyonUpDown_3 ++; kung (posisyonUpDown_3> upDownMaxDegree [2]) {upDown_3 = 0; }} iba pa {posisyonUpDown_3--; kung (posisyonUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (posisyonUpDown_3); }

Timer timerLeftRight3 (100, changeLeftRight3);

Timer timerUpDown3 (10, changeUpDown3);

walang bisa ang pag-setup () {

// simulan ang timer ng timer timerWeatherForecast.start (); timerWeatherCurrent.start (); // Ilagay ang pagsisimula tulad ng pinMode at simulan ang mga pag-andar dito. // Setup ang Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (posisyonLeftRight_3); // ipasimula ang posisyon ng servo

servoUpDown_3.write (posisyonUpDown_3); // ipasimula ang posisyon ng servo

timerLeftRight3.start ();

timerUpDown3.start (); // Buksan ang isang console Serial.begin (9600); pagkaantala (2000); Serial.println ("Hello!"); // Mag-subscribe sa get_weather5DayForecast at 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 + = data; // nai-save ang lahat ng data sa isang string. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // create a buffer for the string int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); //Serial.println(allData5DaysForecast); // Subukan kung magtagumpay ang pag-parse. kung (! root.success ()) {//Serial.println("Parsing para sa taya ng panahon 5 araw… ERROR! "); bumalik; } int i = 1; JsonArray & list = root ["list"]; para sa (JsonObject & currentObject: list) {kung (i <3) {JsonObject & main = currentObject ["main"]; temperatura ng float = pangunahing ["temp"]; int halumigmig = pangunahing ["kahalumigmigan"]; JsonObject & panahon = kasalukuyangObject ["panahon"] [0]; const char * weatherInfo = panahon ["main"]; float windSpeed = kasalukuyangObject ["hangin"] ["bilis"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperaturaArray = tempFah; kahalumigmiganArray = halumigmig; panahonArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; ako ++; } iba pa {masira; }}}

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

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); //Serial.println(data); // Subukan kung magtagumpay ang pag-parse. kung (! root.success ()) {//Serial.println("Parsing para sa kasalukuyang panahon… ERROR! "); bumalik; } JsonObject & weather = root ["panahon"] [0]; const char * weather_main = panahon ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = pangunahing ["kahalumigmigan"]; float wind_speed = root ["wind"] ["speed"]; const char * timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; panahonArray [0] = panahon_main; temperaturaArray [0] = tempFah; kahalumigmiganArray [0] = main_humidity; windSpeedArray [0] = wind_speed; timestampArray [0] = timestamp; }

int updateUpDown (float temp) {

// Map ang degree sa isang saklaw ng [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("bagong servo degree:"); Serial.println (servoMaxDegree); ibalik ang servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Map ang bilis ng hangin sa isang saklaw ng [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("bagong halaga ng pagtaas ng servo:"); Serial.println (servoIncrement); ibalik ang servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

Nagawa mo! Natapos mo ito sa seksyon ng programa ng proyekto! Ngayon, tiyaking gawin ang lahat ng mga kable at koneksyon mula sa mga servo motor at neopixel sa breadboard at microcontrollers. TANDAAN: ipasok ang labis na mga dowel / chopstick sa pamamagitan ng mga patayong slits sa mga kahon para sa kaliwa at kanang mga paggalaw ng katawan. Ang kabilang dulo ay dapat na konektado sa katawan ng dragon.

Hakbang 10: Masiyahan sa Iyong Dragon

Binabati kita! Bumuo ka ng isang Sine-ese Dragon mula sa simula! Ngayon ang kailangan mo lang gawin ay umupo at masiyahan sa iyong ambient display!

TANDAAN: Ang proyektong ito ay itinayo bilang isang bahagi ng isang coursework nina Joan Bempong at Soundarya Muthuvel. Ang pahina ng kurso ay matatagpuan dito.

Inirerekumendang: