Isi kandungan:

Naga Sine-ese: 10 Langkah (dengan Gambar)
Naga Sine-ese: 10 Langkah (dengan Gambar)

Video: Naga Sine-ese: 10 Langkah (dengan Gambar)

Video: Naga Sine-ese: 10 Langkah (dengan Gambar)
Video: LEGENDA 10 CINCIN DAN SANG NAGA | ALUR CERITA FILM SHANG CHI AND THE LEGEND OF THE TEN RINGS (2021) 2024, Julai
Anonim
Naga Sine-ese
Naga Sine-ese

Sine-ese Dragon adalah hiasan rumah yang menggunakan pergerakan dan lampu mekanikal untuk memberitahu anda ramalan cuaca untuk selang tiga jam berikutnya. Secara definisi, ambien menerangkan keadaan sekeliling sesuatu; oleh itu diputuskan untuk memasukkan data cuaca ke dalam paparan sekitar. Cuaca adalah aspek yang secara tidak sengaja mengubah hari orang dan merupakan maklumat yang sentiasa berubah setiap minit, atau bahkan hingga detik.

Naga Cina adalah "simbol kekuatan, kekuatan, dan keberuntungan" dan sering dipegang pada nilai budaya dan tradisional yang tinggi di seluruh benua Asia. Selain membawa nasib baik, Naga Tiongkok juga dikatakan memiliki kekuatan kuat yang mengendalikan "air, curah hujan, taufan, dan banjir." Pada akhirnya, Naga China dianggap sesuai untuk mewakili data cuaca.

Visualisasi

Naga Sine-ese dimanipulasi pada enam titik utama di tiga bahagian berasingan yang mewakili ramalan cuaca selama tiga selang 3 jam. Untuk setiap selang 3 jam, maklumat berikut akan disertakan:

  • Penerangan cuaca - menentukan warna maklumat cuaca semasa.
  • Suhu - menentukan ketinggian badan
  • Kelembapan - berkelip segmen LED
  • Kelajuan angin - mengawal kelajuan badan bergerak ke kiri dan kanan.

Bahan yang Diperlukan

  1. Papan lapis / kadbod 3 mm
  2. Dowel kayu atau sumpit 5 mm
  3. 2 Foton Zarah
  4. 3 Mainan licin
  5. 6 motor servo
  6. Lampu NeoPixel (baik helai atau lampu individu dijahit bersama)
  7. Banyak Lem super
  8. Benang konduktif
  9. Cat akrilik
  10. Kain hiasan
  11. Pemotong laser
  12. Pencetak 3D

Langkah 1: Naik dan Turun

Atas dan bawah!
Atas dan bawah!
Atas dan bawah!
Atas dan bawah!
Atas dan bawah!
Atas dan bawah!

Langkah pertama anda untuk membina Sine-ese Dragon ialah membina komponen yang mengawal pergerakan badan ke atas dan ke bawah. Betapa menariknya!

  1. Muat turun fail Adobe Illustrator (.ai) dan cetak dengan menggunakan mesin pemotong laser.

    upDownBoxWithPlatform.ai hendaklah dicetak pada kadbod

  2. Muat turun fail percetakan 3D (.stl) dan gunakan pencetak 3D kegemaran anda untuk mencetaknya.

    Warna tidak penting untuk cakera atau pemusing cakera. Pada gambar kedua, pemusing cakera telah dimasukkan ke dalam lubang cakera

  3. Pasang dua komponen pertama dan lekatkan bersama seperti yang ditunjukkan dalam gambar 3 hingga 5.

    1. Platform
    2. Alur untuk cakera
  4. Sekarang, satukan kotak berikut petua di bawah.

    1. Wayar servo harus melalui bukaan segi empat tepat di sisi kotak.
    2. Hujung terpendek pemusing cakera dilekatkan pada kepala servo dan hujung yang lebih panjang melalui lubang sisi lain kotak dengan lubang bulat di atasnya. Ini ditunjukkan dalam gambar 6.
  5. Sekarang, kita memerlukan sesuatu untuk memastikan platform tetap rata ketika cakera dipusingkan. Potong batang penyepit ke dalam tongkat panjang 75 mm (gambar 7) dan lekatkan di bahagian atas kotak ke bahagian atas pelantar menggunakan gam panas. Pastikan tongkat diratakan pada 90 darjah ke platform.
  6. Masukkan batang 212 mm ke lubang tengah di bahagian atas kotak ke platform.

Manis! Sekarang anda mempunyai kotak lengkap (gambar 8) untuk pergerakan naga naik dan turun. Sekarang, ulangi langkah di atas dua kali lagi!

Langkah 2: Bagaimana dengan Kiri dan Kanan?

Bagaimana dengan Kiri dan Kanan?!
Bagaimana dengan Kiri dan Kanan?!
Bagaimana dengan Kiri dan Kanan?!
Bagaimana dengan Kiri dan Kanan?!
Bagaimana dengan Kiri dan Kanan?!
Bagaimana dengan Kiri dan Kanan?!
Bagaimana dengan Kiri dan Kanan?!
Bagaimana dengan Kiri dan Kanan?!

Sekarang, kita tidak boleh melupakan pergerakan kiri dan kanan Naga Sine-ese, boleh? Mari melangkah ke langkah kedua!

  1. Muat turun fail Adobe Illustrator (.ai) dan cetak dengan menggunakan mesin pemotong laser.

    1. leftRightBoxWithPlatforms.ai hendaklah dicetak pada kadbod.
    2. fail armTurner.ai hendaklah dicetak pada bahan setebal 3 mm.
  2. Muat turun fail percetakan 3D (.stl) dan gunakan pencetak 3D kegemaran anda untuk mencetaknya.

    Pastikan anda mencetak dua lengan! Warna tidak menjadi masalah di sini

  3. Pasang kedua platform bersama seperti yang ditunjukkan pada gambar 3 menggunakan gam panas.
  4. Masukkan kotak. Walaupun sukar untuk melakukannya, lebih mudah dicapai dengan:

    1. Memasukkan dua platform di antara dua celah besar di kedua-dua sisi kotak.
    2. Letakkan lengan pertama di bahagian atas platform atas.
    3. Memusingkan pusingan lengan melalui lengan dan kemudian platform atas.
    4. Letakkan lengan kedua di bahagian atas platform bawah.
    5. Memusingkan pusingan lengan melalui lengan kedua dan kemudian platform bawah.
    6. Melekatkan putar lengan melalui bukaan segi empat tepat dari putar lengan dicetak 3D.
    7. Hujung putar yang lain berada di atas motor servo.
    8. Tambahkan bahagian atas, bawah, dan belakang ke kotak.

Kotak pemasangan terakhir anda akan kelihatan seperti gambar keenam. Sekarang, anda perlu mengulanginya dua kali lagi!

Pada akhir langkah ini, anda harus mempunyai enam kotak dengan masing-masing tiga sistem pergerakan atas / bawah dan kiri / kanan.

Langkah 3: Memegang Badan … BAGAIMANA?

Memegang Badan … BAGAIMANA?
Memegang Badan … BAGAIMANA?

Soalan yang baik! Ketika itulah pemegang slinky bercetak 3D masuk. Muat turun fail.stl yang disertakan dan cetak menggunakan pencetak 3D. Pastikan untuk mencetak 6 pemegang keseluruhan untuk 6 kotak yang berbeza.

Sekiranya anda telah melihat gambar pemegang yang licin di atas, kejutan itu telah hancur - itulah warna Naga Sine-ese kami!

Langkah 4: Tetapi Kotak Itu Tidak Cantik …

Dan saya setuju! Inilah sebabnya mengapa kita akan menggunakan pemotong laser untuk memotong kotak yang lebih menarik untuk memuat semua kotak itu dan menyembunyikannya.

Muat turun fail Adobe Illustrator tersebut dan potong menggunakan pemotong laser. Reka bentuk awan digambar oleh salah seorang penyumbang. Jangan ragu untuk mengubahnya dengan membuangnya di dalam fail ilustrator dan menambahkan reka bentuk anda sendiri mengikut kesesuaian anda! Berikut adalah langkah-langkah yang dicadangkan untuk menyatukan semuanya.

  1. Kumpulkan dan tempelkan ketiga-tiga kepingan dari fail pertama (externalBoxFinal_1) bersama-sama.
  2. Jangan tambah potongan dari fail kedua (externalBoxFinal_2).
  3. Letakkan potongan dari fail ketiga (externalBoxFinal_3) ke bahagian bawah kotak dan ia harus ditutup di bahagian atas. Lekatkan HANYA di bahagian bawah kotak.
  4. Cetak innerBoxesPlatform dua kali. Lekatkan dua kepingan yang mempunyai lubang segiempat besar di dalamnya. Kemudian, tempelkan tiga kepingan yang tinggal. Akhirnya, lekatkan ke set terpaku yang lain dengan lubang di dalamnya.
  5. Letakkan platform di bahagian bawah kotak besar.
  6. Masukkan semua 6 kotak yang lebih kecil ke tempat yang sesuai di platform.
  7. Sekarang, letakkan potongan dari fail kedua (externalBoxFinal_2) di bahagian atas kotak dan lekatkan di sekitar tepi. Lubang pada bahagian atas harus sejajar dengan lubang pada kotak yang lebih kecil. Sekiranya tidak, susun semula kotak yang lebih kecil anda. Jangan tambahkan gam pada kotak yang lebih kecil sama sekali.
  8. Sekiranya anda menggunakan papan roti yang mempunyai bahagian yang melekit di bahagian bawah, letakkan di dekat pusat bahagian bawah di tempat yang apabila anda menutup kotak, papan roti bersama dengan Foton akan hilang. Terdapat celah kecil di bahagian bawah yang memudahkan anda menyambung ke Foton dari luar.

Langkah 5: Mainan Slinky ?? Aduh

Mainan Slinky ?? Aduh!
Mainan Slinky ?? Aduh!
Mainan Slinky ?? Aduh!
Mainan Slinky ?? Aduh!

Badan naga:

1. Satukan tiga slinkies bersama-sama menggunakan gam panas atau pita.

2. Ukur panjang dan diameter slinkies dan potong sehelai kain hiasan.

3. Bawa kedua hujung kain dan jahit bersama.

4. Setelah selesai menjahitnya, masukkan slinkies seperti kaus kaki.

5. Jahit hujung licin ke kain yang dijahit.

Langkah 6: Cetak Naga Anda

Bahagian naga bercetak 3D:

1. Bahagian diambil dari

2. Kami hanya menggunakan kepala, kaki dan mata.

3. Setelah mencetak bahagian 3D, ratakan dengan menggunakan kertas pasir dan aseton.

4. Warnakan bahagian-bahagiannya dengan cara yang sesuai untuk menghiasnya.

Langkah 7: Masa untuk Meningkatkan Naga Anda Dengan NeoPixels

Masa untuk Meningkatkan Naga Anda Dengan NeoPixels!
Masa untuk Meningkatkan Naga Anda Dengan NeoPixels!
Masa untuk Meningkatkan Naga Anda Dengan NeoPixels!
Masa untuk Meningkatkan Naga Anda Dengan NeoPixels!

Segmen ringan:

1. Anda hanya boleh menggunakan helai neopixel untuk membuat lampu jika anda mahu. (Kami kehabisan helai).

2. Kami menggunakan 20 lampu neopixel dan menghubungkannya menggunakan wayar. Kawat ini disolder ke atasnya dan disambungkan ke foton menggunakan pendawaian merah sehingga sesuai dengan tema naga.

3. Anda juga dapat menjahit lampu neopixel pada sehelai kain panjang, tetapi kami tidak menggunakannya kerana kami mempunyai slinky yang terbuat dari logam.

Pemasangan bahagian: Pasangkan segmen cahaya di dalam badan naga menggunakan benang atau wayar. Pastikan anda dapat menyambungkan lampu ke foton di dalam kotak asas. Pasang kepala, kaki dan ekor ke badan menggunakan gam. Setelah berada di tempatnya, selamatkan badan ke dalam pemegang licin yang kami cetak sebelumnya. Sekarang badan sudah siap untuk diprogramkan.

Langkah 8: Masa Pengaturcaraan

Oleh kerana kami akan menggunakan dua Partikel Photon untuk bekerja dengan enam motor servo yang berasingan (satu Photon hanya dapat berfungsi dengan empat), kami akan menulis dua kod yang berasingan tetapi serupa untuk dimuatkan pada mikrokontroler.

Sekarang, untuk mikrokontroler pertama …

Dalam fail Arduino (.ino), sertakan perpustakaan berikut dan tentukan:

#sertakan "neopixel.h"

#sertakan "ArduinoJson.h"

#tentukan PIXEL_PIN D4

#tentukan PIXEL_COUNT 18

Seterusnya, nyatakan pemboleh ubah berikut:

Jalur Adafruit_NeoPixel = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN);

Servo servoLeftRight_1; Servo servoUpDown_1; Servo servoLeftRight_2; Servo servoUpDown_2; kedudukan intLeftRight_1 = 0; kedudukan intUpDown_1 = 0; int leftRight_1 = 1; int upDown_1 = 1; kedudukan intLeftRight_2 = 100; // mestilah antara 0 hingga 180 (dalam darjah) kedudukan intUpDown_2 = 180; // mestilah antara 0 hingga 180 (dalam darjah) di sebelah kiriRight_2 = 1; // 0 = kiri, 1 = int kanan atasDown_2 = 1; // 0 = naik, 1 = bawah 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) + JS_S_S_S_S_S_S (8) 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) + JS_S_S_S_S_SI_S_S_SI_S_S_SI_S_S_S_S_S_S_S_S_Z_SYZ (5) + 76 * JSON_OBJECT_SIZE (8) + 12490; Angin cuacaArray [3]; suhu apunganArray [3]; kelembapan apunganArray [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; Rentetan semuaData5DaysForecast;

Klik di sini untuk mengetahui cara menyediakan webhooks. Setelah selesai, tambahkan deklarasi dan fungsi berikut dan buat perubahan yang sesuai jika perlu:

batal getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Pemasa pemasaWeatherForecast (60000, getWeather5DayForecast); batal getCurrentWeather () {Particle.publish ("get_currentWeather"); } Pemasa pemasaWeatherCurrent (60000, getCurrentWeather);

Fungsi berikut mengawal pergerakan naga atas / bawah dan kiri / kanan:

batal ubahLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; jika (positionLeftRight_1> 100) {leftRight_1 = 0; }} lain {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; jika (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }

perubahan kosongLeftRight2 () {

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

perubahan tidak sahUpDown1 () {

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

perubahan tidak sahUpDown2 () {

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

Untuk dapat mengubah pergerakan dalam selang waktu, timer dibuat.

Pemasa pemasaLeftRight1 (100, changeLeftRight1);

Pemasa pemasaLeftRight2 (100, changeLeftRight2); Pemasa pemasaUpDown1 (10, changeUpDown1); Pemasa pemasaUpDown2 (10, changeUpDown2);

Fungsi persediaan akhirnya ditambahkan seterusnya. Pastikan anda membuat perubahan yang sesuai pada baris kod yang berkaitan dengan webhooks.

batal persediaan () {// mulakan pemasa cuaca pemasaWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Masukkan inisialisasi seperti pinMode dan mulakan fungsi di sini. // Sediakan servoLeftRight_1.attach Micro Servo (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // memulakan kedudukan servo servoUpDown_1.write (positionUpDown_1); // memulakan kedudukan servo servoLeftRight_2.write (positionLeftRight_2); // memulakan kedudukan servo servoUpDown_2.write (positionUpDown_2); // inisialisasi servo position timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Buka konsol Serial.begin (9600); kelewatan (2000); Serial.println ("Hello!"); // Langgan get_weather5DayForecast dan get_currentWeather webhooks Particle.subscribe ("hook-respons / get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response / get_currentWeather / 0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Fungsi gelung tidak digunakan untuk projek ini. Kami tidak dapat melupakan fungsi untuk menangani data yang diterima dari webhooks!

batal gotWeather5DayForecast (const const * event, const char * data) {allData5DaysForecast + = data; // menyimpan semua data ke satu rentetan. int allData5DaysForecastLen = allData5DaysForecast.length (); penampan char [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (penyangga, allData5DaysForecastLen + 1); // buat buffer untuk string int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (penyangga); // Uji apakah penghuraian berjaya. jika (! root.success ()) {//Serial.println("Menyusun ramalan cuaca 5 hari … RALAT! "); kembali; } int i = 1; JsonArray & list = root ["senarai"]; untuk (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; suhu apungan = utama ["temp"]; int kelembapan = utama ["kelembapan"]; JsonObject & weather = currentObject ["cuaca"] [0]; const char * weatherInfo = cuaca ["utama"]; float windSpeed = currentObject ["angin"] ["kelajuan"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (suhu); int servoMaxDegree = kemas kiniUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); suhuArray = tempFah; kelembapanArray = kelembapan; weatherArray = cuacaInfo; windSpeedArray = anginSpeed; cap waktuArray = cap masa; saya ++; } lain {rehat; }}}

void gotCurrentWeatherData (const const * event, const char * data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); // Uji apakah penghuraian berjaya. if (! root.success ()) {//Serial.println("Mengurangkan cuaca semasa… RALAT! "); kembali; } JsonObject & weather = root ["cuaca"] [0]; const char * weather_main = cuaca ["utama"]; JsonObject & main = root ["main"]; terapung main_temp = utama ["temp"]; int main_humidity = utama ["kelembapan"]; float wind_speed = akar ["angin"] ["kelajuan"]; const char * timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = kemas kiniUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (kelajuan angin); leftRightSpeed [0] = servoIncrement; setColor (cuaca_main, 0); weatherArray [0] = cuaca_main; suhuArray [0] = tempFah; kelembapanArray [0] = kelembapan_ utama; windSpeedArray [0] = kelajuan_ angin; timestampArray [0] = cap masa; }

Di bawah ini, anda boleh mendapatkan fungsi tambahan yang mengawal pengemaskinian kedudukan motor servo, penukaran suhu dari Kelvin ke Fahrenheit dan menetapkan warna LED.

int updateUpDown (suhu apungan) {// Petakan darjah ke julat [0, 180] servo floatMaxDegree = temp * 45/31 + (990/31); Serial.print ("ijazah servo baru:"); Serial.println (servoMaxDegree); pulangkan servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Petakan kelajuan angin ke julat [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("nilai kenaikan servo baru:"); Serial.println (servoIncrement); pulangkan servoIncrement; }

int convertToFahrenheit (tempelel terapung) {

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

void setColor (String weatherDesc, int index) {

int ledIndex = 0; jika (indeks == 0) {ledIndex = 0; } lain jika (index == 1) {ledIndex = 6; } lain jika (index == 2) {ledIndex = 12; } lain {kembali; } if (weatherDesc == "Clear") {// kuning untuk (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // jalur kuning.show (); kelewatan (20); }} lain jika (weatherDesc == "Clouds") {// kelabu untuk (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // jalur kelabu.show (); kelewatan (20); }} lain jika (weatherDesc == "Snow") {// putih untuk (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // jalur putih.show (); kelewatan (20); }} lain jika (weatherDesc == "Rain") {// biru untuk (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // jalur biru.tunjukkan (); kelewatan (20); }} lain {// merah untuk (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // red strip.show (); kelewatan (20); }}}

Sebaik sahaja anda mendapat semua yang ditambahkan ke fail Arduino anda, kumpulkan. Sekiranya tidak ada kesilapan, teruskan dan masukkan kod ke Photon pertama. Langkah seterusnya akan memberi anda kod yang serupa untuk dimuatkan pada Photon kedua.

Langkah 9: Pengaturcaraan Terus

Kerana kod untuk Foton kedua hampir sama dengan yang pertama untuk Foton, keseluruhan kod disalin dan ditampal di bawah:

#sertakan "ArduinoJson.h"

Servo servoLeftRight_3;

Servo servoUpDown_3;

kedudukan intLeftRight_3 = 45;

kedudukan intUpDown_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_SI_JSI_OBE_JSI_OBE

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

Angin cuacaArray [3];

suhu apunganArray [3]; kelembapan apunganArray [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

Rentetan semuaData5DaysForecast;

batal getWeather5DayForecast ()

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

Pemasa pemasaWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 hari

batal getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Pemasa pemasaWeatherCurrent (60000, getCurrentWeather);

perubahan kosongLeftRight3 () {

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

perubahan tidak sahUpDown3 () {

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

Pemasa pemasaLeftRight3 (100, changeLeftRight3);

Pemasa pemasaUpDown3 (10, changeUpDown3);

batal persediaan () {

// mulakan pemasa cuaca pemasaWeatherForecast.start (); timerWeatherCurrent.start (); // Masukkan inisialisasi seperti pinMode dan mulakan fungsi di sini. // Sediakan servoLeftRight_3.attach Micro Servo (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // memulakan kedudukan servo

servoUpDown_3.write (positionUpDown_3); // memulakan kedudukan servo

timerLeftRight3.start ();

timerUpDown3.start (); // Buka konsol Serial.begin (9600); kelewatan (2000); Serial.println ("Hello!"); // Langgan get_weather5DayForecast dan get_currentWeather webhooks Particle.subscribe ("hook-respons / get_weather5DayForecast2", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response / get_currentWeather2 / 0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

batal gotWeather5DayForecast (acara const char *, const char * data)

{allData5DaysForecast + = data; // menyimpan semua data ke satu rentetan. int allData5DaysForecastLen = allData5DaysForecast.length (); penampan char [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (penyangga, allData5DaysForecastLen + 1); // buat buffer untuk string int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (penyangga); //Serial.println(allData5DaysForecast); // Uji apakah penghuraian berjaya. jika (! root.success ()) {//Serial.println("Menyusun ramalan cuaca 5 hari … RALAT! "); kembali; } int i = 1; JsonArray & list = root ["senarai"]; untuk (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; suhu apungan = utama ["temp"]; int kelembapan = utama ["kelembapan"]; JsonObject & weather = currentObject ["cuaca"] [0]; const char * weatherInfo = cuaca ["utama"]; float windSpeed = currentObject ["angin"] ["kelajuan"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (suhu); int servoMaxDegree = kemas kiniUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; suhuArray = tempFah; kelembapanArray = kelembapan; weatherArray = cuacaInfo; windSpeedArray = anginSpeed; cap waktuArray = cap masa; saya ++; } lain {rehat; }}}

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

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); //Serial.println(data); // Uji apakah penghuraian berjaya. if (! root.success ()) {//Serial.println("Mengurangkan cuaca semasa… RALAT! "); kembali; } JsonObject & weather = root ["cuaca"] [0]; const char * weather_main = cuaca ["utama"]; JsonObject & main = root ["main"]; terapung main_temp = utama ["temp"]; int main_humidity = utama ["kelembapan"]; float wind_speed = akar ["angin"] ["kelajuan"]; const char * timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = kemas kiniUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (kelajuan angin); leftRightSpeed [0] = servoIncrement; weatherArray [0] = cuaca_main; suhuArray [0] = tempFah; kelembapanArray [0] = kelembapan_ utama; windSpeedArray [0] = kelajuan_ angin; timestampArray [0] = cap masa; }

int updateUpDown (suhu apungan) {

// Petakan darjah ke julat [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("ijazah servo baru:"); Serial.println (servoMaxDegree); pulangkan servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Petakan kelajuan angin ke julat [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("nilai kenaikan servo baru:"); Serial.println (servoIncrement); pulangkan servoIncrement; }

int convertToFahrenheit (tempelel terapung) {

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

Kamu lakukan! Anda berjaya melalui bahagian pengaturcaraan projek! Sekarang, pastikan untuk membuat semua pendawaian dan sambungan dari motor servo dan neopixel ke papan roti dan mikrokontroler. CATATAN: masukkan dowel / sumpit tambahan melalui celah menegak pada kotak untuk pergerakan kiri dan kanan badan. Hujung yang lain harus dihubungkan ke badan naga.

Langkah 10: Nikmati Naga Anda

Tahniah! Anda telah membina Naga Sine-ese dari awal! Sekarang yang harus anda lakukan hanyalah duduk dan menikmati paparan persekitaran anda!

CATATAN: Projek ini dibina sebagai sebahagian daripada kerja kursus oleh Joan Bempong dan Soundarya Muthuvel. Halaman kursus boleh didapati di sini.

Disyorkan: