Mundarija:

Sine-ese ajdaho: 10 qadam (rasmlar bilan)
Sine-ese ajdaho: 10 qadam (rasmlar bilan)

Video: Sine-ese ajdaho: 10 qadam (rasmlar bilan)

Video: Sine-ese ajdaho: 10 qadam (rasmlar bilan)
Video: ИИИ БУ НИМА КИЛЯПТИ И #chingiz 2024, Noyabr
Anonim
Sine-ese ajdaho
Sine-ese ajdaho

Sine-ese Dragon-bu atrof-muhitni bezatuvchi qism bo'lib, u sizga mexanik harakatlar va yorug'lik yordamida keyingi uch soatlik ob-havo ma'lumotlarini aytib beradi. Ta'rif bo'yicha, atrof -muhit biror narsaning yaqin atrofini tasvirlaydi; shu sababli ob -havo ma'lumotlarini atrof -muhit displeyiga kiritish maqsadga muvofiq deb topildi. Ob -havo - bu odamlarning kunini tasodifan o'zgartiradigan va har daqiqada, hatto sekundgacha o'zgarib turadigan ma'lumot.

Xitoy ajdaho "kuch, kuch va omad ramzi" bo'lib, ko'pincha Osiyo yarim qit'asida yuqori madaniy va an'anaviy qadriyatlarga ega. Xitoy ajdaho omad keltirishdan tashqari, "suv, yomg'ir, tayfun va toshqinlarni" boshqaradigan kuchli kuchlarga ega ekanligi aytiladi. Oxir -oqibat, Xitoy ajdaho ob -havo ma'lumotlarini ko'rsatishga mos deb topildi.

Vizualizatsiya

Sine-ese ajdaho uchta alohida bo'limda oltita asosiy nuqtada boshqariladi, ular 3 soatlik oraliqdagi ob-havo ma'lumotlarini aks ettiradi. Har 3 soatlik interval uchun quyidagi ma'lumotlar kiritiladi:

  • Ob -havo tavsifi - ob -havo ma'lumotlarining rangini aniqlaydi.
  • Harorat - tananing balandligini bildiradi
  • Namlik - LED segmentlarining miltillashi
  • Shamol tezligi - tananing chap va o'ngga harakatlanish tezligini boshqaradi.

Kerakli materiallar

  1. 3 mm kontrplak/karton
  2. 5 mm yog'och dublonlar yoki tayoqchalar
  3. 2 zarracha fotonlar
  4. 3 Achchiq o'yinchoqlar
  5. 6 ta servo dvigatel
  6. NeoPixel chiroqlari (ip yoki alohida chiroqlar birgalikda tikilgan)
  7. Ko'p super elim
  8. Supero'tkazuvchilar ip
  9. Akril bo'yoq
  10. Dekorativ mato
  11. Lazerli kesuvchi
  12. 3D printer

1 -qadam: yuqoriga va pastga

Tepaga va pastga!
Tepaga va pastga!
Tepaga va pastga!
Tepaga va pastga!
Tepaga va pastga!
Tepaga va pastga!

Sine-ese Dragonni qurishda sizning birinchi qadamingiz tananing yuqoriga va pastga harakatini boshqaruvchi komponentni qurishdir. Qanday hayajonli!

  1. Adobe Illustrator fayllarini (.ai) yuklab oling va ularni lazerli kesish mashinasi yordamida chop eting.

    upDownBoxWithPlatform.ai kartonga bosilishi kerak

  2. 3D bosib chiqarish fayllarini (.stl) yuklab oling va ularni chop etish uchun sevimli 3D printeringizdan foydalaning.

    Rang disk uchun ham, disk aylanishi uchun ham muhim emas. Ikkinchi rasmda, diskni aylantirgichi disk teshigiga joylashtirilgan

  3. Birinchi ikkita komponentni yig'ing va ularni 3-5 rasmlarda ko'rsatilgandek yopishtiring.

    1. Platforma
    2. Disk uchun oluklar
  4. Endi, quyidagi maslahatlarga amal qilib, qutini yig'ing.

    1. Servo simlari qutining yon tomonidagi to'rtburchaklar teshikdan o'tishi kerak.
    2. Disk aylantirgichining eng qisqa uchi servo boshga ulanadi va uzunroq uchi qutining boshqa tomonidagi teshikdan o'tib, dumaloq teshikka ega bo'ladi. Bu 6 -rasmda ko'rsatilgan.
  5. Endi diskni burish paytida platformaning tekis holatda bo'lishini ta'minlash uchun bizga biror narsa kerak. Chop tayog'ini 75 mm uzunlikdagi tayoqchalarga kesib oling (7 -rasm) va ularni issiq elim yordamida qutining yuqori qismidan platformaning yuqori qismiga yopishtiring. Stiklar platformaga 90 daraja pastga tekislanganligiga ishonch hosil qiling.
  6. 212 mm uzunlikdagi tayoqchani qutining yuqori qismidagi o'rta teshikka platformaga joylashtiring.

Shirin! Endi sizda ajdarning yuqoriga va pastga harakatlanishi uchun to'liq quti bor (8 -rasm). Endi yuqoridagi amallarni yana ikki marta takrorlang!

2 -qadam: chap va o'ng haqida nima deyish mumkin?

Chap va o'ng haqida nima deyish mumkin?
Chap va o'ng haqida nima deyish mumkin?
Chap va o'ng haqida nima deyish mumkin?
Chap va o'ng haqida nima deyish mumkin?
Chap va o'ng haqida nima deyish mumkin?
Chap va o'ng haqida nima deyish mumkin?
Chap va o'ng haqida nima deyish mumkin?
Chap va o'ng haqida nima deyish mumkin?

Endi biz Sine-ese Ajdaho chap va o'ng harakatini unutib bo'lmaydi, to'g'rimi? Keling, ikkinchi bosqichga o'taylik!

  1. Adobe Illustrator fayllarini (.ai) yuklab oling va ularni lazerli kesish mashinasi yordamida chop eting.

    1. leftRightBoxWithPlatforms.ai kartonga bosilishi kerak.
    2. armTurner.ai fayli qalinligi 3 mm bo'lgan materialga bosilishi kerak.
  2. 3D bosib chiqarish fayllarini (.stl) yuklab oling va ularni chop etish uchun sevimli 3D printeringizdan foydalaning.

    Ikkita qo'lni chop etishingizga ishonch hosil qiling! Bu erda rangning ahamiyati yo'q

  3. Issiq elim yordamida 3 -rasmda ko'rsatilgandek, ikkita platformani yig'ing.
  4. Qutini yig'ing. Buni qilish qiyin bo'lsa -da, bunga erishish osonroq:

    1. Ikkita platformani qutining ikkala tomonidagi ikkita katta yoriq orasiga kiritish.
    2. Birinchi qo'lni yuqori platformaning yuqori qismiga qo'yish.
    3. Qo'lni aylantirgichni qo'l orqali, so'ngra yuqori platformadan o'tkazing.
    4. Ikkinchi qo'lni pastki platformaning yuqori qismiga joylashtirish.
    5. Burilish dastagini ikkinchi qo'l orqali, so'ngra pastki platformadan o'tkazish.
    6. 3D -bosma qo'l turnerining to'rtburchaklar teshigi orqali qo'l aylanasini yopishtirish.
    7. Turnerning boshqa uchi servo dvigatelning tepasida joylashgan.
    8. Qutiga yuqori, pastki va orqa qismlarni qo'shing.

Sizning oxirgi yig'ilgan qutingiz oltinchi rasmga o'xshash bo'lishi kerak. Endi siz buni yana ikki marta takrorlashingiz kerak!

Ushbu qadamning oxirida sizda uchta yuqoriga/pastga va chapga/o'ngga harakat tizimlari bo'lgan oltita quti bo'lishi kerak.

3 -qadam: tanani ushlab turish … QANDAY?

Tanani ushlab turish … QANDAY?
Tanani ushlab turish … QANDAY?

Yaxshi savol! O'sha paytda, 3D bosilgan egiluvchan ushlagichlar keladi. Stl faylini yuklab oling va uni 3D printer yordamida chop eting. 6 xil quti uchun jami 6 ta ushlagichni chop etishga ishonch hosil qiling.

Agar siz tepada ushlagichning rasmini ko'rgan bo'lsangiz, ajablanib buzildi - bu bizning Sine -ese Dragon -ning rangi!

4 -qadam: Ammo bu qutilar unchalik chiroyli emas …

Va men roziman! Shuning uchun biz lazerni ishlatamiz, bu qutilarning hammasini o'z ichiga oladigan va yashirish uchun yanada jozibali qutini kesib tashlaymiz.

Adobe Illustrator fayllarini yuklab oling va ularni lazer kesgich yordamida kesib oling. Bulutlar dizaynini ishtirokchilardan biri qo'lda chizgan. Ularni illyustrator faylidan olib tashlab, o'zingiz xohlagan tarzda o'zingizning dizayningizni qo'shib o'zgartiring! Quyida hamma narsani birlashtirish uchun taklif qilingan qadamlar keltirilgan.

  1. Birinchi fayldan (tashqiBoxFinal_1) barcha uch qismni yig'ing va yopishtiring.
  2. Parchani ikkinchi fayldan (tashqiBoxFinal_2) hali qo'shmang.
  3. Parchani uchinchi fayldan (tashqiBoxFinal_3) qutining pastki qismiga qo'ying va u yuqoridan yopilishi kerak. Faqat qutining pastki qismiga yopishtiring.
  4. InnerBoxesPlatform -ni ikki marta chop eting. Katta to'rtburchaklar teshiklari bo'lgan ikkita bo'lakni yopishtiring. Keyin qolgan uch qismini yopishtiring. Oxir -oqibat, uni teshiklari bo'lgan boshqa yopishtirilgan to'plamga yopishtiring.
  5. Platformani katta qutining pastki qismiga qo'ying.
  6. Hamma 6 ta kichik qutini mos keladigan joylariga joylashtiring.
  7. Endi bo'lakni ikkinchi fayldan (tashqiBoxFinal_2) qutining yuqori qismiga qo'ying va chetiga yopishtiring. Yuqori qismdagi teshiklar kichikroq qutilardagi teshiklarga to'g'ri kelishi kerak. Aks holda, kichik qutilaringizni qayta joylashtiring. Kichikroq qutilarga elim qo'shmang.
  8. Agar siz tagida yopishqoq bo'lak bo'lgan non taxtasidan foydalansangiz, uni pastki qismning o'rtasiga yaqin joylashtiring, qutini yopganingizda, foton bilan birga non paneli yo'qoladi. Pastki qismda fotonlarga tashqi tomondan ulanishni osonlashtiradigan kichik yoriqlar mavjud.

5 -qadam: Slinky o'yinchoqlar? Oh mening

Aqlli o'yinchoqlar? Oh mening!
Aqlli o'yinchoqlar? Oh mening!
Aqlli o'yinchoqlar? Oh mening!
Aqlli o'yinchoqlar? Oh mening!

Ajdaho tanasi:

1. Issiq elim yoki lenta yordamida uchta slingni birlashtiring.

2. Slinkiesning uzunligi va diametrini o'lchab, dekorativ matoning bir qismini kesib oling.

3. Matoning ikki uchini keltiring va ularni bir -biriga tikib qo'ying.

4. Siz ularni tikishni tugatganingizdan so'ng, paypoq kabi paypoqlarni ichkariga suring.

5. Slingning uchlarini tikilgan matoga tikib qo'ying.

6 -qadam: Ajdahoingizni chop eting

Ajdaho 3D bosilgan qismlari:

1. Qismlar https://www.thingiverse.com/thing:854575 saytidan olingan.

2. Biz faqat bosh, oyoq va ko'zlardan foydalandik.

3. Qismni 3D bosgandan so'ng, uni zımpara va aseton yordamida tekislang.

4. Qismlarni xohlaganingizcha bezang.

7 -qadam: NeoPixels yordamida ajdaringizni ko'tarish vaqti keldi

NeoPixels yordamida ajdaringizni ko'tarish vaqti keldi!
NeoPixels yordamida ajdaringizni ko'tarish vaqti keldi!
NeoPixels yordamida ajdaringizni ko'tarish vaqti keldi!
NeoPixels yordamida ajdaringizni ko'tarish vaqti keldi!

Yorug'lik segmenti:

1. Agar xohlasangiz, chiroqlarni yaratish uchun siz neopixel ipdan foydalanishingiz mumkin.

2. Biz 20 ta neopikselli chiroqni ishlatdik va ularni simlar yordamida uladik. Bu simlar ularga lehimlangan va ajdaho mavzusiga mos kelishi uchun qizil simlar yordamida fotonga ulangan.

3. Siz neopixel chiroqlarini uzun matoga tikishingiz mumkin, lekin biz ularni ishlatmaganmiz, chunki bizda metalldan yasalgan.

Qismlarni yig'ish: iplar yoki simlar yordamida ajdaho tanasi ichidagi yorug'lik segmentini mahkamlang. Chiroqlarni tayanch qutisi ichidagi fotonga ulashingiz mumkinligiga ishonch hosil qiling. Bosh, oyoq va dumni tanaga elim yordamida mahkamlang. Ular joyiga qo'yilgach, tanani biz ilgari bosib chiqargan ushlagichlarga mahkamlang. Endi tanani dasturlashga tayyor.

8 -qadam: Dasturlash vaqti

Biz oltita alohida servo dvigatel bilan ishlash uchun ikkita zarracha fotondan foydalanganimiz uchun (bitta foton faqat to'rttasi bilan ishlashi mumkin), biz mikrokontrolderlarda yonib turadigan ikkita alohida, lekin o'xshash kod yozamiz.

Endi birinchi mikrokontroller uchun …

Arduino fayliga (.ino) quyidagi kutubxonalarni kiriting va ta'riflaydi:

#"neopixel.h" ni qo'shing

#"ArduinoJson.h" ni qo'shing

#PIXEL_PIN D4 ni aniqlang

#ta'rif PIXEL_COUNT 18

Keyin quyidagi o'zgaruvchilarni e'lon qiling:

Adafruit_NeoPixel tasmasi = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN);

Servo servoLeftRight_1; Servo servoUpDown_1; Servo servoLeftRight_2; Servo servoUpDown_2; int pozitsiyasiLeftRight_1 = 0; int positionUpDown_1 = 0; int chapRight_1 = 1; int upDown_1 = 1; int pozitsiyasiLeftRight_2 = 100; // 0 dan 180 gacha bo'lishi kerak (darajalarda) int positionUpDown_2 = 180; // 0 dan 180 gacha bo'lishi kerak (gradusda) int leftRight_2 = 1; // 0 = chap, 1 = o'ng int upDown_2 = 1; // 0 = yuqoriga, 1 = pastga 390; const size_t bufferSizeForecast = 38*JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2*JSON_OBJECT_SIZE (0) + 112*JSON_OBJEC_SIZ_ (2) + 39*JSON_OBJEC_SIZ_ (2) (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; suzuvchi haroratArray [3]; suzuvchi namlikArray [3]; suzuvchi shamolSpeedArray [3]; Vaqt tamg'asi satrlariArray [3]; int upDownMaxDegree [3]; int chapRightSpeed [3]; AllData5DaysForecast qatori;

Veb -kancalarni sozlashni o'rganish uchun shu erni bosing. Ishingiz tugagach, quyidagi deklaratsiyalar va funktsiyalarni qo'shing va agar kerak bo'lsa, tegishli o'zgartirishlarni kiriting:

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

Quyidagi funktsiyalar ajdarning yuqoriga/pastga va chapga/o'ngga harakatini boshqaradi:

bekor qilishLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; agar (positionLeftRight_1> 100) {leftRight_1 = 0; }} boshqa {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; agar (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }

bekor qilishLeftRight2 () {

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

bekor qilishUpDown1 () {

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

bekor o'zgarishUpDown2 () {

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

Harakatlarni vaqt oralig'ida o'zgartirish uchun taymerlar yaratiladi.

Taymer taymeriLeftRight1 (100, changeLeftRight1);

Taymer taymeriLeftRight2 (100, changeLeftRight2); Taymer taymeriUpDown1 (10, changeUpDown1); Taymer taymeriUpDown2 (10, changeUpDown2);

Oxirida sozlash funktsiyasi qo'shiladi. Webhooks bilan bog'liq kod satrlariga tegishli o'zgartirishlar kiritganingizga ishonch hosil qiling.

void setup () {// ob -havo taymerlarini ishga tushiring timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // pinMode kabi ishga tushirishni qo'ying va funktsiyalarni shu erda boshlang. // Micro Servo servoLeftRight_1.attach (D1) ni sozlash; servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // servo pozitsiyasini ishga tushirish servoUpDown_1.write (positionUpDown_1); // servo pozitsiyasini ishga tushirish servoLeftRight_2.write (positionLeftRight_2); // servo pozitsiyasini ishga tushirish servoUpDown_2.write (positionUpDown_2); // servo pozitsiyasini ishga tushirish timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Konsolni oching Serial.begin (9600); kechikish (2000); Serial.println ("Salom!"); // get_weather5DayForecast va get_currentWeather veb-kancalariga obuna bo'ling Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Ushbu loyiha uchun loop funktsiyasi ishlatilmaydi. Biz veb -kancalardan olingan ma'lumotlarni qayta ishlash funktsiyalarini unuta olmaymiz!

void gotWeather5DayForecast (const char *hodisa, const char *ma'lumotlar) {allData5DaysForecast += ma'lumotlar; // barcha ma'lumotlarni bitta satrda saqlaydi. int allData5DaysForecastLen = allData5DaysForecast.length (); char bufer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (bufer, allData5DaysForecastLen + 1); // satr uchun bufer yaratish int bufferLength = sizeof (bufer); DynamicJsonBuffer jsonBufferWeather (buferLength); JsonObject & root = jsonBufferWeather.parseObject (bufer); // Tahlil muvaffaqiyatli bajarilganligini tekshiring. if (! root.success ()) {//Serial.println("5 kunlik ob -havo ma'lumotlarini tahlil qilish … XATO! "); qaytish; } int i = 1; JsonArray & list = root ["list"]; uchun (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; suzish harorati = asosiy ["temp"]; int namlik = asosiy ["namlik"]; JsonObject & weather = currentObject ["ob -havo"] [0]; const char* weatherInfo = ob -havo ["asosiy"]; float windSpeed = currentObject ["shamol"] ["tezlik"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (harorat); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (ob -havo ma'lumoti, i); temperatureArray = tempFah; namlikArray = namlik; weatherArray = ob -havo ma'lumoti; windSpeedArray = shamol tezligi; timestampArray = vaqt tamg'asi; i ++; } boshqa {tanaffus; }}}

void gotCurrentWeatherData (const char *hodisa, const char *ma'lumotlar) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (ma'lumotlar); // Tahlil muvaffaqiyatli bajarilganligini tekshiring. agar (! root.success ()) {//Serial.println("Hozirgi ob -havo ma'lumotlarini tahlil qilish … XATO! "); qaytish; } JsonObject & weather = root ["ob -havo"] [0]; const char* weather_main = ob -havo ["asosiy"]; JsonObject & main = root ["asosiy"]; float main_temp = main ["temp"]; int main_humidity = asosiy ["namlik"]; float wind_speed = ildiz ["shamol"] ["tezlik"]; const char* timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (shamol tezligi); leftRightSpeed [0] = servoIncrement; setColor (ob -havo_anaviy, 0); weatherArray [0] = ob -havo_bo'lishi; haroratArray [0] = tempFah; namlikArray [0] = asosiy namlik; windSpeedArray [0] = shamol tezligi; timestampArray [0] = vaqt tamg'asi; }

Quyida siz servo dvigatellarning pozitsiyalarini yangilash, haroratni Kelvindan Farenxaytga o'tkazish va LEDlarning ranglarini sozlashni boshqaruvchi qo'shimcha funktsiyalarni topishingiz mumkin.

int updateUpDown (float temp) {// Darajani [0, 180] oralig'ida xaritaga qo'ying servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("yangi servo daraja:"); Serial.println (servoMaxDegree); servoMaxDegree -ni qaytarish; }

int updateleftRight (o'zgaruvchan shamol tezligi) {

// Shamol tezligini [1, 100] suzuvchi servoIncrement = windSpeed * 99/26 + 1 diapazoniga moslang; Serial.print ("yangi servo o'sish qiymati:"); Serial.println (servoIncrement); qaytish servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

void setColor (String weatherDesc, int index) {

int ledIndex = 0; agar (indeks == 0) {ledIndex = 0; } boshqa if (indeks == 1) {ledIndex = 6; } if if (index == 2) {ledIndex = 12; } boshqa {qaytish; } if (weatherDesc == "Clear") {// sariq uchun (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // sariq chiziq.shou (); kechikish (20); }} else if (weatherDesc == "Bulutlar") {// kulrang (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // kulrang chiziq.show (); kechikish (20); }} else if (weatherDesc == "Qor") {// oq uchun (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // oq chiziq.show (); kechikish (20); }} else if (weatherDesc == "Yomg'ir") {// ko'k uchun (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // ko'k chiziq.show (); kechikish (20); }} boshqa {// qizil uchun (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // qizil chiziq.show (); kechikish (20); }}}

Hamma narsa Arduino faylingizga qo'shilgandan so'ng, uni kompilyatsiya qiling. Hech qanday xato bo'lmasa, davom eting va kodni birinchi Photon -ga o'chiring. Keyingi qadam sizga ikkinchi fotonda ko'rsatiladigan shunga o'xshash kodni taqdim etadi.

9 -qadam: Dasturlash davom etmoqda

Ikkinchi fotonning kodi birinchisining kodi bilan deyarli bir xil bo'lgani uchun, butun kod quyida ko'chiriladi va joylashtiriladi:

#"ArduinoJson.h" ni qo'shing

Servo servoLeftRight_3;

Servo servoUpDown_3;

int pozitsiyasiLeftRight_3 = 45;

int positionUpDown_3 = 0; int chapRight_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_ (JOB)

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

String weatherArray [3];

suzuvchi haroratArray [3]; suzuvchi namlikArray [3]; shamolli shamolSpeedArray [3]; Vaqt tamg'asi satrlariArray [3]; int upDownMaxDegree [3]; int chapRightSpeed [3];

AllData5DaysForecast qatori;

void getWeather5DayForecast ()

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

Taymer taymeri WeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 kun

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Taymer taymeri WeatherCurrent (60000, getCurrentWeather);

bekor qilishLeftRight3 () {

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

bekor o'zgarishUpDown3 () {

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

Taymer taymeriLeftRight3 (100, changeLeftRight3);

Taymer taymeriUpDown3 (10, changeUpDown3);

bo'sh o'rnatish () {

// ob -havo taymerlarini ishga tushiring timerWeatherForecast.start (); timerWeatherCurrent.start (); // pinMode kabi ishga tushirishni qo'ying va funktsiyalarni shu erda boshlang. // Micro Servo servoLeftRight_3.attach (D1) ni sozlash; servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // servo holatini boshlang

servoUpDown_3.write (positionUpDown_3); // servo holatini boshlang

timerLeftRight3.start ();

timerUpDown3.start (); // Konsolni oching Serial.begin (9600); kechikish (2000); Serial.println ("Salom!"); // get_weather5DayForecast va get_currentWeather veb-kancalariga obuna bo'ling 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 *hodisasi, const char *ma'lumotlar)

{allData5DaysForecast += ma'lumotlar; // barcha ma'lumotlarni bitta satrda saqlaydi. int allData5DaysForecastLen = allData5DaysForecast.length (); char bufer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (bufer, allData5DaysForecastLen + 1); // satr uchun bufer yaratish int bufferLength = sizeof (bufer); DynamicJsonBuffer jsonBufferWeather (buferLength); JsonObject & root = jsonBufferWeather.parseObject (bufer); //Serial.println(allData5DaysForecast); // Tahlil muvaffaqiyatli bajarilganligini tekshiring. if (! root.success ()) {//Serial.println("5 kunlik ob -havo ma'lumotlarini tahlil qilish … XATO! "); qaytish; } int i = 1; JsonArray & list = root ["list"]; uchun (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; suzish harorati = asosiy ["temp"]; int namlik = asosiy ["namlik"]; JsonObject & weather = currentObject ["ob -havo"] [0]; const char* weatherInfo = ob -havo ["asosiy"]; float windSpeed = currentObject ["shamol"] ["tezlik"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (harorat); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; namlikArray = namlik; weatherArray = ob -havo ma'lumoti; windSpeedArray = shamol tezligi; timestampArray = vaqt tamg'asi; i ++; } boshqa {tanaffus; }}}

void gotCurrentWeatherData (const char *hodisasi, const char *ma'lumotlar)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (ma'lumotlar); //Serial.println(ma'lumotlar); // Tahlil muvaffaqiyatli bajarilganligini tekshiring. agar (! root.success ()) {//Serial.println("Hozirgi ob -havo ma'lumotlarini tahlil qilish … XATO! "); qaytish; } JsonObject & weather = root ["ob -havo"] [0]; const char* weather_main = ob -havo ["asosiy"]; JsonObject & main = root ["asosiy"]; float main_temp = main ["temp"]; int main_humidity = asosiy ["namlik"]; float wind_speed = ildiz ["shamol"] ["tezlik"]; const char* timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (shamol tezligi); leftRightSpeed [0] = servoIncrement; weatherArray [0] = ob -havo_bo'lishi; haroratArray [0] = tempFah; namlikArray [0] = asosiy namlik; windSpeedArray [0] = shamol tezligi; timestampArray [0] = vaqt tamg'asi; }

int updateUpDown (float temp) {

// [0, 180] float servoMaxDegree = temp * 45/31 + (990/31) oralig'ida darajani xaritaga qo'ying; Serial.print ("yangi servo daraja:"); Serial.println (servoMaxDegree); servoMaxDegree -ni qaytarish; }

int updateleftRight (o'zgaruvchan shamol tezligi) {

// Shamol tezligini [1, 100] suzuvchi servoIncrement = windSpeed * 99/26 + 1 diapazoniga moslang; Serial.print ("yangi servo o'sish qiymati:"); Serial.println (servoIncrement); qaytish servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

Siz qildingiz! Siz loyihaning dasturlash bo'limi orqali erishdingiz! E'tibor bering: tananing chap va o'ng harakatlari uchun qutilarga vertikal tirqish orqali qo'shimcha dublonlar/tayoqchalarni joylashtiring. Boshqa uchi ajdaho tanasiga ulangan bo'lishi kerak.

10 -qadam: Ajdaringizdan rohatlaning

Tabriklaymiz! Siz noldan Sine-ese ajdaho qurdingiz! Endi siz faqat o'tirib, atrofingizdagi displeydan zavqlanishingiz kerak!

QAYD: Ushbu loyiha Joan Bempong va Soundarya Mutuvel tomonidan tayyorlangan kurs ishi sifatida qurilgan. Kurs sahifasini bu erda topishingiz mumkin.

Tavsiya: