İçindekiler:

Sinüs Ejderhası: 10 Adım (Resimlerle)
Sinüs Ejderhası: 10 Adım (Resimlerle)

Video: Sinüs Ejderhası: 10 Adım (Resimlerle)

Video: Sinüs Ejderhası: 10 Adım (Resimlerle)
Video: Gördüğünüzde Kaçmanız Gereken En Tehlikeli 10 BÖCEK ►2 2024, Temmuz
Anonim
Sinüs Ejderhası
Sinüs Ejderhası

Sine-ese Dragon, önümüzdeki üç saatlik aralıklarla size hava tahminini söylemek için mekanik hareketler ve ışıklar kullanan bir ortam ev dekor parçasıdır. Tanım olarak ortam, bir şeyin yakın çevresini tanımlar; bu nedenle hava durumu verilerinin bir ortam göstergesine dahil edilmesinin uygun olduğuna karar verildi. Hava durumu, insanların gününü istemeden değiştiren ve her dakika, hatta saniyesine kadar sürekli değişen bir bilgi parçasıdır.

Çin Ejderhası “gücün, gücün ve iyi şansın sembolüdür” ve Asya alt kıtasında sıklıkla yüksek kültürel ve geleneksel değerde tutulur. Çin Ejderhasının iyi şans getirmesinin yanı sıra, "su, yağış, tayfun ve sel" kontrol eden güçlü güçleri olduğu söylenir. Sonuç olarak, Çin Ejderhası hava durumu verilerini temsil etmeye uygun görüldü.

görselleştirme

Sine-ese Dragon, üç 3 saatlik aralıklarla hava tahminini temsil eden üç ayrı bölümde altı ana noktada manipüle edilir. Her 3 saatlik aralık için aşağıdaki bilgiler dahil edilecektir:

  • Hava durumu açıklaması - mevcut hava durumu bilgilerinin rengini belirler.
  • Sıcaklık - vücudun yüksekliğini belirtir
  • Nem - LED segmentlerinin yanıp sönmesi
  • Rüzgar hızı - sola ve sağa hareket eden vücudun hızını kontrol eder.

Gerekli malzemeler

  1. 3 mm kontrplak/Karton
  2. 5 mm ahşap dübel veya çubuk
  3. 2 Parçacık Fotonları
  4. 3 Sinsi oyuncaklar
  5. 6 servo motor
  6. NeoPixel ışıkları (bir şerit veya tek tek birlikte dikilmiş ışıklar)
  7. Bir sürü süper yapıştırıcı
  8. İletken iplik
  9. Akrilik boya
  10. Dekoratif kumaş
  11. Lazer kesici
  12. 3 boyutlu yazıcı

Adım 1: Yukarı ve Aşağı

Yukarı ve aşağı!
Yukarı ve aşağı!
Yukarı ve aşağı!
Yukarı ve aşağı!
Yukarı ve aşağı!
Yukarı ve aşağı!

Sine-ese Dragon'u inşa etmek için ilk adımınız, vücudun yukarı ve aşağı hareketini kontrol eden bileşeni inşa etmektir. Ne kadar heyecan verici!

  1. Adobe Illustrator dosyalarını (.ai) indirin ve bir lazer kesme makinesi kullanarak yazdırın.

    upDownBoxWithPlatform.ai bir karton üzerine basılmalıdır

  2. 3B yazdırma dosyalarını (.stl) indirin ve bunları yazdırmak için en sevdiğiniz 3B yazıcıyı kullanın.

    Disk veya disk çevirici için renk önemli değildir. İkinci görüntüde, disk döndürücü, diskin deliğinin içine yerleştirilmiştir

  3. İlk iki bileşeni birleştirin ve bunları 3 ila 5 numaralı resimlerde gösterildiği gibi birbirine yapıştırın.

    1. Platform
    2. Disk için oluklar
  4. Şimdi, aşağıdaki ipuçlarını izleyerek kutuyu bir araya getirin.

    1. Servonun kabloları kutunun yan tarafındaki dikdörtgen açıklıktan geçmelidir.
    2. Disk çeviricinin en kısa ucu servo kafasına takılır ve uzun ucu kutunun diğer tarafındaki üzerinde dairesel bir delik bulunan delikten geçer. Bu, resim 6'da gösterilmiştir.
  5. Şimdi, disk döndüğünde platformun düz kalmasını sağlayacak bir şeye ihtiyacımız var. Çubuğu 75 mm uzunluğunda çubuklar halinde kesin (resim 7) ve kutunun üst kısmından platformun üstüne sıcak tutkal kullanarak yapıştırın. Çubukların platforma 90 derece olacak şekilde hizalandığından emin olun.
  6. 212 mm uzunluğunda bir çubuğu, kutunun üstündeki orta deliğe platforma yerleştirin.

Tatlı! Artık ejderhanın yukarı ve aşağı hareketi için eksiksiz bir kutunuz (resim 8) var. Şimdi yukarıdaki adımları iki kez daha tekrarlayın!

2. Adım: Ya Sol ve Sağ?

Peki ya Sol ve Sağ?!
Peki ya Sol ve Sağ?!
Peki ya Sol ve Sağ?!
Peki ya Sol ve Sağ?!
Peki ya Sol ve Sağ?!
Peki ya Sol ve Sağ?!
Peki ya Sol ve Sağ?!
Peki ya Sol ve Sağ?!

Şimdi, Sine-ese Dragon'un sol ve sağ hareketini unutamayız, değil mi? Hadi ikinci adıma geçelim!

  1. Adobe Illustrator dosyalarını (.ai) indirin ve bir lazer kesme makinesi kullanarak yazdırın.

    1. leftRightBoxWithPlatforms.ai bir karton üzerine basılmalıdır.
    2. armTurner.ai dosyası 3 mm kalınlığında bir malzemeye basılmalıdır.
  2. 3B yazdırma dosyalarını (.stl) indirin ve bunları yazdırmak için en sevdiğiniz 3B yazıcıyı kullanın.

    Kollardan ikisini yazdırdığınızdan emin olun! Burada renk önemli değil

  3. Sıcak tutkal kullanarak iki platformu resim 3'te gösterildiği gibi birleştirin.
  4. Kutuyu bir araya getirin. Bunu yapmak zor olsa da, bunu başarmak daha kolaydır:

    1. İki platformu kutunun her iki yanındaki iki büyük yarık arasına yerleştirme.
    2. İlk kolu üst platformun üstüne yerleştirme.
    3. Kol döndürücünün koldan ve ardından üst platformdan geçirilmesi.
    4. İkinci kolu alt platformun üstüne yerleştirme.
    5. Kol çeviriciyi ikinci koldan ve ardından alt platformdan geçirin.
    6. Kol çeviriciyi 3D baskılı kol çeviricinin dikdörtgen açıklığından geçirmek.
    7. Döndürücünün diğer ucu servo motorun üstüne gider.
    8. Kutuya üst, alt ve arka parçaları ekleyin.

Son birleştirilmiş kutunuz altıncı resimdeki gibi görünmelidir. Şimdi, bunu iki kez daha tekrarlayacaksın!

Bu adımın sonunda, yukarı/aşağı ve sol/sağ hareket sistemlerinden üçer adet olmak üzere altı kutunuz olmalıdır.

Adım 3: Vücudu Tutmak…NASIL?

Vücudu Tutmak…NASIL?
Vücudu Tutmak…NASIL?

İyi soru! İşte o zaman bu 3D baskılı sinsi tutucular devreye girer. Birlikte verilen.stl dosyasını indirin ve bir 3D yazıcı kullanarak yazdırın. 6 farklı kutu için toplamda 6 tutucu yazdırdığınızdan emin olun.

Yukarıdaki sinsi tutucunun resmini gördüyseniz, sürpriz mahvolmuştur - bu Sine-ese Ejderhamızın rengidir!

Adım 4: Ama Bu Kutular O Kadar Güzel Değil…

Ve katılıyorum! Bu nedenle, tüm bu kutuları içermek ve gizlemek için çok daha çekici bir kutu kesmek için bir lazer kesici kullanacağız.

Bu Adobe Illustrator dosyalarını indirin ve lazer kesiciyi kullanarak kesin. Bulut tasarımı, katkıda bulunanlardan biri tarafından elle çizilmiştir. Bunları illüstratör dosyasından kaldırarak ve uygun gördüğünüz şekilde kendi tasarımınızı ekleyerek değiştirmekten çekinmeyin! Her şeyi bir araya getirmek için önerilen adımlar aşağıdadır.

  1. İlk dosyadaki (outerBoxFinal_1) üç parçayı da birleştirin ve yapıştırın.
  2. İkinci dosyadaki (outerBoxFinal_2) parçayı henüz eklemeyin.
  3. Üçüncü dosyadan (outerBoxFinal_3) parçayı kutunun altına koyun ve üstte kapanmalıdır. SADECE kutunun altına yapıştırın.
  4. innerBoxesPlatform'u iki kez yazdırın. İçlerinde büyük dikdörtgen delikler olan iki parçayı birbirine yapıştırın. Ardından kalan üç parçayı birbirine yapıştırın. Son olarak, içinde delikler olan diğer yapıştırılmış sete yapıştırın.
  5. Platformu büyük kutunun altına yerleştirin.
  6. 6 küçük kutunun hepsini platformdaki karşılık gelen noktalarına yerleştirin.
  7. Şimdi ikinci dosyadaki (outerBoxFinal_2) parçayı kutunun üstüne yerleştirin ve kenarlarını yapıştırın. Üst parçadaki delikler daha küçük kutulardaki deliklerle aynı hizada olmalıdır. Değilse, küçük kutularınızı yeniden düzenleyin. Küçük kutulara kesinlikle yapıştırıcı eklemeyin.
  8. Altta yapışkan bir parçası olan bir devre tahtası kullanıyorsanız, kutuyu kapattığınızda devre tahtasının ve Fotonların kaybolacağı bir yere bunu alt parçanın ortasına yakın bir yere yerleştirin. Alt parçada fotonlara dışarıdan bağlanmanızı kolaylaştıran küçük yarıklar vardır.

Adım 5: Slinky Oyuncaklar? Aman

Sinsi Oyuncaklar?? Aman!
Sinsi Oyuncaklar?? Aman!
Sinsi Oyuncaklar?? Aman!
Sinsi Oyuncaklar?? Aman!

Ejderhanın gövdesi:

1. Sıcak tutkal veya bant kullanarak üç slinkiyi birleştirin.

2. Slinkies uzunluğunu ve çapını ölçün ve bir parça dekoratif kumaş kesin.

3. Kumaşın iki ucunu bir araya getirin ve dikin.

4. Dikmeyi bitirdikten sonra, daracıkları çorap gibi kaydırın.

5. Daracıkların uçlarını dikilmiş kumaşa dikin.

Adım 6: Ejderhanı Yazdır

Ejderhanın 3D baskılı parçaları:

1. Parçalar https://www.thingiverse.com/thing:854575 adresinden alınmıştır.

2. Sadece baş, bacaklar ve gözleri kullandık.

3. Parçayı 3D yazdırdıktan sonra zımpara kağıdı ve aseton kullanarak düzeltin.

4. Parçaları süslemek istediğiniz şekilde boyayın.

7. Adım: Ejderhanı NeoPiksellerle Güçlendirme Zamanı

NeoPixels ile Ejderhanı Yükseltme Zamanı!
NeoPixels ile Ejderhanı Yükseltme Zamanı!
NeoPixels ile Ejderhanı Yükseltme Zamanı!
NeoPixels ile Ejderhanı Yükseltme Zamanı!

Işık segmenti:

1. İsterseniz ışıkları oluşturmak için bir neopiksel şeridi kullanabilirsiniz. (İplerimiz tükendi).

2. 20 neopiksel ışık kullandık ve bunları kablolarla bağladık. Bu teller üzerlerine lehimlenmiş ve ejderha temasına uyması için kırmızı kablo kullanılarak fotona bağlanmıştır.

3. Neopixel ışıklarınızı uzun bir kumaş parçasına da dikebilirsiniz, ama biz onları metalden yapılmış daracık bir kumaşımız olduğu için kullanmadık.

Parçaların montajı: Ejderha gövdesinin içindeki ışık parçasını iplikler veya teller kullanarak sabitleyin. Işıkları taban kutusunun içindeki fotona bağlayabildiğinizden emin olun. Başı, bacakları ve kuyruğu tutkal kullanarak gövdeye tutturun. Yerlerine yerleştikten sonra, gövdeyi daha önce yazdırdığımız sinsi tutuculara sabitleyin. Artık vücut programlanmaya hazırdır.

Adım 8: Zamanı Programlayın

Altı ayrı servo motorla çalışmak için iki Parçacık Fotonu kullanacağımız için (bir Foton sadece dört ile çalışabilir), mikrodenetleyiciler üzerinde flaşlanacak iki ayrı fakat benzer kod yazacağız.

Şimdi, ilk mikrodenetleyici için…

Bir Arduino dosyasında (.ino), aşağıdaki kitaplıkları içerir ve tanımlar:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Ardından, aşağıdaki değişkenleri bildirin:

Adafruit_NeoPixel şeridi = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN);

Servo servoSolSağ_1; Servo servoUpDown_1; Servo servoSolSağ_2; Servo servoUpDown_2; int pozisyonSolSağ_1 = 0; int positionUpDown_1 = 0; int solSağ_1 = 1; int upDown_1 = 1; int konumSolSağ_2 = 100; // 0 ile 180 (derece olarak) arasında olmalıdır int positionUpDown_2 = 180; // 0 ile 180 (derece olarak) arasında olmalıdır int leftRight_2 = 1; //0=sol, 1=sağ int upDown_2 = 1; //0=yukarı, 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_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + JSON_SIZE(OBJJ)(6) + JSON_SIZE(OBJ) 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(3) + JSON_OBJECT_SIZE(3) + 38_JSON_JSON_ (5) + 76*JSON_OBJECT_SIZE(8) + 12490; Dize hava durumuArray[3]; yüzer sıcaklıkArray[3]; yüzer nemArray[3]; float windSpeedArray[3]; String zaman damgasıArray[3]; int upDownMaxDegree[3]; int leftRightSpeed[3]; allData5DaysForecast dizisini;

Web kancalarını nasıl kuracağınızı öğrenmek için burayı tıklayın. İşiniz bittiğinde, aşağıdaki bildirimleri ve işlevleri ekleyin ve gerekirse uygun değişiklikleri yapın:

void getWeather5DayForecast() { Particle.publish("get_weather5DayForecast"); allData5DaysForecast = ""; } Zamanlayıcı zamanlayıcıWeatherForecast(60000, getWeather5DayForecast); void getCurrentWeather() { Particle.publish("get_currentWeather"); } Zamanlayıcı zamanlayıcıWeatherCurrent(60000, getCurrentWeather);

Aşağıdaki işlevler, ejderhanın yukarı/aşağı ve sol/sağ hareketlerini kontrol eder:

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); }

geçersiz changeLeftRight2() {

if (leftRight_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); }

geçersiz changeUpDown1() {

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

geçersiz changeUpDown2() {

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

Bir aralıktaki hareketleri değiştirebilmek için zamanlayıcılar oluşturulur.

Zamanlayıcı zamanlayıcıSolSağ1(100, changeSolSağ1);

Zamanlayıcı zamanlayıcıSolSağ2(100, changeSolSağ2); Zamanlayıcı timerUpDown1(10, changeUpDown1); Zamanlayıcı zamanlayıcıUpDown2(10, changeUpDown2);

Kurulum işlevi sonunda eklenir. Web kancalarıyla ilgilenen kod satırlarında uygun değişiklikleri yaptığınızdan emin olun.

void setup() { // hava durumu zamanlayıcılarını başlat timerWeatherForecast.start(); timerWeatherCurrent.start(); //Neopiksel şerit.begin(); // Başlatmayı pinMode gibi koyun ve fonksiyonları buradan başlatın. // Mikro Servo servoLeftRight_1.attach(D1)'i kurun; servoUpDown_1.attach(D0); servoLeftRight_2.attach(D3); servoUpDown_2.attach(D2); servoLeftRight_1.write(positionLeftRight_1); //servo pozisyonunu başlat servoUpDown_1.write(positionUpDown_1); //servo pozisyonunu başlat servoLeftRight_2.write(positionLeftRight_2); //servo pozisyonunu başlat servoUpDown_2.write(positionUpDown_2); //servo pozisyonunu başlat timerLeftRight1.start(); timerLeftRight2.start(); timerUpDown1.start(); timerUpDown2.start(); // Bir konsol açın Serial.begin(9600); gecikme(2000); Serial.println("Merhaba!"); // get_weather5DayForecast ve get_currentWeather web kancalarına abone olun Particle.subscribe("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather(); getWeather5DayForecast(); }

Bu proje için bir döngü işlevi kullanılmamaktadır. Web kancalarından alınan verileri işlemek için işlevleri unutamayız!

void gotWeather5DayForecast(const char *event, const char *data){ allData5DaysForecast += data; // tüm verileri tek bir dizgeye kaydeder. int allData5DaysForecastLen = allData5DaysForecast.length(); char arabelleği[allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray(arabellek, allData5DaysForecastLen + 1); // string için bir tampon yarat int bufferLength = sizeof(buffer); DynamicJsonBuffer jsonBufferWeather(bufferLength); JsonObject& root = jsonBufferWeather.parseObject(buffer); // Ayrıştırmanın başarılı olup olmadığını test edin. if (!root.success()) { //Serial.println("5 günlük hava tahmini için ayrıştırılıyor…HATA!"); dönüş; } int ben = 1; JsonArray& list = root["list"]; for (JsonObject& currentObject: list){ if (i < 3){ JsonObject& main = currentObject["main"]; şamandıra sıcaklığı = ana["temp"]; int nem = ana["nem"]; JsonObject& hava durumu = currentObject["weather"][0]; const char* weatherInfo = hava durumu["ana"]; float windSpeed = currentObject["rüzgar"]["hız"]; const char* zaman damgası = currentObject["dt_txt"]; int tempFah = convertToFahrenheit(sıcaklık); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight(windSpeed); leftRightSpeed = servoArtış; setColor(weatherInfo, ben); sıcaklıkArray = tempFah; nemArray = nem; weatherArray = weatherInfo; windSpeedArray = rüzgarHızı; timestampArray = zaman damgası; ben++; } başka{ ara; } } }

void gotCurrentWeatherData(const char *event, const char *data){ DynamicJsonBuffer jsonBufferWeather(bufferSizeCurrent); JsonObject& root = jsonBufferWeather.parseObject(veri); // Ayrıştırmanın başarılı olup olmadığını test edin. if (!root.success()) { //Serial.println("Mevcut hava durumu için ayrıştırılıyor…HATA!"); dönüş; } JsonObject& hava durumu = kök["hava durumu"][0]; const char* weather_main = hava durumu["ana"]; JsonObject& ana = kök["ana"]; float main_temp = main["temp"]; int ana_nem = ana["nem"]; float wind_speed = root["rüzgar"]["hız"]; const char* zaman damgası = kök["dt_txt"]; int tempFah = convertToFahrenheit(main_temp); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree[0] = servoMaxDegree; int servoIncrement = updateleftRight(wind_speed); leftRightSpeed[0] = servoArtış; setColor(hava_ana, 0); weatherArray[0] = weather_main; sıcaklıkArray[0] = tempFah; nemArray[0]= main_humidity; windSpeedArray[0] = wind_speed; timestampArray[0] = zaman damgası; }

Aşağıda, servo motorların konumlarının güncellenmesini, sıcaklığın Kelvin'den Fahrenheit'e dönüştürülmesini ve LED'lerin renklerini ayarlamayı kontrol eden ek fonksiyonları bulabilirsiniz.

int updateUpDown(float temp){ //Dereceyi [0, 180] aralığına eşleyin float servoMaxDegree = temp * 45 / 31 + (990 / 31); Serial.print("yeni servo derecesi: "); Serial.println(servoMaxDegree); servoMaxDegree'yi iade edin; }

int updateleftRight(float windSpeed){

//Rüzgar hızını [1, 100] float servoIncrement = windSpeed * 99 / 26 + 1 aralığına eşleyin; Serial.print("yeni servo artış değeri: "); Serial.println(servoIncrement); dönüş servoArtımı; }

int convertToFahrenheit(float tempKel){

int tempFah = tempKel * 9.0 / 5.0 - 459.67; dönüş tempFah; }

void setColor(String weatherDesc, int index){

int ledIndex = 0; if (index == 0){ ledIndex = 0; } else if (index == 1){ ledIndex = 6; } else if (index == 2){ ledIndex = 12; } başka{ dönüş; } if(weatherDesc == "Temizle") { //sarı for (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(253, 219, 62));// sarı şerit.göster(); gecikme(20); } } else if(weatherDesc == "Bulutlar"){ //grey for (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(223, 229, 237)); //gri şerit.göster(); gecikme(20); } } else if (weatherDesc == "Snow"){ //white for (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(255, 225, 225)); //beyaz şerit.göster(); gecikme(20); } } else if (weatherDesc == "Yağmur"){//blue for (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(119, 191, 246)); //mavi şerit.göster(); gecikme(20); } } else{ //red for (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(254, 11, 5));//red strip.show(); gecikme(20); } } }

Arduino dosyanıza eklenen her şeyi aldıktan sonra derleyin. Hata yoksa, devam edin ve kodu ilk Foton'a flaşlayın. Bir sonraki adım, ikinci Fotonda parlatılacak benzer kodu size sağlayacaktır.

Adım 9: Programlama Devam Ediyor

İkinci Fotonun kodu, birincininkiyle neredeyse aynı olduğundan, kodun tamamı kopyalanır ve aşağıya yapıştırılır:

#include "ArduinoJson.h"

Servo servoSolSağ_3;

Servo servoUpDown_3;

int konumSolSağ_3 = 45;

int positionUpDown_3 = 0; int leftRight_3 = 1; int upDown_3 = 1;

const size_t bufferSizeCurrent = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + JSON_OBJECT_SIZE(12) + 3

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

Dize hava durumuArray[3];

yüzer sıcaklıkArray[3]; yüzer nemArray[3]; float windSpeedArray[3]; String zaman damgasıArray[3]; int upDownMaxDegree[3]; int leftRightSpeed[3];

allData5DaysForecast dizisini;

geçersiz getWeather5DayForecast()

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

Zamanlayıcı zamanlayıcıWeatherForecast(60000, getWeather5DayForecast); //10, 800.000 ms = 3 gün

geçersiz getCurrentWeather()

{ Particle.publish("get_currentWeather2"); }

Zamanlayıcı zamanlayıcıWeatherCurrent(60000, getCurrentWeather);

geçersiz changeLeftRight3() {

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); }

geçersiz changeUpDown3() {

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

Zamanlayıcı zamanlayıcıSolSağ3(100, changeLeftRight3);

Zamanlayıcı timerUpDown3(10, changeUpDown3);

geçersiz kurulum() {

// hava durumu zamanlayıcılarını başlat timerWeatherForecast.start(); timerWeatherCurrent.start(); // Başlatmayı pinMode gibi koyun ve fonksiyonları buradan başlatın. // Mikro Servo servoLeftRight_3.attach(D1)'i kurun; servoUpDown_3.attach(D0);

servoLeftRight_3.write(positionLeftRight_3); //servo pozisyonunu başlat

servoUpDown_3.write(positionUpDown_3); //servo pozisyonunu başlat

timerLeftRight3.start();

timerUpDown3.start(); // Bir konsol açın Serial.begin(9600); gecikme(2000); Serial.println("Merhaba!"); // get_weather5DayForecast ve get_currentWeather web kancalarına abone olun 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 *veri)

{ allData5DaysForecast += veri; // tüm verileri tek bir dizgeye kaydeder. int allData5DaysForecastLen = allData5DaysForecast.length(); char arabelleği[allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray(arabellek, allData5DaysForecastLen + 1); // string için bir tampon yarat int bufferLength = sizeof(buffer); DynamicJsonBuffer jsonBufferWeather(bufferLength); JsonObject& root = jsonBufferWeather.parseObject(buffer); //Serial.println(allData5DaysForecast); // Ayrıştırmanın başarılı olup olmadığını test edin. if (!root.success()) { //Serial.println("5 günlük hava tahmini için ayrıştırılıyor…HATA!"); dönüş; } int ben = 1; JsonArray& list = root["list"]; for (JsonObject& currentObject: list){ if (i < 3){ JsonObject& main = currentObject["main"]; şamandıra sıcaklığı = ana["temp"]; int nem = ana["nem"]; JsonObject& hava durumu = currentObject["weather"][0]; const char* weatherInfo = hava durumu["ana"]; float windSpeed = currentObject["rüzgar"]["hız"]; const char* zaman damgası = currentObject["dt_txt"]; int tempFah = convertToFahrenheit(sıcaklık); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight(windSpeed); leftRightSpeed = servoArtış; sıcaklıkArray = tempFah; nemArray = nem; weatherArray = weatherInfo; windSpeedArray = rüzgarHızı; timestampArray = zaman damgası; ben++; } başka{ ara; } } }

void gotCurrentWeatherData(const char *olay, const char *veri)

{ DynamicJsonBuffer jsonBufferWeather(bufferSizeCurrent); JsonObject& root = jsonBufferWeather.parseObject(veri); //Serial.println(veri); // Ayrıştırmanın başarılı olup olmadığını test edin. if (!root.success()) { //Serial.println("Mevcut hava durumu için ayrıştırılıyor…HATA!"); dönüş; } JsonObject& hava durumu = kök["hava durumu"][0]; const char* weather_main = hava durumu["ana"]; JsonObject& ana = kök["ana"]; float main_temp = main["temp"]; int ana_nem = ana["nem"]; float wind_speed = root["rüzgar"]["hız"]; const char* zaman damgası = kök["dt_txt"]; int tempFah = convertToFahrenheit(main_temp); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree[0] = servoMaxDegree; int servoIncrement = updateleftRight(wind_speed); leftRightSpeed[0] = servoArtış; weatherArray[0] = weather_main; sıcaklıkArray[0] = tempFah; nemArray[0]= main_humidity; windSpeedArray[0] = wind_speed; timestampArray[0] = zaman damgası; }

int updateUpDown(kayan sıcaklık){

//Dereceyi [0, 180] float servoMaxDegree = temp * 45 / 31 + (990 / 31); Serial.print("yeni servo derecesi: "); Serial.println(servoMaxDegree); servoMaxDegree'yi iade edin; }

int updateleftRight(float windSpeed){

//Rüzgar hızını [1, 100] float servoIncrement = windSpeed * 99 / 26 + 1 aralığına eşleyin; Serial.print("yeni servo artış değeri: "); Serial.println(servoIncrement); dönüş servoArtımı; }

int convertToFahrenheit(float tempKel){

int tempFah = tempKel * 9.0 / 5.0 - 459.67; dönüş tempFah; }

Sen yaptın! Projenin programlama bölümünden geçtiniz! Şimdi servo motorlardan ve neopiksellerden breadboard ve mikrodenetleyicilere kadar tüm kablolama ve bağlantıları yaptığınızdan emin olun. NOT: Gövdenin sol ve sağ hareketleri için ekstra dübelleri/çubukları kutuların üzerindeki dikey yarıklardan geçirin. Diğer ucu ejderhanın gövdesine bağlanmalıdır.

Adım 10: Ejderhanızın Keyfini Çıkarın

Tebrikler! Sıfırdan bir Sinüs Ejderhası inşa ettin! Şimdi tek yapmanız gereken arkanıza yaslanıp ortam görüntüsünün keyfini çıkarmak!

NOT: Bu proje, Joan Bempong ve Soundarya Muthuvel tarafından verilen bir kursun parçası olarak inşa edilmiştir. Kurs sayfasına buradan ulaşabilirsiniz.

Önerilen: