Kazalo:

Sine-ese Dragon: 10 korakov (s slikami)
Sine-ese Dragon: 10 korakov (s slikami)

Video: Sine-ese Dragon: 10 korakov (s slikami)

Video: Sine-ese Dragon: 10 korakov (s slikami)
Video: Какого числа от 1 до 31, родился человек, такая у него и вся жизнь 2024, Julij
Anonim
Sinusni zmaj
Sinusni zmaj

Sine-ese Dragon je dekoracija domačega okolja, ki z mehanskimi gibi in lučmi pove vremensko napoved za naslednje tri triurne intervale. Ambient po definiciji opisuje neposredno okolico nečesa; zato je bilo odločeno, da je primerno vključiti vremenske podatke v zunanji prikaz. Vreme je vidik, ki nenamerno spremeni dan ljudi in je podatek, ki se nenehno spreminja vsako minuto ali celo do sekunde.

Kitajski zmaj je "simbol moči, moči in sreče" in je pogosto na visoki kulturni in tradicionalni vrednosti po azijski podcelini. Poleg tega, da kitajski zmaj prinaša srečo, naj bi imel tudi močne moči, ki nadzorujejo »vodo, padavine, tajfune in poplave«. Konec koncev je bil kitajski zmaj primeren za predstavitev vremenskih podatkov.

Vizualizacija

Sineeski zmaj se manipulira na šestih glavnih točkah na treh ločenih odsekih, ki predstavljajo vremensko napoved za tri 3-urne intervale. Za vsak 3-urni interval bodo vključeni naslednji podatki:

  • Opis vremena - določa barvo trenutnih vremenskih informacij.
  • Temperatura - določa višino telesa
  • Vlažnost - utripanje LED segmentov
  • Hitrost vetra - nadzoruje hitrost telesa, ki se premika levo in desno.

Potrebni materiali

  1. 3 mm vezane plošče/lepenka
  2. 5 mm leseni mozniki ali paličice
  3. 2 fotona delcev
  4. 3 Slinky igrače
  5. 6 servo motorjev
  6. Luči NeoPixel (bodisi prameni ali posamezne luči, sešiti skupaj)
  7. Veliko super lepila
  8. Prevodna nit
  9. Akrilna barva
  10. Dekorativna tkanina
  11. Laserski rezalnik
  12. 3D tiskalnik

1. korak: gor in dol

Gor in dol!
Gor in dol!
Gor in dol!
Gor in dol!
Gor in dol!
Gor in dol!

Vaš prvi korak pri izgradnji Sineeskega zmaja je izdelava komponente, ki nadzoruje gibanje telesa navzgor in navzdol. Kako razburljivo!

  1. Prenesite datoteke Adobe Illustrator (.ai) in jih natisnite z laserskim rezalnikom.

    upDownBoxWithPlatform.ai je treba natisniti na karton

  2. Prenesite datoteke za 3D tiskanje (.stl) in jih natisnite s svojim najljubšim 3D tiskalnikom.

    Barva ni pomembna za disk ali obračalnik diska. Na drugi sliki je vrtalnik diska vstavljen v luknjo diska

  3. Sestavite prvi dve komponenti in ju zlepite skupaj, kot je prikazano na slikah 3 do 5.

    1. Platforma
    2. Utori za disk
  4. Zdaj sestavite škatlo po spodnjih nasvetih.

    1. Servo žice morajo iti skozi pravokotno odprtino na strani škatle.
    2. Najkrajši konec obračalnika diska se pritrdi na servo glavo, daljši pa skozi luknjo na drugi strani škatle s krožno luknjo. To je prikazano na sliki 6.
  5. Zdaj potrebujemo nekaj, da zagotovimo, da platforma ostane izravnana, ko se disk obrne. Paličico razrežite na palice dolžine 75 mm (slika 7) in jih z vročim lepilom zlepite skozi vrh škatle na vrh ploščadi. Prepričajte se, da so palice poravnane navzdol za 90 stopinj glede na ploščad.
  6. V sredinsko luknjo na vrhu škatle na ploščad vstavite 212 mm dolgo palico.

Sladko! Zdaj imate popolno polje (slika 8) za premikanje zmaja navzgor in navzdol. Zdaj ponovite zgornje korake še dvakrat!

2. korak: Kaj pa levo in desno ?

Kaj pa levo in desno ?!
Kaj pa levo in desno ?!
Kaj pa levo in desno ?!
Kaj pa levo in desno ?!
Kaj pa levo in desno ?!
Kaj pa levo in desno ?!
Kaj pa levo in desno ?!
Kaj pa levo in desno ?!

Ne moremo pozabiti na levo in desno gibanje Sineeskega zmaja, kajne? Skočimo v drugi korak!

  1. Prenesite datoteke Adobe Illustrator (.ai) in jih natisnite z laserskim rezalnikom.

    1. leftRightBoxWithPlatforms.ai je treba natisniti na karton.
    2. Datoteko armTurner.ai je treba natisniti na material, debeline 3 mm.
  2. Prenesite datoteke za 3D tiskanje (.stl) in jih natisnite s svojim najljubšim 3D tiskalnikom.

    Natisnite dve roki! Barva tukaj ni pomembna

  3. S pomočjo vročega lepila sestavite obe ploščadi skupaj, kot je prikazano na sliki 3.
  4. Sestavite škatlo. Čeprav je to težko, je to lažje doseči z:

    1. Vstavljanje dveh ploščadi med dve veliki reži na obeh straneh škatle.
    2. Prvo roko položite na vrh zgornje ploščadi.
    3. Navoj stružnice za roko skozi roko in nato zgornjo ploščad.
    4. Drugo roko položite na vrh spodnje ploščadi.
    5. Navoj stružnice roke skozi drugo roko in nato spodnjo ploščad.
    6. Stiskanje ročaja skozi pravokotno odprtino 3D tiskanega rotorja.
    7. Drugi konec stružnice je na vrhu servo motorja.
    8. V škatlo dodajte zgornji, spodnji in zadnji del.

Vaša zadnja sestavljena škatla bi morala izgledati kot šesta slika. Zdaj lahko to ponovite še dvakrat!

Do konca tega koraka bi morali imeti šest škatel s po tremi sistemi za premikanje navzgor/navzdol in levo/desno.

3. korak: Držite telo … KAKO?

Držanje telesa … KAKO?
Držanje telesa … KAKO?

Dobro vprašanje! Takrat pridejo tista 3D natisnjena drzna držala. Prenesite priloženo datoteko.stl in jo natisnite s 3D tiskalnikom. Natisnite skupaj 6 držalov za 6 različnih škatel.

Če ste zgoraj videli sliko drznega držala, je presenečenje uničeno - to je barva našega Sine -ese Dragon!

4. korak: Toda te škatle niso tako lepe …

In se strinjam! Zato bomo z laserskim rezalnikom izrezali veliko bolj privlačno škatlo, ki bo vsebovala vse te škatle in jih prikrila.

Prenesite te datoteke Adobe Illustrator in jih izrežite z laserskim rezalnikom. Oblikovanje oblakov je ročno narisal eden od avtorjev. Prilagodite jih tako, da jih odstranite v datoteki ilustratorja in dodate svoj dizajn, kot se vam zdi primerno! Spodaj so predlagani koraki za združevanje vsega skupaj.

  1. Sestavite in zlepite vse tri kose iz prve datoteke (externalBoxFinal_1) skupaj.
  2. Ne dodajajte še dela iz druge datoteke (externalBoxFinal_2).
  3. Košček iz tretje datoteke (externalBoxFinal_3) postavite na dno polja in naj se zapre na vrhu. Lepite SAMO na dnu škatle.
  4. Dvakrat natisnite innerBoxesPlatform. Dva kosa, ki imata velike pravokotne luknje, zlepite skupaj. Nato zlepite tri preostale kose skupaj. Na koncu ga prilepite na drugi lepljeni komplet z luknjami.
  5. Platformo postavite na dno velike škatle.
  6. Vstavite vseh 6 manjših škatel v ustrezna mesta na ploščadi.
  7. Zdaj postavite kos iz druge datoteke (externalBoxFinal_2) na vrh škatle in lepite po robu. Luknje na zgornjem delu se morajo poravnati z luknjami na manjših škatlah. Če ne, preuredite manjše škatle. Manjšim škatlam sploh ne dodajajte lepila.
  8. Če uporabljate ploščo z lepljivim kosom na dnu, jo postavite blizu središča spodnjega kosa na mesto, da bi ob zapiranju škatle plošča skupaj s fotoni izginila. Na spodnjem delu so majhne reže, ki vam olajšajo povezavo s fotoni od zunaj.

5. korak: Slinky Toys ?? Ojoj

Slinky Toys ?? Ojoj!
Slinky Toys ?? Ojoj!
Slinky Toys ?? Ojoj!
Slinky Toys ?? Ojoj!

Zmajevo telo:

1. Z vročim lepilom ali trakom združite tri slinkies.

2. Izmerite dolžino in premer drsnikov in odrežite kos okrasne tkanine.

3. Prinesite oba konca tkanine in ju sešite skupaj.

4. Ko jih končate s šivanjem, potisnite slinkies kot nogavico.

5. Konce škrlatne tkanine prišijemo do prišivenega blaga.

6. korak: Natisnite svojega zmaja

3D natisnjeni deli zmaja:

1. Deli so vzeti s spletnega mesta

2. Uporabljali smo samo glavo, noge in oči.

3. Po 3D tiskanju dela ga zgladite z brusnim papirjem in acetonom.

4. Pobarvaj dele tako, kot jih želiš okrasiti.

7. korak: Čas je, da okrepite svojega zmaja z NeoPixels

Čas je, da okrepite svojega zmaja z NeoPixels!
Čas je, da okrepite svojega zmaja z NeoPixels!
Čas je, da okrepite svojega zmaja z NeoPixels!
Čas je, da okrepite svojega zmaja z NeoPixels!

Svetlobni segment:

1. Če želite, lahko za ustvarjanje luči preprosto uporabite pramen neopiksela (zmanjkalo nam je pramenov).

2. Uporabili smo 20 svetilk neopixel in jih povezali z žicami. Te žice so bile spajkane nanje in z rdečim ožičenjem povezane s fotonom, tako da ustreza temi zmaja.

3. Svoje neopixel luči lahko prišijete tudi na dolg kos tkanine, vendar jih nismo uporabili, ker smo imeli kovine narezane.

Sestavljanje delov: Svetlobni segment v telesu zmaja pritrdite z nitmi ali žicami. Prepričajte se, da lahko luči povežete s fotonom v osnovni škatli. Z lepilom pritrdite glavo, noge in rep na telo. Ko so na svojem mestu, pritrdite telo v drzna držala, ki smo jih natisnili prej. Zdaj je telo pripravljeno za programiranje.

8. korak: Čas programiranja

Ker bomo za delo s šestimi ločenimi servo motorji uporabljali dva fotona delcev (en Foton lahko deluje le s štirimi), bomo na mikrokrmilnike zapisali dve ločeni, vendar podobni kodi.

Zdaj za prvi mikrokrmilnik …

V datoteko Arduino (.ino) vključite naslednje knjižnice in opredelite:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Nato razglasite naslednje spremenljivke:

Adafruit_NeoPixel strip = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN);

Servo servoLeftRight_1; Servo servoUpDown_1; Servo servoLeftRight_2; Servo servoUpDown_2; int positionLeftRight_1 = 0; int positionUpDown_1 = 0; int leftRight_1 = 1; int upDown_1 = 1; int positionLeftRight_2 = 100; // mora biti med 0 in 180 (v stopinjah) int positionUpDown_2 = 180; // mora biti med 0 in 180 (v stopinjah) int leftRight_2 = 1; // 0 = levo, 1 = desno int upDown_2 = 1; // 0 = navzgor, 1 = navzdol 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 + JSON + 6S + JSON 390; const size_t medpomnilnik (5) + 76*JSON_OBJECT_SIZE (8) + 12490; Nizov weatherArray [3]; temperatura plavajočega poljaArray [3]; vlažnost plavajoče matrike [3]; float windSpeedArray [3]; Časovni žig nizaArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; Niz allData5DaysForecast;

Kliknite tukaj, če želite izvedeti, kako nastaviti webhooks. Ko končate, dodajte naslednje deklaracije in funkcije ter po potrebi ustrezno spremenite:

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

Naslednje funkcije nadzorujejo premike zmaja navzgor/navzdol in levo/desno:

void changeLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; če (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); }

void changeLeftRight2 () {

if (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1]; če (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); }

void changeUpDown1 () {

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

void changeUpDown2 () {

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

Za spreminjanje gibov v intervalu se ustvarijo časovniki.

Timer timerLeftRight1 (100, changeLeftRight1);

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

Naslednja je končno dodana nastavitvena funkcija. Bodite prepričani, da ustrezno spremenite vrstice kode, ki obravnavajo spletne kljuke.

void setup () {// zaženite merilnike vremena timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixel strip.begin (); // Inicializacijo postavite kot pinMode in začnite funkcije tukaj. // Nastavite servo servoLeftRight_1.attach (D1) mikro servo; servoUpDown_1.attach (D0); servoLeftRight_2.priključek (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // inicializiramo položaj servo servoUpDown_1.write (positionUpDown_1); // inicializiramo položaj servo servoLeftRight_2.write (positionLeftRight_2); // inicializiramo položaj servo servoUpDown_2.write (positionUpDown_2); // inicializiramo položaj servo timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Odprite konzolo Serial.begin (9600); zamuda (2000); Serial.println ("Pozdravljeni!"); // Naročite se na get_weather5DayForecast in get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Za ta projekt se ne uporablja funkcija zanke. Ne smemo pozabiti na funkcije za obdelavo podatkov, prejetih od spletnih klicev!

void gotWeather5DayForecast (const char *dogodek, const char *podatki) {allData5DaysForecast += podatki; // shrani vse podatke v en niz. int allData5DaysForecastLen = allData5DaysForecast.length (); medpomnilnik char [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (medpomnilnik, allData5DaysForecastLen + 1); // ustvarimo medpomnilnik za niz int bufferLength = sizeof (medpomnilnik); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (vmesnik); // Preverimo, ali je razčlenitev uspela. if (! root.success ()) {//Serial.println("Odvajanje vremenske napovedi 5 -dnevna napoved … NAPAKA! "); vrnitev; } int i = 1; JsonArray & list = root ["seznam"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; plavajoča temperatura = main ["temp"]; int vlažnost = main ["vlažnost"]; JsonObject & weather = currentObject ["vreme"] [0]; const char* weatherInfo = vreme ["glavni"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* časovni žig = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; moisArray = vlažnost; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = časovni žig; i ++; } else {break; }}}

void gotCurrentWeatherData (dogodek const char *, podatki const char *) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (podatki); // Preverimo, ali je razčlenitev uspela. if (! root.success ()) {//Serial.println(" Razčlenjevanje glede trenutnega vremena … NAPAKA! "); vrnitev; } JsonObject & weather = root ["vreme"] [0]; const char* weather_main = vreme ["glavni"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["vlažnost"]; float wind_speed = root ["wind"] ["speed"]; const char* časovni žig = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (hitrost vetra); leftRightSpeed [0] = servoIncrement; setColor (weather_main, 0); weatherArray [0] = weather_main; temperatureArray [0] = tempFah; moisArray [0] = glavna_vlažnost; windSpeedArray [0] = hitrost vetra; timestampArray [0] = časovni žig; }

Spodaj najdete dodatne funkcije, ki nadzorujejo posodabljanje položajev servo motorjev, pretvorbo temperature iz Kelvina v Fahrenheit in nastavljanje barv LED.

int updateUpDown (float temp) {// Preslikava stopinje v obseg [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("nova stopnja servo:"); Serial.println (servoMaxDegree); povratni servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Preslikajte hitrost vetra v območje [1, 100] plavajočega servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("nova vrednost prirasta servo:"); Serial.println (servoIncrement); povratni servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; vrnitev tempFah; }

void setColor (String weatherDesc, int index) {

int ledIndex = 0; if (indeks == 0) {ledIndex = 0; } else if (index == 1) {ledIndex = 6; } else if (index == 2) {ledIndex = 12; } else {return; } if (weatherDesc == "Clear") {// rumena za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // rumeni trak.show (); zamuda (20); }} else if (weatherDesc == "Clouds") {// sivo za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // siv trak.show (); zamuda (20); }} else if (weatherDesc == "Snow") {// belo za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // beli trak.show (); zamuda (20); }} else if (weatherDesc == "Rain") {// blue for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // modri trak.show (); zamuda (20); }} else {// rdeče za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // rdeč strip.show (); zamuda (20); }}}

Ko dodate vse v svojo datoteko Arduino, jo sestavite. Če ni napak, nadaljujte in kodo utripajte do prvega Photona. Naslednji korak vam bo posredoval podobno kodo, ki jo želite utripati na drugem fotonu.

9. korak: Programiranje se nadaljuje

Ker je koda za drugi Photon skoraj enaka kodi za prvi, se celotna koda kopira in prilepi spodaj:

#include "ArduinoJson.h"

Servo servoLeftRight_3;

Servo servoUpDown_3;

int positionLeftRight_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

const size_t medpomnilnik (5) + 76*JSON_OBJECT_SIZE (8) + 12490;

Nizov weatherArray [3];

plavajoča temperaturaArray [3]; vlažnost plavajočega polja [3]; float windSpeedArray [3]; Časovni žig nizaArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

Niz allData5DaysForecast;

void getWeather5DayForecast ()

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

Timer timerWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 dni

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Timer timerWeatherCurrent (60000, getCurrentWeather);

void changeLeftRight3 () {

if (leftRight_3) {positionLeftRight_3 = positionLeftRight_3 + leftRightSpeed [2]; če (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); }

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

Timer timerLeftRight3 (100, changeLeftRight3);

Timer timerUpDown3 (10, changeUpDown3);

void setup () {

// zaženemo merilnike vremena timerWeatherForecast.start (); timerWeatherCurrent.start (); // Inicializacijo postavite kot pinMode in začnite funkcije tukaj. // Nastavitev servo serveraLeftRight_3.attach (D1) mikro servo; servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // inicializiramo položaj servo

servoUpDown_3.write (positionUpDown_3); // inicializiramo položaj servo

timerLeftRight3.start ();

timerUpDown3.start (); // Odprite konzolo Serial.begin (9600); zamuda (2000); Serial.println ("Pozdravljeni!"); // Naročite se na get_weather5DayForecast in 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 (dogodek const char *, const char *podatki)

{allData5DaysForecast += podatki; // shrani vse podatke v en niz. int allData5DaysForecastLen = allData5DaysForecast.length (); medpomnilnik char [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (medpomnilnik, allData5DaysForecastLen + 1); // ustvarimo medpomnilnik za niz int bufferLength = sizeof (medpomnilnik); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (vmesnik); //Serial.println(allData5DaysForecast); // Preverimo, ali je razčlenitev uspela. if (! root.success ()) {//Serial.println("Odvajanje vremenske napovedi 5 -dnevna napoved … NAPAKA! "); vrnitev; } int i = 1; JsonArray & list = root ["seznam"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; plavajoča temperatura = main ["temp"]; int vlažnost = main ["vlažnost"]; JsonObject & weather = currentObject ["vreme"] [0]; const char* weatherInfo = vreme ["glavni"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* časovni žig = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; moisArray = vlažnost; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = časovni žig; i ++; } else {break; }}}

void gotCurrentWeatherData (dogodek const char *, podatki const char *)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (podatki); //Serial.println(data); // Preverimo, ali je razčlenitev uspela. if (! root.success ()) {//Serial.println(" Razčlenjevanje glede trenutnega vremena … NAPAKA! "); vrnitev; } JsonObject & weather = root ["vreme"] [0]; const char* weather_main = vreme ["glavni"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["vlažnost"]; float wind_speed = root ["wind"] ["speed"]; const char* časovni žig = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (hitrost vetra); leftRightSpeed [0] = servoIncrement; weatherArray [0] = weather_main; temperatureArray [0] = tempFah; moisArray [0] = glavna_vlažnost; windSpeedArray [0] = hitrost vetra; timestampArray [0] = časovni žig; }

int updateUpDown (float temp) {

// Preslikava stopinj v obseg [0, 180] plavajočega servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("nova stopnja servo:"); Serial.println (servoMaxDegree); povratni servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Preslikajte hitrost vetra v območje [1, 100] plavajočega servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("nova vrednost prirasta servo:"); Serial.println (servoIncrement); povratni servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; vrnitev tempFah; }

Ti si naredil! Uspeli ste skozi programski del projekta! Vsekakor pa ožičenje in povezave od servo motorjev in neopikslov do plošče in mikrokrmilnikov OPOMBA: vstavite dodatne moznike/palčke skozi navpične reže na škatlah za levi in desni premik telesa. Drugi konec mora biti povezan s telesom zmaja.

10. korak: Uživajte v svojem zmaju

Čestitamo! Sineeskega zmaja ste zgradili iz nič! Zdaj morate le sedeti in uživati v svojem ambientalnem prikazu!

OPOMBA: Ta projekt sta nastala kot del predavanj Joan Bempong in Soundarye Muthuvel. Stran tečaja najdete tukaj.

Priporočena: