Daftar Isi:
- Langkah 1: Atas dan Bawah
- Langkah 2: Bagaimana dengan Kiri dan Kanan?
- Langkah 3: Mengangkat Tubuh… BAGAIMANA?
- Langkah 4: Tapi Kotak Itu Tidak Secantik Itu…
- Langkah 5: Mainan Slinky?? Astaga
- Langkah 6: Cetak Naga Anda
- Langkah 7: Saatnya Meningkatkan Naga Anda Dengan NeoPixels
- Langkah 8: Waktu Pemrograman
- Langkah 9: Pemrograman Berlanjut
- Langkah 10: Nikmati Naga Anda
Video: Naga Sine-ese: 10 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:58
Sine-ese Dragon adalah bagian dekorasi rumah ambient yang menggunakan gerakan mekanis dan lampu untuk memberi tahu Anda ramalan cuaca selama tiga interval tiga jam berikutnya. Menurut definisi, ambient menggambarkan lingkungan sekitar sesuatu; maka diputuskan untuk memasukkan data cuaca ke dalam tampilan sekitar. Cuaca adalah aspek yang secara tidak sengaja mengubah hari orang dan merupakan bagian dari informasi yang terus berubah setiap menit, atau bahkan hingga detik.
Naga Cina adalah “simbol kekuatan, kekuatan, dan keberuntungan” dan sering kali dianggap memiliki nilai budaya dan tradisional yang tinggi di seluruh anak benua Asia. Selain membawa keberuntungan, Naga Cina juga dikatakan memiliki kekuatan ampuh yang mengendalikan “air, curah hujan, angin topan, dan banjir.” Pada akhirnya, Naga Cina dianggap tepat untuk mewakili data cuaca.
visualisasi
Naga Sine-ese dimanipulasi di enam titik utama di tiga bagian terpisah yang mewakili ramalan cuaca selama tiga interval 3 jam. Untuk setiap interval 3 jam, informasi berikut akan disertakan:
- Deskripsi cuaca - menentukan warna informasi cuaca saat ini.
- Suhu - menentukan tinggi badan
- Kelembaban - kedipan segmen LED
- Kecepatan angin - mengontrol kecepatan tubuh bergerak ke kiri dan ke kanan.
Bahan yang Dibutuhkan
- Kayu lapis / Karton 3 mm
- Pasak kayu atau sumpit 5 mm
- 2 Foton Partikel
- 3 mainan Slinky
- 6 motor servo
- Lampu NeoPixel (baik untaian atau lampu individual yang dijahit bersama)
- Banyak lem super
- Benang konduktif
- Cat akrilik
- kain dekoratif
- Pemotong laser
- pencetak 3D
Langkah 1: Atas dan Bawah
Langkah pertama Anda untuk membangun Sine-ese Dragon adalah membangun komponen yang mengontrol gerakan naik dan turun tubuh. Menarik sekali!
-
Unduh file Adobe Illustrator (.ai) dan cetak menggunakan mesin pemotong laser.
upDownBoxWithPlatform.ai harus dicetak pada karton
-
Unduh file pencetakan 3D (.stl) dan gunakan printer 3D favorit Anda untuk mencetaknya.
Warna tidak masalah untuk disk atau pemutar disk. Pada gambar kedua, pemutar disk telah dimasukkan ke dalam lubang disk
-
Pasang dua komponen pertama dan rekatkan bersama seperti yang ditunjukkan pada gambar 3 hingga 5.
- platform
- Alur untuk disk
-
Sekarang, susun kotaknya dengan mengikuti tips di bawah ini.
- Kabel servo harus melalui lubang persegi panjang di sisi kotak.
- Ujung terpendek dari disk turner menempel pada kepala servo dan ujung yang lebih panjang melewati lubang sisi lain kotak dengan lubang melingkar di atasnya. Hal ini ditunjukkan pada gambar 6.
- Sekarang, kita membutuhkan sesuatu untuk memastikan platform tetap rata ketika disk diputar. Potong sumpit menjadi batang sepanjang 75 mm (gambar 7) dan rekatkan melalui bagian atas kotak ke bagian atas platform menggunakan lem panas. Pastikan tongkat diratakan pada 90 derajat ke platform.
- Masukkan tongkat sepanjang 212 mm ke dalam lubang tengah di bagian atas kotak ke platform.
Manis! Sekarang Anda memiliki kotak lengkap (gambar 8) untuk gerakan naik turun naga. Sekarang, ulangi langkah di atas dua kali lagi!
Langkah 2: Bagaimana dengan Kiri dan Kanan?
Sekarang, kita tidak bisa melupakan gerakan kiri dan kanan Naga Sine, bukan? Mari melompat ke langkah kedua!
-
Unduh file Adobe Illustrator (.ai) dan cetak menggunakan mesin pemotong laser.
- leftRightBoxWithPlatforms.ai harus dicetak pada karton.
- File armTurner.ai harus dicetak pada bahan yang tebalnya 3 mm.
-
Unduh file pencetakan 3D (.stl) dan gunakan printer 3D favorit Anda untuk mencetaknya.
Pastikan Anda mencetak dua lengan! Warna tidak masalah di sini
- Pasang kedua platform bersama-sama seperti yang ditunjukkan pada gambar 3 menggunakan lem panas.
-
Kumpulkan kotaknya. Meskipun mungkin sulit untuk melakukannya, lebih mudah untuk dicapai dengan:
- Memasukkan dua platform di antara dua celah besar di kedua sisi kotak.
- Menempatkan lengan pertama di atas platform atas.
- Masukkan pembalik lengan melalui lengan dan kemudian platform atas.
- Menempatkan lengan kedua di atas platform bawah.
- Masukkan pembalik lengan melalui lengan kedua dan kemudian platform bawah.
- Tempelkan arm turner melalui bukaan persegi panjang dari arm turner yang dicetak 3D.
- Ujung turner yang lain berada di atas motor servo.
- Tambahkan bagian atas, bawah, dan belakang ke kotak.
Kotak rakitan terakhir Anda akan terlihat seperti gambar keenam. Sekarang, Anda bisa mengulanginya dua kali lagi!
Pada akhir langkah ini, Anda akan memiliki enam kotak dengan masing-masing tiga sistem gerakan atas/bawah dan kiri/kanan.
Langkah 3: Mengangkat Tubuh… BAGAIMANA?
Pertanyaan bagus! Saat itulah pemegang slinky yang dicetak 3D masuk. Unduh file.stl yang disertakan dan cetak menggunakan printer 3D. Pastikan untuk mencetak total 6 pemegang untuk 6 kotak yang berbeda.
Jika Anda telah melihat gambar pemegang slinky di atas, kejutannya telah hancur - itu adalah warna Naga Sine-ese kami!
Langkah 4: Tapi Kotak Itu Tidak Secantik Itu…
Dan saya setuju! Inilah sebabnya mengapa kita akan menggunakan pemotong laser untuk memotong kotak yang jauh lebih menarik untuk menampung semua kotak itu dan menyembunyikannya.
Unduh file Adobe Illustrator itu dan potong menggunakan pemotong laser. Desain awan digambar tangan oleh salah satu kontributor. Jangan ragu untuk memodifikasinya dengan menghapusnya di dalam file ilustrator dan menambahkan desain Anda sendiri sesuai keinginan Anda! Di bawah ini adalah langkah-langkah yang disarankan untuk menyatukan semuanya.
- Pasang dan rekatkan ketiga bagian dari file pertama (outerBoxFinal_1) menjadi satu.
- Jangan tambahkan potongan dari file kedua (outerBoxFinal_2).
- Letakkan potongan dari file ketiga (outerBoxFinal_3) ke bagian bawah kotak dan itu harus ditutup di bagian atas. Lem HANYA di bagian bawah kotak.
- Cetak innerBoxesPlatform dua kali. Rekatkan dua bagian yang memiliki lubang persegi panjang besar di dalamnya. Kemudian, rekatkan tiga bagian yang tersisa menjadi satu. Terakhir, rekatkan ke set lain yang direkatkan dengan lubang di dalamnya.
- Tempatkan platform di bagian bawah kotak besar.
- Masukkan semua 6 kotak yang lebih kecil ke tempat yang sesuai pada platform.
- Sekarang, letakkan potongan dari file kedua (outerBoxFinal_2) di atas kotak dan rekatkan di sekitar tepinya. Lubang pada bagian atas harus sejajar dengan lubang pada kotak yang lebih kecil. Jika tidak, atur ulang kotak kecil Anda. Jangan menambahkan lem ke kotak yang lebih kecil sama sekali.
- Jika Anda menggunakan papan tempat memotong roti yang memiliki bagian lengket di bagian bawah, letakkan ini di dekat bagian tengah bagian bawah di tempat ketika Anda menutup kotak, papan tempat memotong roti bersama dengan Foton akan hilang. Ada celah kecil di bagian bawah sehingga memudahkan Anda untuk terhubung ke Foton dari luar.
Langkah 5: Mainan Slinky?? Astaga
Tubuh naga:
1. Campurkan tiga slinkies menjadi satu menggunakan lem atau selotip panas.
2. Ukur panjang dan diameter slinkies dan potong sepotong kain dekoratif.
3. Satukan kedua ujung kain dan jahit menjadi satu.
4. Setelah selesai menjahitnya, masukkan slinkies seperti kaus kaki.
5. Jahit ujung slinky ke kain yang dijahit.
Langkah 6: Cetak Naga Anda
Bagian naga yang dicetak 3D:
1. Bagian diambil dari
2. Kami hanya menggunakan kepala, kaki dan mata.
3. Setelah bagian dicetak 3D, haluskan menggunakan amplas dan aseton.
4. Cat bagian-bagiannya sesuai keinginan Anda untuk menghiasnya.
Langkah 7: Saatnya Meningkatkan Naga Anda Dengan NeoPixels
Segmen ringan:
1. Anda cukup menggunakan untaian neopiksel untuk membuat lampu jika Anda mau. (Kami kehabisan untaian).
2. Kami menggunakan 20 lampu neopiksel dan menghubungkannya menggunakan kabel. Kabel-kabel ini disolder ke atasnya dan dihubungkan ke foton menggunakan kabel merah sehingga sesuai dengan tema naga.
3. Anda juga dapat menjahit lampu neopiksel pada selembar kain panjang, tetapi kami tidak menggunakannya karena kami memiliki slinky yang terbuat dari logam.
Perakitan bagian: Amankan segmen cahaya di dalam tubuh naga menggunakan benang atau kabel. Pastikan Anda dapat menghubungkan lampu ke foton di dalam kotak dasar. Tempelkan kepala, kaki dan ekor ke badan menggunakan lem. Setelah mereka berada di tempatnya, kencangkan tubuh ke dalam pemegang slinky yang kami cetak sebelumnya. Sekarang tubuh siap untuk diprogram.
Langkah 8: Waktu Pemrograman
Karena kita akan menggunakan dua Foton Partikel untuk bekerja dengan enam motor servo terpisah (satu Foton hanya dapat bekerja dengan empat), kita akan menulis dua kode terpisah namun serupa untuk di-flash pada mikrokontroler.
Sekarang, untuk mikrokontroler pertama…
Dalam file Arduino (.ino), sertakan perpustakaan berikut dan definisikan:
#sertakan "neopixel.h"
#sertakan "ArduinoJson.h"
#tentukan PIXEL_PIN D4
#tentukan PIXEL_COUNT 18
Selanjutnya, deklarasikan variabel berikut:
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN);
Servo servoKiriKanan_1; Servo servoUpDown_1; Servo servoKiriKanan_2; Servo servoUpDown_2; int posisiLeftRight_1 = 0; int posisiUpDown_1 = 0; int kiriKanan_1 = 1; int atasDown_1 = 1; int posisiLeftRight_2 = 100; // harus antara 0 dan 180 (dalam derajat) int positionUpDown_2 = 180; // harus antara 0 dan 180 (dalam derajat) int leftRight_2 = 1; //0=kiri, 1=kanan int atasDown_2 = 1; //0=naik, 1=turun 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(12JECT_SIZE(6) + JSIZE(6) + JSIZE 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_SIZE_SIZE(3) + 38*_JECT_SIZE_OBJECT(3) (5) + 76*JSON_OBJECT_SIZE(8) + 12490; String cuacaArray[3]; float temperatureArray[3]; float kelembabanArray[3]; float windSpeedArray[3]; String timestampArray[3]; int upDownMaxDegree[3]; int leftRightSpeed[3]; String allData5DaysForecast;
Klik di sini untuk mempelajari cara menyiapkan webhook. Setelah selesai, tambahkan deklarasi dan fungsi berikut dan buat perubahan yang sesuai jika perlu:
void getWeather5DayForecast() { Particle.publish("get_weather5DayForecast"); allData5DaysForecast = ""; } Timer waktuWeatherForecast(60000, getWeather5DayForecast); void getCurrentWeather() { Particle.publish("get_currentWeather"); } Timer timerWeatherCurrent(60000, getCurrentWeather);
Fungsi berikut mengontrol gerakan naga ke atas/bawah dan kiri/kanan:
void changeLeftRight1() { if (leftRight_1) { positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed[0]; if (positionLeftRight_1 > 100) { leftRight_1 = 0; } } else { positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed[0]; if (positionLeftRight_1 < 0) { leftRight_1 = 1; } } servoLeftRight_1.write(positionLeftRight_1); }
batalkan perubahanLeftRight2() {
if (kiriKanan_2) { positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed[1]; if (positionLeftRight_2 > 100) { leftRight_2 = 0; } } else { positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed[1]; if (positionLeftRight_2 < 0) { leftRight_2 = 1; } } servoLeftRight_2.write(positionLeftRight_2); }
batalkan perubahanUpDown1() {
if (upDown_1) { positionUpDown_1++; if (posisiUpDown_1 > upDownMaxDegree[0]) { upDown_1 = 0; } } else { posisiUpDown_1--; if (posisiUpDown_1 < 1) { upDown_1 = 1; } } servoUpDown_1.write(positionUpDown_1); }
batalkan perubahanUpDown2() {
if (upDown_2) { posisiUpDown_2++; if (posisiUpDown_2 > upDownMaxDegree[1]) { upDown_2 = 0; } } else { posisiUpDown_2--; if (posisiUpDown_2 < 1) { upDown_2 = 1; } } servoUpDown_2.write(positionUpDown_2); }
Untuk dapat mengubah gerakan dalam suatu interval, timer dibuat.
Timer timerLeftRight1(100, ubahLeftRight1);
Timer timerLeftRight2(100, ubahLeftRight2); Timer timerUpDown1(10, ubahUpDown1); Timer timerUpDown2(10, ubahUpDown2);
Fungsi pengaturan akhirnya ditambahkan berikutnya. Pastikan untuk membuat perubahan yang sesuai pada baris kode yang berhubungan dengan webhook.
void setup() { // memulai pengatur waktu cuaca timerWeatherForecast.start(); timerWeatherCurrent.start(); //Neopiksel strip.begin(); // Letakkan inisialisasi seperti pinMode dan mulai fungsi di sini. // Siapkan servo Mikro ServoLeftRight_1.attach(D1); servoUpDown_1.attach(D0); servoLeftRight_2.attach(D3); servoUpDown_2.attach(D2); servoLeftRight_1.write(positionLeftRight_1); //inisialisasi posisi servo servoUpDown_1.write(positionUpDown_1); //inisialisasi posisi servo servoLeftRight_2.write(positionLeftRight_2); //inisialisasi posisi servo servoUpDown_2.write(positionUpDown_2); //inisialisasi posisi servo timerLeftRight1.start(); timerLeftRight2.start(); timerUpDown1.start(); timerUpDown2.start(); // Buka konsol Serial.begin(9600); penundaan(2000); Serial.println("Halo!"); // Berlangganan get_weather5DayForecast dan get_currentWeather webhooks Particle.subscribe("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather(); getWeather5DayForecast(); }
Fungsi loop tidak digunakan untuk proyek ini. Kita tidak bisa melupakan fungsi untuk menangani data yang diterima dari webhook!
void gotWeather5DayForecast(const char *event, const char *data){ allData5DaysForecast += data; // menyimpan semua data ke satu string. int allData5DaysForecastLen = allData5DaysForecast.length(); char buffer[allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray(buffer, allData5DaysForecastLen + 1); // buat buffer untuk string int bufferLength = sizeof(buffer); DynamicJsonBuffer jsonBufferWeather(panjang penyangga); JsonObject& root = jsonBufferWeather.parseObject(buffer); // Uji apakah penguraian berhasil. if (!root.success()) { //Serial.println("Mengurai prakiraan cuaca 5 hari…ERROR!"); kembali; } int saya = 1; JsonArray& daftar = root["daftar"]; for (JsonObject& currentObject: list){ if (i < 3){ JsonObject& main = currentObject["main"]; suhu mengambang = main["suhu"]; int kelembapan = main["kelembaban"]; JsonObject& cuaca = currentObject["cuaca"][0]; const char* weatherInfo = cuaca["utama"]; float kecepatan angin = currentObject["angin"]["kecepatan"]; const char* cap waktu = currentObject["dt_txt"]; int suhuFah = convertToFahrenheit(suhu); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight(Kecepatan Angin); leftRightSpeed = servoIncrement; setColor(info cuaca, i); temperatureArray = tempFah; kelembabanArray = kelembaban; weatherArray = info cuaca; windSpeedArray = kecepatan angin; timestampArray = stempel waktu; saya++; } lain{ istirahat; } } }
void gotCurrentWeatherData(const char *event, const char *data){ DynamicJsonBuffer jsonBufferWeather(bufferSizeCurrent); JsonObject& root = jsonBufferWeather.parseObject(data); // Uji apakah penguraian berhasil. if (!root.success()) { //Serial.println("Mengurai cuaca saat ini…ERROR!"); kembali; } JsonObject& cuaca = root["cuaca"][0]; const char* weather_main = cuaca["utama"]; JsonObject& main = root["utama"]; float main_temp = main["temp"]; int main_humidity = main["kelembaban"]; float kecepatan_angin = root["angin"]["kecepatan"]; const char* cap waktu = root["dt_txt"]; int suhuFah = convertToFahrenheit(temp_utama); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree[0] = servoMaxDegree; int servoIncrement = updateleftRight(kecepatan_angin); leftRightSpeed[0] = servoIncrement; setColor(cuaca_main, 0); weatherArray[0] = cuaca_main; temperatureArray[0] = suhuFah; kelembabanArray[0]= main_humidity; windSpeedArray[0] = kecepatan_angin; timestampArray[0] = stempel waktu; }
Di bawah ini, Anda dapat menemukan fungsi tambahan yang mengontrol pembaruan posisi motor servo, konversi suhu dari Kelvin ke Fahrenheit, dan pengaturan warna LED.
int updateUpDown(float temp){ //Petakan derajat ke kisaran [0, 180] float servoMaxDegree = temp * 45 / 31 + (990 / 31); Serial.print("derajat servo baru: "); Serial.println(servoMaxDegree); kembali servoMaxDegree; }
int updateleftRight(Kecepatan angin mengambang){
//Petakan kecepatan angin ke kisaran [1, 100] float servoIncrement = windSpeed * 99 / 26 + 1; Serial.print("Nilai kenaikan servo baru: "); Serial.println(servoIncrement); kembali servoIncrement; }
int convertToFahrenheit(mengambang tempKel){
int tempFah = tempKel * 9.0 / 5.0 - 459.67; kembali tempFah; }
void setColor(String weatherDesc, int index){
int ledIndeks = 0; if (indeks == 0){ ledIndex = 0; } else if (indeks == 1){ ledIndex = 6; } else if (indeks == 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));// strip kuning.show(); penundaan (20); } } else if(weatherDesc == "Clouds"){ //abu-abu untuk (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(223, 229, 237)); //garis abu-abu.tampilkan(); penundaan (20); } } else if (weatherDesc == "Snow"){ //putih untuk (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(255, 225, 225)); //garis putih.tampilkan(); penundaan (20); } } else if (weatherDesc == "Hujan"){//biru untuk (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(119, 191, 246)); //garis biru.tampilkan(); penundaan (20); } } else{ //merah untuk (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(254, 11, 5));//red strip.show(); penundaan (20); } } }
Setelah Anda mendapatkan semuanya ditambahkan ke file Arduino Anda, kompilasi. Jika tidak ada kesalahan, lanjutkan dan flash kode ke Foton pertama. Langkah selanjutnya akan memberi Anda kode serupa untuk di-flash pada Foton kedua.
Langkah 9: Pemrograman Berlanjut
Karena kode untuk Foton kedua hampir identik dengan yang pertama, seluruh kode disalin dan ditempelkan di bawah ini:
#sertakan "ArduinoJson.h"
Servo servoKiriKanan_3;
Servo servoUpDown_3;
int posisiLeftRight_3 = 45;
int posisiUpDown_3 = 0; int kiriKanan_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) + JSON_OBJECT_SIZE;
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_SIZE_SIZE(3) + 38*_JECT_SIZE_OBJECT(3) (5) + 76*JSON_OBJECT_SIZE(8) + 12490;
String cuacaArray[3];
float temperatureArray[3]; float kelembabanArray[3]; float windSpeedArray[3]; String timestampArray[3]; int upDownMaxDegree[3]; int leftRightSpeed[3];
String allData5DaysForecast;
batalkan getWeather5DayForecast()
{ Particle.publish("get_weather5DayForecast2"); allData5DaysForecast = ""; }
Timer waktuWeatherForecast(60000, getWeather5DayForecast); ///10, 800.000 md = 3 hari
batal getCurrentWeather()
{ Particle.publish("get_currentWeather2"); }
Timer waktuCuacaCurrent(60000, getCurrentWeather);
batalkan perubahanLeftRight3() {
if (leftRight_3) { positionLeftRight_3 = positionLeftRight_3 + leftRightSpeed[2]; if (positionLeftRight_3 > 100) { leftRight_3 = 0; } } else { positionLeftRight_3 = positionLeftRight_3 - leftRightSpeed[2]; if (positionLeftRight_3 < 0) { leftRight_3 = 1; } } servoLeftRight_3.write(positionLeftRight_3); }
batalkan perubahanUpDown3() {
if (upDown_3) { positionUpDown_3++; if (positionUpDown_3 > upDownMaxDegree[2]) { upDown_3 = 0; } } else { posisiUpDown_3--; if (posisiUpDown_3 < 1) { upDown_3 = 1; } } servoUpDown_3.write(positionUpDown_3); }
Timer timerLeftRight3(100, ubahLeftRight3);
Timer timerUpDown3(10, ubahUpDown3);
batalkan pengaturan() {
// mulai pengatur waktu cuaca timerWeatherForecast.start(); timerWeatherCurrent.start(); // Letakkan inisialisasi seperti pinMode dan mulai fungsi di sini. // Siapkan servo Mikro ServoLeftRight_3.attach(D1); servoUpDown_3.attach(D0);
servoLeftRight_3.write(positionLeftRight_3); //inisialisasi posisi servo
servoUpDown_3.write(positionUpDown_3); //inisialisasi posisi servo
timerLeftRight3.start();
timerUpDown3.start(); // Buka konsol Serial.begin(9600); penundaan(2000); Serial.println("Halo!"); // Berlangganan get_weather5DayForecast dan 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; // menyimpan semua data ke satu string. int allData5DaysForecastLen = allData5DaysForecast.length(); char buffer[allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray(buffer, allData5DaysForecastLen + 1); // buat buffer untuk string int bufferLength = sizeof(buffer); DynamicJsonBuffer jsonBufferWeather(panjang penyangga); JsonObject& root = jsonBufferWeather.parseObject(buffer); //Serial.println(allData5DaysForecast); // Uji apakah penguraian berhasil. if (!root.success()) { //Serial.println("Mengurai prakiraan cuaca 5 hari…ERROR!"); kembali; } int saya = 1; JsonArray& daftar = root["daftar"]; for (JsonObject& currentObject: list){ if (i < 3){ JsonObject& main = currentObject["main"]; suhu mengambang = main["suhu"]; int kelembapan = main["kelembaban"]; JsonObject& cuaca = currentObject["cuaca"][0]; const char* weatherInfo = cuaca["utama"]; float kecepatan angin = currentObject["angin"]["kecepatan"]; const char* cap waktu = currentObject["dt_txt"]; int suhuFah = convertToFahrenheit(suhu); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight(Kecepatan Angin); leftRightSpeed = servoIncrement; temperatureArray = tempFah; kelembabanArray = kelembaban; weatherArray = info cuaca; windSpeedArray = kecepatan angin; timestampArray = stempel waktu; saya++; } lain{ istirahat; } } }
void gotCurrentWeatherData(const char *event, const char *data)
{ DynamicJsonBuffer jsonBufferWeather(bufferSizeCurrent); JsonObject& root = jsonBufferWeather.parseObject(data); //Serial.println(data); // Uji apakah penguraian berhasil. if (!root.success()) { //Serial.println("Mengurai cuaca saat ini…ERROR!"); kembali; } JsonObject& cuaca = root["cuaca"][0]; const char* weather_main = cuaca["utama"]; JsonObject& main = root["utama"]; float main_temp = main["temp"]; int main_humidity = main["kelembaban"]; float kecepatan_angin = root["angin"]["kecepatan"]; const char* cap waktu = root["dt_txt"]; int suhuFah = convertToFahrenheit(temp_utama); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree[0] = servoMaxDegree; int servoIncrement = updateleftRight(kecepatan_angin); leftRightSpeed[0] = servoIncrement; weatherArray[0] = cuaca_main; temperatureArray[0] = suhuFah; kelembabanArray[0]= main_humidity; windSpeedArray[0] = kecepatan_angin; timestampArray[0] = stempel waktu; }
int updateUpDown(suhu mengambang){
//Petakan derajat ke kisaran [0, 180] float servoMaxDegree = temp * 45 / 31 + (990 / 31); Serial.print("derajat servo baru: "); Serial.println(servoMaxDegree); kembali servoMaxDegree; }
int updateleftRight(Kecepatan angin mengambang){
//Petakan kecepatan angin ke kisaran [1, 100] float servoIncrement = windSpeed * 99 / 26 + 1; Serial.print("Nilai kenaikan servo baru: "); Serial.println(servoIncrement); kembali servoIncrement; }
int convertToFahrenheit(mengambang tempKel){
int tempFah = tempKel * 9.0 / 5.0 - 459.67; kembali tempFah; }
Anda melakukannya! Anda telah berhasil melewati bagian pemrograman proyek! Sekarang, pastikan untuk membuat semua kabel dan sambungan dari motor servo dan neopiksel ke papan tempat memotong roti dan mikrokontroler. CATATAN: masukkan pasak/sumpit ekstra melalui celah vertikal pada kotak untuk gerakan kiri dan kanan badan. Ujung lainnya harus terhubung ke tubuh naga.
Langkah 10: Nikmati Naga Anda
Selamat! Anda telah membangun Naga Sine-ese dari awal! Sekarang yang harus Anda lakukan adalah duduk dan menikmati tampilan sekitar Anda!
CATATAN: Proyek ini dibangun sebagai bagian dari kursus oleh Joan Bempong dan Soundarya Muthuvel. Halaman kursus dapat ditemukan di sini.
Direkomendasikan:
Mainan Beralih-Adaptasi: Naga Berjalan Bernafas Air Dapat Diakses!: 7 Langkah (dengan Gambar)
Switch-Adapt Toys: Water-Breathing Walking Dragon Dibuat Dapat Diakses!: Adaptasi mainan membuka jalan baru dan solusi khusus untuk memungkinkan anak-anak dengan kemampuan motorik terbatas atau cacat perkembangan berinteraksi dengan mainan secara mandiri. Dalam banyak kasus, anak-anak yang membutuhkan mainan yang disesuaikan tidak dapat
Pelarian Naga: 3 Langkah
Dragon Escape: Ini akan dikodekan di code.org. Seluruh dasar dari permainan ini adalah untuk menghindari naga dan menangkap hantu beberapa kali untuk menang. Anda dapat memukau teman-teman Anda dengan ide game keren ini yang dapat diubah sesuai dengan keinginan Anda
Videojuego "Sejarah Max: Naga Kecil": 10 Langkah
Videojuego "Sejarah Max: Naga Kecil": Si quieres crear el videojuego "Sejarah Max: Naga kecil" puedes seguir este paso a paso:
Jam Bulan Dengan Naga: 8 Langkah (dengan Gambar)
Jam Bulan Dengan Naga: *** Entri di blog saya https://blog.familie-fratila.de/bone-dragon-moonlight-clock/ ***Beberapa waktu lalu saya membuat jam untuk ruang tamu saya, sejak saya tidak menemukan apa pun untuk dibeli yang memiliki setidaknya desain yang dapat ditoleransi :-) Tentu saja putra saya melihat ini memiliki
ESP8266/Arduino SmartThings Pengontrol/Monitor Habitat Naga Berjenggot: 4 Langkah
ESP8266/Arduino SmartThings Bearded Dragon Habitat Controller/Monitor: DaVinci Our Dragon akan melakukan upgrade perangkat lunak ke Vivarium's Controller-nya. Saya memutuskan untuk bermigrasi dari logika Arduino 'penuh' tradisional yang bagus yang telah berjalan cukup andal selama setahun terakhir, ke int