Mündəricat:

Sine-ese Dragon: 10 addım (şəkillərlə)
Sine-ese Dragon: 10 addım (şəkillərlə)

Video: Sine-ese Dragon: 10 addım (şəkillərlə)

Video: Sine-ese Dragon: 10 addım (şəkillərlə)
Video: Böyrəkdə Problem Varsa - Bu 10 Əlamət Olur 2024, Iyul
Anonim
Sine-ese Əjdaha
Sine-ese Əjdaha

Sine-ese Dragon, növbəti üç üç saatlıq hava proqnozunu sizə bildirmək üçün mexaniki hərəkətlər və işıqlardan istifadə edən ətraf mühiti bəzəyir. Tərif olaraq, mühit bir şeyin yaxın ətrafını təsvir edir; bu səbəbdən hava məlumatlarını ətrafdakı bir ekrana daxil etməyin məqsədəuyğun olduğuna qərar verildi. Hava, insanların gününü təsadüfən dəyişdirən və hər dəqiqə, hətta saniyəyə qədər daim dəyişən bir məlumat parçasıdır.

Çin Əjdahası "gücün, gücün və uğurların simvoludur" və tez -tez Asiya yarımadasında yüksək mədəni və ənənəvi dəyərə sahibdir. Çin Əjdahasının xeyir gətirməklə yanaşı, "suyu, yağışları, tayfunları və daşqınları" idarə edən güclü güclərə sahib olduğu da söylənilir. Nəticədə, Çin Əjdahası hava məlumatlarını əks etdirmək üçün uyğun hesab edildi.

Vizualizasiya

Sine-ese Əjdahası, 3 3 saatlıq fasilələrlə hava proqnozunu əks etdirən üç ayrı hissədə altı əsas nöqtədə idarə olunur. Hər 3 saatlıq interval üçün aşağıdakı məlumatlar daxil ediləcək:

  • Hava təsviri - mövcud hava məlumatlarının rəngini təyin edir.
  • Temperatur - bədənin hündürlüyünü təyin edir
  • Rütubət - LED seqmentlərinin yanıb -sönməsi
  • Külək sürəti - bədənin sola və sağa hərəkət sürətini idarə edir.

Tələb olunan materiallar

  1. 3 mm kontrplak/karton
  2. 5 mm taxta dübel və ya çubuqlar
  3. 2 hissəcik fotonları
  4. 3 Darıxdırıcı oyuncaqlar
  5. 6 servo mühərrik
  6. NeoPixel işıqları (ya bir tel, ya da bir -birinə tikilmiş fərdi işıqlar)
  7. Çox super yapışqan
  8. İletken ip
  9. Akril boya
  10. Dekorativ parça
  11. Lazer kəsici
  12. 3D printer

Addım 1: Yuxarı və Aşağı

Yuxarı və aşağı!
Yuxarı və aşağı!
Yuxarı və aşağı!
Yuxarı və aşağı!
Yuxarı və aşağı!
Yuxarı və aşağı!

Sine-ese Dragon qurmaq üçün ilk addımınız bədənin yuxarı və aşağı hərəkətini idarə edən komponenti qurmaqdır. Nə qədər həyəcanlı!

  1. Adobe Illustrator fayllarını (.ai) yükləyin və lazer kəsmə maşını istifadə edərək çap edin.

    upDownBoxWithPlatform.ai kartonda çap olunmalıdır

  2. 3D çap sənədlərini (.stl) yükləyin və çap etmək üçün ən sevdiyiniz 3D printerdən istifadə edin.

    Rəngin nə disk, nə də disk çeviricisi üçün əhəmiyyəti yoxdur. İkinci görüntüdə, disk döngəsi diskin çuxuruna daxil edilmişdir

  3. İlk iki komponenti yığın və 3-5 -ci şəkillərdə göstərildiyi kimi yapışdırın.

    1. Platforma
    2. Disk üçün yivlər
  4. İndi, aşağıdakı ipuçlarını izləyərək qutuyu bir araya gətirin.

    1. Servonun telləri qutunun yan tərəfindəki düzbucaqlı açılışdan keçməlidir.
    2. Disk çeviricinin ən qısa ucu servo başına bağlanır və daha uzun ucu dairəvi bir çuxur olan qutunun digər tərəfindəki delikdən keçir. Bu şəkil 6 -da göstərilmişdir.
  5. İndi disk çevrildikdə platformanın düz qalmasını təmin etmək üçün bir şeyə ehtiyacımız var. Çubuğu 75 mm uzunluğunda çubuqlara kəsin (şəkil 7) və isti yapışqan istifadə edərək qutunun üstündən platformanın üstünə yapışdırın. Çubuqların platformaya 90 dərəcə aşağı salındığından əmin olun.
  6. Qutunun üstündəki orta çuxura 212 mm uzunluğunda bir çubuq qoyun.

Şirin! İndi əjdahanın yuxarı və aşağı hərəkəti üçün tam bir qutunuz var (şəkil 8). İndi yuxarıdakı addımları daha iki dəfə təkrarlayın!

Addım 2: Bəs Sol və Sağ?

Bəs Sol və Sağ?
Bəs Sol və Sağ?
Bəs Sol və Sağ?
Bəs Sol və Sağ?
Bəs Sol və Sağ?
Bəs Sol və Sağ?
Bəs Sol və Sağ?
Bəs Sol və Sağ?

İndi Sine-ese Dragonun sol və sağ hərəkətini unutmaq olmaz, elə deyilmi? İkinci mərhələyə keçək!

  1. Adobe Illustrator fayllarını (.ai) yükləyin və lazer kəsmə maşını istifadə edərək çap edin.

    1. leftRightBoxWithPlatforms.ai kartonda çap olunmalıdır.
    2. armTurner.ai faylı 3 mm qalınlığında bir material üzərində çap olunmalıdır.
  2. 3D çap sənədlərini (.stl) yükləyin və çap etmək üçün ən sevdiyiniz 3D printerdən istifadə edin.

    İki qolu çap etdiyinizə əmin olun! Burada rəngin əhəmiyyəti yoxdur

  3. İsti yapışqan istifadə edərək şəkil 3 -də göstərildiyi kimi iki platformanı bir araya gətirin.
  4. Qutunu bir yerə yığın. Bunu etmək çətin olsa da, buna nail olmaq daha asandır:

    1. İki platformanı qutunun hər iki tərəfindəki iki böyük yarığın arasına daxil edin.
    2. İlk qolu yuxarı platformanın üstünə yerləşdirmək.
    3. Qol döngəsini qolun içindən, sonra yuxarı platformadan keçirin.
    4. İkinci qolu alt platformanın üstünə yerləşdirmək.
    5. Qol çeviricisini ikinci qola, sonra isə alt platformaya keçirin.
    6. Qol çeviricinin 3D çaplı qol dönərinin düzbucaqlı açılışından yapışdırılması.
    7. Dönərin digər ucu servo motorun üstünə gedir.
    8. Üst, alt və arxa hissələri qutuya əlavə edin.

Son yığılmış qutunuz altıncı şəkilə bənzəməlidir. İndi bunu iki dəfə təkrar etməlisən!

Bu addımın sonunda, yuxarı/aşağı və sol/sağ hərəkət sistemlərinin hər biri üçü olan altı qutunuz olmalıdır.

Addım 3: Bədəni qaldırmaq… NECƏ?

Bədəni Qaldırmaq … NECƏ?
Bədəni Qaldırmaq … NECƏ?

Yaxşı sual! O zaman 3D çaplı tutqunlar gəlir. Daxil olan.stl faylını yükləyin və 3D printerdən istifadə edərək çap edin. 6 fərqli qutu üçün cəmi 6 tutucu yazdırdığınızdan əmin olun.

Yuxarıdakı tutqun sahibin şəklini görmüsünüzsə, sürpriz məhv oldu - bu Sine -ese Əjdahamızın rəngidir!

Addım 4: Ancaq bu qutular o qədər də gözəl deyil …

Və razıyam! Bu səbəbdən, bütün qutuları ehtiva etmək və gizlətmək üçün daha cəlbedici bir qutu kəsmək üçün lazer kəsici istifadə edəcəyik.

Adobe Illustrator fayllarını yükləyin və lazer kəsici ilə kəsin. Buludların dizaynı töhfə verənlərdən biri tərəfindən əl ilə çəkilmişdir. Illustrator faylının içərisindən çıxarıb öz dizaynınızı uyğun gördüyünüz kimi əlavə edərək onları dəyişdirməkdən çekinmeyin! Aşağıda hər şeyi bir araya gətirmək üçün təklif olunan addımlar verilmişdir.

  1. İlk fayldakı (xariciBoxFinal_1) hər üç parçanı bir yerə yığın və yapışdırın.
  2. Parçanı ikinci fayldan (xariciBoxFinal_2) hələ əlavə etməyin.
  3. Üçüncü fayldakı (xariciBoxFinal_3) parçanı qutunun altına qoyun və yuxarıda bağlanmalıdır. Yalnız qutunun altına yapışdırın.
  4. Daxili qutuları iki dəfə çap edin. İçərisində böyük düzbucaqlı deliklər olan iki parçanı bir -birinə yapışdırın. Sonra qalan üç parçanı bir -birinə yapışdırın. Nəhayət, içərisində deliklər olan digər yapışdırılmış dəstə yapışdırın.
  5. Platformanı böyük qutunun altına qoyun.
  6. 6 kiçik qutunun hamısını platformanın müvafiq nöqtələrinə daxil edin.
  7. İndi ikinci fayldakı (xariciBoxFinal_2) parçanı qutunun üstünə qoyun və kənarına yapışdırın. Üst hissədəki deliklər kiçik qutulardakı deliklər ilə hizalanmalıdır. Əks təqdirdə, kiçik qutularınızı yenidən düzəldin. Kiçik qutulara yapışqan əlavə etməyin.
  8. Altında yapışqan bir parça olan bir çörək taxtası istifadə edirsinizsə, onu alt hissənin ortasına yaxın qoyun ki, qutunu bağladığınız zaman çörək lövhəsi fotonlarla birlikdə yox olsun. Alt hissədə fotonlara kənardan qoşulmağı asanlaşdıran kiçik yarıqlar var.

Addım 5: Slinky Toys ?? Oh, mənim

Slinky Oyuncaqlar ?? Oh, mənim!
Slinky Oyuncaqlar ?? Oh, mənim!
Slinky Oyuncaqlar ?? Oh, mənim!
Slinky Oyuncaqlar ?? Oh, mənim!

Əjdahanın cəsədi:

1. İsti yapışqan və ya lent istifadə edərək üç şlamı birləşdirin.

2. Slinkiesin uzunluğunu və diametrini ölçün və bir parça dekorativ parça kəsin.

3. Kumaşın iki ucunu gətirin və bir -birinə tikin.

4. Onları tikməyi bitirdikdən sonra, çorabın içərisinə sürüşdürün.

5. Qıvrımın uclarını tikilmiş parçaya tikin.

Addım 6: Əjdahanı Çap et

Əjdahanın 3D çap olunmuş hissələri:

1. Parçalar https://www.thingiverse.com/thing:854575 saytından götürülmüşdür.

2. Yalnız başdan, ayaqlardan və gözlərdən istifadə etdik.

3. Parçanı 3D çap etdikdən sonra zımpara və asetondan istifadə edərək hamarlayın.

4. Parçaları bəzəmək istədiyiniz şəkildə rəngləyin.

Addım 7: NeoPixels ilə Əjdahanı Artırma Vaxtı

NeoPixels ilə Əjdahanı Artırma Vaxtı!
NeoPixels ilə Əjdahanı Artırma Vaxtı!
NeoPixels ilə Əjdahanı Artırma Vaxtı!
NeoPixels ilə Əjdahanı Artırma Vaxtı!

İşıq seqmenti:

1. İstəyirsinizsə işıqları yaratmaq üçün sadəcə bir neopixel ipdən istifadə edə bilərsiniz. (İplər tükəndi).

2. 20 neopiksel işıq istifadə etdik və onları tellərdən istifadə edərək bağladıq. Bu tellər onlara lehimlənmiş və əjdaha mövzusuna uyğun olması üçün qırmızı naqillərdən istifadə edərək fotona qoşulmuşdur.

3. Neopixel işıqlarınızı uzun bir parça parçasına da tikə bilərsiniz, ancaq metaldan yapışqan olduğu üçün istifadə etmədik.

Parçaların yığılması: İplər və ya tellərdən istifadə edərək əjdahanın gövdəsindəki işıq seqmentini bərkidin. İşıqları baza qutusunun içərisindəki fotona bağlaya biləcəyinizə əmin olun. Başı, ayaqları və quyruğunu yapışqan istifadə edərək bədənə yapışdırın. Yerdə olduqdan sonra, cəsədi əvvəllər çap etdiyimiz tutqun tutacaqlara bağlayın. İndi bədən proqramlaşdırılmağa hazırdır.

Addım 8: Proqramlaşdırma vaxtı

Altı ayrı servo mühərriklə işləmək üçün iki hissəcikli fotondan istifadə edəcəyimizdən (bir Photon yalnız dörd ilə işləyə bilər), mikrokontrolörlərin üzərinə yandırılacaq iki ayrı, lakin oxşar kod yazacağıq.

İndi ilk mikro nəzarətçi üçün…

Arduino faylına (.ino) aşağıdakı kitabxanaları daxil edin və təyin edin:

#"neopixel.h" daxil edin

#"ArduinoJson.h" daxil edin

#PIXEL_PIN D4 təyin edin

#müəyyən PIXEL_COUNT 18

Sonra aşağıdakı dəyişənləri elan edin:

Adafruit_NeoPixel şeridi = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN);

Servo servoLeftRight_1; Servo servoUpDown_1; Servo servoLeftRight_2; Servo servoUpDown_2; int mövqeLeftRight_1 = 0; int mövqeUpDown_1 = 0; int leftRight_1 = 1; int upDown_1 = 1; int mövqeLeftRight_2 = 100; // 0 ilə 180 arasında olmalıdır (dərəcə ilə) int positionUpDown_2 = 180; // 0 ilə 180 arasında olmalıdır (dərəcə ilə) int leftRight_2 = 1; // 0 = sol, 1 = sağ int yuxarıDown_2 = 1; // 0 = yuxarı, 1 = aşağı const size_t bufferSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJEC_SIZE (4) + JSON_OBJEC_SIZE (4) + JSON_OBJEC_SIZE 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_JIZ_ZIZ_ (2) (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String hava Array [3]; üzmə temperaturu Array [3]; üzən nəmlik Array [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Veb qarmaqlarının necə qurulacağını öyrənmək üçün bura vurun. İşiniz bitdikdə aşağıdakı bəyannamələri və funksiyaları əlavə edin və lazım gələrsə müvafiq dəyişikliklər edin:

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

Aşağıdakı funksiyalar əjdahanın yuxarı/aşağı və sol/sağ hərəkətlərini idarə edir:

etibarsız dəyişiklikLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; əgər (positionLeftRight_1> 100) {leftRight_1 = 0; }} başqa {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; əgər (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (mövqeLeftRight_1); }

boşluq dəyişikliyi LeftRight2 () {

əgər (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1]; if (positionLeftRight_2> 100) {leftRight_2 = 0; }} başqa {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1]; if (positionLeftRight_2 <0) {leftRight_2 = 1; }} servoLeftRight_2.write (mövqeLeftRight_2); }

etibarsız dəyişiklikUpDown1 () {

əgər (yuxarıDown_1) {positionUpDown_1 ++; if (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} başqa {positionUpDown_1--; if (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }

boşluq dəyişikliyiUpDown2 () {

if (yuxarıDown_2) {positionUpDown_2 ++; if (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} başqa {positionUpDown_2--; if (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }

Hərəkətləri bir müddət ərzində dəyişə bilmək üçün taymerlər yaradılır.

Taymer timerLeftRight1 (100, changeLeftRight1);

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

Quraşdırma funksiyası nəhayət sonra əlavə olunur. Webhooks ilə əlaqəli kod sətirlərində müvafiq dəyişikliklər etdiyinizə əmin olun.

void setup () {// hava taymerlərini işə salın timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // pinMode kimi başlanğıc qoyun və funksiyaları buradan başlayın. // Micro Servo servoLeftRight_1.attach qurun (D1); servoUpDown_1.attach (D0); servoLeftRight_2.tach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (mövqeLeftRight_1); // servo mövqeyini başlatmaq servoUpDown_1.write (positionUpDown_1); // servo mövqeyini başlatmaq servoLeftRight_2.write (positionLeftRight_2); // servo mövqeyini başlatmaq servoUpDown_2.write (positionUpDown_2); // servo mövqeyini başlatmaq timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Serial.begin (9600) konsolu açın; gecikmə (2000); Serial.println ("Salam!"); // get_weather5DayForecast və get_currentWeather webhooks Particle.subscribe abunə olun ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("çəngəl-cavab/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Bu layihə üçün bir döngə funksiyası istifadə edilmir. Veb qarmaqlarından alınan məlumatları idarə etmək funksiyalarını unuda bilmərik!

void gotWeather5DayForecast (const char *hadisə, const char *data) {allData5DaysForecast += data; // bütün məlumatları bir sətirdə saxlayır. int allData5DaysForecastLen = allData5DaysForecast.length (); char tamponu [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (tampon, allData5DaysForecastLen + 1); // int bufferLength = sizeof (tampon) simli üçün bir tampon yaradın; DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (tampon); // Təhlilin uğur qazandığını yoxlayın. əgər (! root.success ()) {//Serial.println("5 günlük hava proqnozu təhlili… HATA! "); qayıtmaq; } int i = 1; JsonArray & list = kök ["siyahı"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; üzmə temperaturu = əsas ["temp"]; int rütubət = əsas ["rütubət"]; JsonObject & hava = currentObject ["hava"] [0]; const char* weatherInfo = hava ["əsas"]; float windSpeed = currentObject ["külək"] ["sürət"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (hava məlumatı, i); temperaturArray = tempFah; moistArray = rütubət; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = vaxt damgası; i ++; } başqa {fasilə; }}}

void gotCurrentWeatherData (const char *hadisə, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (məlumatlar); // Təhlilin uğur qazandığını yoxlayın. əgər (! root.success ()) {//Serial.println("Cari hava şəraiti… ERROR! "); qayıtmaq; } JsonObject & hava = kök ["hava"] [0]; const char* weather_main = hava ["əsas"]; JsonObject & main = kök ["əsas"]; float main_temp = main ["temp"]; int main_humidity = əsas ["rütubət"]; float wind_speed = kök ["külək"] ["sürət"]; const char* timestamp = kök ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (hava_asası, 0); weatherArray [0] = hava_baxışı; temperaturArray [0] = tempFah; moistArray [0] = main_humidity; windSpeedArray [0] = külək sürəti; timestampArray [0] = vaxt damgası; }

Aşağıda servo mühərriklərin mövqelərinin yenilənməsini, temperaturun Kelvindən Fahrenheitə çevrilməsini və LED -lərin rənglərini təyin edən əlavə funksiyaları tapa bilərsiniz.

int updateUpDown (float temp) {// Dərəcəni [0, 180] float servoMaxDegree = temp * 45/31 + (990 /31) aralığına uyğunlaşdırın; Serial.print ("yeni servo dərəcəsi:"); Serial.println (servoMaxDegree); qayıt servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Külək sürətini bir sıra [1, 100] float servoIncrement = windSpeed * 99/26 + 1 aralığına uyğunlaşdırın; Serial.print ("yeni servo artım dəyəri:"); Serial.println (servoIncrement); qayıt servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

void setColor (String weatherDesc, int index) {

int ledIndex = 0; if (index == 0) {ledIndex = 0; } başqa əgər (indeks == 1) {ledIndex = 6; } başqa əgər (indeks == 2) {ledIndex = 12; } başqa {qayıt; } if (weatherDesc == "Clear") {// sarı üçün (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // sarı zolaq.show (); gecikmə (20); }} else if (weatherDesc == "Buludlar") {// boz üçün (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // boz zolaq.show (); gecikmə (20); }} else if (weatherDesc == "Snow") {// white for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // ağ zolaq.show (); gecikmə (20); }} else if (weatherDesc == "Yağış") {// mavi üçün (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // mavi zolaq.show (); gecikmə (20); }} başqa {// qırmızı üçün (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // qırmızı zolaq.show (); gecikmə (20); }}}

Arduino sənədinizə hər şeyi əlavə etdikdən sonra onu tərtib edin. Səhv yoxdursa, davam edin və kodu ilk Photon -a yandırın. Növbəti addım, ikinci Photon -da görünəcək oxşar kodu təmin edəcəkdir.

Addım 9: Proqramlaşdırma davam edir

İkinci Photon üçün kod birincisi ilə demək olar ki eyni olduğu üçün bütün kod aşağıda kopyalanıb yapışdırılır:

#"ArduinoJson.h" daxil edin

Servo servoLeftRight_3;

Servo servoUpDown_3;

int mövqeLeftRight_3 = 45;

int mövqeUpDown_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_ (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_JIZ_ZIZ_ (2) (5) + 76*JSON_OBJECT_SIZE (8) + 12490;

String hava Array [3];

üzmə temperaturu Array [3]; üzən nəmlik Array [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String allData5DaysForecast;

void getWeather5DayForecast ()

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

Taymer timerWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 gün

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Taymer timerWeatherCurrent (60000, getCurrentWeather);

boşluq dəyişikliyiLeftRight3 () {

əgər (leftRight_3) {positionLeftRight_3 = positionLeftRight_3 + leftRightSpeed [2]; if (positionLeftRight_3> 100) {leftRight_3 = 0; }} başqa {positionLeftRight_3 = positionLeftRight_3 - leftRightSpeed [2]; if (positionLeftRight_3 <0) {leftRight_3 = 1; }} servoLeftRight_3.write (mövqeLeftRight_3); }

boşluq dəyişikliyiUpDown3 () {

if (yuxarıDown_3) {positionUpDown_3 ++; if (positionUpDown_3> upDownMaxDegree [2]) {upDown_3 = 0; }} başqa {positionUpDown_3--; if (positionUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (mövqeUpDown_3); }

Taymer timerLeftRight3 (100, changeLeftRight3);

Taymer timerUpDown3 (10, changeUpDown3);

boş quraşdırma () {

// hava taymerlərini işə salın timerWeatherForecast.start (); timerWeatherCurrent.start (); // pinMode kimi başlanğıc qoyun və funksiyaları buradan başlayın. // Micro Servo servoLeftRight_3.attach (D1) qurun; servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // servo mövqeyi işə salın

servoUpDown_3.write (positionUpDown_3); // servo mövqeyi işə salın

timerLeftRight3.start ();

timerUpDown3.start (); // Serial.begin (9600) konsolu açın; gecikmə (2000); Serial.println ("Salam!"); // get_weather5DayForecast və get_currentWeather webhooks Particle.subscribe abunə olun ("hook-response/get_weather5DayForecast2", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("çəngəl-cavab/get_currentWeather2/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

void gotWeather5DayForecast (const char *hadisə, const char *data)

{allData5DaysForecast += məlumatlar; // bütün məlumatları bir sətirdə saxlayır. int allData5DaysForecastLen = allData5DaysForecast.length (); char tamponu [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (tampon, allData5DaysForecastLen + 1); // int bufferLength = sizeof (tampon) simli üçün bir tampon yaradın; DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (tampon); //Serial.println(allData5DaysForecast); // Təhlilin uğur qazandığını yoxlayın. əgər (! root.success ()) {//Serial.println("5 günlük hava proqnozu təhlili… HATA! "); qayıtmaq; } int i = 1; JsonArray & list = kök ["siyahı"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; üzmə temperaturu = əsas ["temp"]; int rütubət = əsas ["rütubət"]; JsonObject & hava = currentObject ["hava"] [0]; const char* weatherInfo = hava ["əsas"]; float windSpeed = currentObject ["külək"] ["sürət"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperaturArray = tempFah; moistArray = rütubət; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = vaxt damgası; i ++; } başqa {fasilə; }}}

void gotCurrentWeatherData (const char *hadisə, const char *data)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (məlumatlar); //Serial.println(data); // Təhlilin uğur qazandığını yoxlayın. əgər (! root.success ()) {//Serial.println("Cari hava şəraiti… ERROR! "); qayıtmaq; } JsonObject & hava = kök ["hava"] [0]; const char* weather_main = hava ["əsas"]; JsonObject & main = kök ["əsas"]; float main_temp = main ["temp"]; int main_humidity = əsas ["rütubət"]; float wind_speed = kök ["külək"] ["sürət"]; const char* timestamp = kök ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; weatherArray [0] = hava_baxışı; temperaturArray [0] = tempFah; moistArray [0] = main_humidity; windSpeedArray [0] = külək sürəti; timestampArray [0] = vaxt damgası; }

int updateUpDown (float temp) {

// Dərəcəni [0, 180] float servoMaxDegree = temp * 45/31 + (990 /31) aralığına uyğunlaşdırın; Serial.print ("yeni servo dərəcəsi:"); Serial.println (servoMaxDegree); qayıt servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Külək sürətini bir sıra [1, 100] float servoIncrement = windSpeed * 99/26 + 1 aralığına uyğunlaşdırın; Serial.print ("yeni servo artım dəyəri:"); Serial.println (servoIncrement); qayıt servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

Sən bunu etdin! Layihənin proqramlaşdırma bölməsindən keçdiniz! İndi, servo mühərriklərdən və neopikseldən çörək taxtasına və mikrokontrolörlərə bütün naqilləri və əlaqələri qurduğunuzdan əmin olun. DİQQƏT: əlavə dübelləri/çubuqları bədənin sol və sağ hərəkətləri üçün qutulardakı şaquli yarıqlardan daxil edin. Digər ucu isə əjdahanın gövdəsinə bağlanmalıdır.

Addım 10: Əjdahanızdan zövq alın

Təbrik edirik! Sine-ese Əjdahasını sıfırdan qurdunuz! İndi etməniz lazım olan hər şey arxada oturub ətraf mühitin görüntüsündən zövq almaqdır!

Qeyd: Bu layihə Joan Bempong və Soundarya Muthuvel tərəfindən hazırlanan kurs işlərinin bir hissəsi olaraq inşa edilmişdir. Kurs səhifəsini burada tapa bilərsiniz.

Tövsiyə: