Sadržaj:

Sine-ese zmaj: 10 koraka (sa slikama)
Sine-ese zmaj: 10 koraka (sa slikama)

Video: Sine-ese zmaj: 10 koraka (sa slikama)

Video: Sine-ese zmaj: 10 koraka (sa slikama)
Video: 10 лет в Японии: Что изменилось? Отвечаю на популярные вопросы! 2024, Juli
Anonim
Sinusni zmaj
Sinusni zmaj

Sine-ese Dragon je ambijentalni komad uređenja doma koji koristi mehaničke pokrete i svjetla kako bi vam rekao vremensku prognozu za sljedeća tri trosatna intervala. Po definiciji, ambijent opisuje neposredno okruženje nečega; stoga je odlučeno da je prikladno uključiti vremenske podatke u ambijentalni prikaz. Vrijeme je aspekt koji nenamjerno mijenja dan ljudi i podatak je koji se stalno mijenja svake minute, pa čak i do sekunde.

Kineski zmaj je "simbol moći, snage i sreće" i često se drži na visokoj kulturnoj i tradicionalnoj vrijednosti širom azijskog potkontinenta. Osim što donosi sreću, kineski Zmaj ima i moćne moći koje kontroliraju „vodu, padavine, tajfune i poplave“. Na kraju se kineski zmaj smatrao prikladnim za predstavljanje vremenskih podataka.

Vizualizacija

Sinusni zmaj se manipulira na šest glavnih točaka u tri odvojena odjeljka koji predstavljaju vremensku prognozu u tri intervala od 3 sata. Za svaki 3-satni interval bit će uključene sljedeće informacije:

  • Opis vremena - određuje boju trenutnih vremenskih podataka.
  • Temperatura - određuje visinu tijela
  • Vlažnost - treptanje LED segmenata
  • Brzina vjetra - kontrolira brzinu kretanja tijela lijevo i desno.

Potrebni materijali

  1. 3 mm šperploča/karton
  2. Drveni tipli ili štapići za drvo od 5 mm
  3. 2 fotona čestica
  4. 3 klizave igračke
  5. 6 servo motora
  6. NeoPixel svjetla (žica ili pojedinačna svjetla ušivena zajedno)
  7. Puno super ljepila
  8. Provodni navoj
  9. Akrilna boja
  10. Dekorativna tkanina
  11. Laserski rezač
  12. 3D štampač

Korak 1: Gore i dolje

Gore i dolje!
Gore i dolje!
Gore i dolje!
Gore i dolje!
Gore i dolje!
Gore i dolje!

Vaš prvi korak u izgradnji Sineeskog zmaja je izgradnja komponente koja kontrolira kretanje tijela gore i dolje. Kako uzbudljivo!

  1. Preuzmite datoteke Adobe Illustrator (.ai) i odštampajte ih pomoću mašine za lasersko sečenje.

    upDownBoxWithPlatform.ai treba odštampati na kartonu

  2. Preuzmite datoteke za 3D štampanje (.stl) i ispišite ih pomoću svog omiljenog 3D štampača.

    Boja nije bitna za disk ili okretač diska. Na drugoj slici, okretač diska je umetnut unutar rupe na disku

  3. Sastavite prve dvije komponente i zalijepite ih zajedno kao što je prikazano na slikama 3 do 5.

    1. Platforma
    2. Utori za disk
  4. Sada sastavite okvir slijedeći donje savjete.

    1. Servo žice trebaju proći kroz pravokutni otvor na bočnoj strani kutije.
    2. Najkraći kraj okretača diska pričvršćuje se na servo glavu, a duži kraj prolazi kroz otvor na drugoj strani kutije s kružnom rupom. To je prikazano na slici 6.
  5. Sada nam je potrebno nešto kako bismo osigurali da platforma ostane poravnata kada se disk okrene. Izrežite štapić za štapiće na štapiće dugačke 75 mm (slika 7) i vrućim ljepilom zalijepite ih kroz vrh kutije na vrh platforme. Uvjerite se da su štapovi poravnati na 90 stepeni prema platformi.
  6. Umetnite štap dug 212 mm u srednju rupu na vrhu kutije na platformi.

Sweet! Sada imate potpunu kutiju (slika 8) za kretanje zmaja gore i dolje. Sada ponovite gore navedene korake još dva puta!

Korak 2: Šta je s lijevo i desno ?

Šta je s lijevo i desno ?!
Šta je s lijevo i desno ?!
Šta je s lijevo i desno ?!
Šta je s lijevo i desno ?!
Šta je s lijevo i desno ?!
Šta je s lijevo i desno ?!
Šta je s lijevo i desno ?!
Šta je s lijevo i desno ?!

Ne možemo zaboraviti lijevo i desno kretanje Sineeskog Zmaja, zar ne? Prijeđimo na drugi korak!

  1. Preuzmite datoteke Adobe Illustrator (.ai) i odštampajte ih pomoću mašine za lasersko sečenje.

    1. leftRightBoxWithPlatforms.ai treba odštampati na kartonu.
    2. Datoteku armTurner.ai treba odštampati na materijalu debljine 3 mm.
  2. Preuzmite datoteke za 3D štampanje (.stl) i odštampajte ih pomoću svog omiljenog 3D štampača.

    Obavezno odštampajte dvije ruke! Boja ovdje nije bitna

  3. Sastavite dvije platforme zajedno kao što je prikazano na slici 3 pomoću vrućeg ljepila.
  4. Sastavi kutiju. Iako je to možda teško, to je lakše postići:

    1. Umetanje dvije platforme između dva velika proreza s obje strane kutije.
    2. Postavljanje prve ruke na vrh gornje platforme.
    3. Provucite okretač ruke kroz ruku, a zatim gornju platformu.
    4. Postavljanje druge ruke na vrh donje platforme.
    5. Provucite okretnik za ruke kroz drugu ruku, a zatim donju platformu.
    6. Provlačenje okretača za ruke kroz pravokutni otvor 3D štampača za okretanje ruku.
    7. Drugi kraj okretača ide preko servo motora.
    8. Dodajte gornje, donje i stražnje dijelove u kutiju.

Vaša posljednja sastavljena kutija trebala bi izgledati kao šesta slika. Sada to možete ponoviti još dva puta!

Do kraja ovog koraka trebali biste imati šest kutija sa po tri sistema za kretanje gore/dolje i lijevo/desno.

Korak 3: Podizanje tijela … KAKO?

Držanje tela … KAKO?
Držanje tela … KAKO?

Dobro pitanje! Tada dolaze oni 3D štampani drškasti držači. Preuzmite uključenu.stl datoteku i odštampajte je pomoću 3D štampača. Odštampajte ukupno 6 držača za 6 različitih kutija.

Ako ste vidjeli sliku držača sa šljokicama iznad, iznenađenje je uništeno - to je boja našeg Sine -ese zmaja!

Korak 4: Ali te kutije nisu tako lijepe …

I slažem se! Zato ćemo laserskim rezačem izrezati mnogo atraktivniju kutiju u koju će se sve te kutije ugraditi i sakriti.

Preuzmite te datoteke Adobe Illustrator i izrežite ih laserskim rezačem. Dizajn oblaka ručno je nacrtao jedan od saradnika. Slobodno ih izmijenite uklanjanjem unutar datoteke ilustratora i dodavanjem vlastitog dizajna kako smatrate prikladnim! U nastavku su predloženi koraci za sastavljanje svega.

  1. Sastavite i zalijepite sva tri komada iz prve datoteke (externalBoxFinal_1) zajedno.
  2. Nemojte još dodavati komad iz druge datoteke (externalBoxFinal_2).
  3. Stavite komad iz treće datoteke (externalBoxFinal_3) na dno okvira i trebao bi se zatvoriti na vrhu. Zalijepite SAMO na dno kutije.
  4. Štampajte innerBoxesPlatform dva puta. Zalijepite zajedno dva komada koji imaju velike pravokutne rupe. Zatim zalijepite tri preostala komada zajedno. Na kraju, zalijepite ga na drugi zalijepljeni set s rupama u njima.
  5. Postavite platformu na dno velike kutije.
  6. Umetnite svih 6 manjih kutija u odgovarajuća mjesta na platformi.
  7. Sada stavite komad iz druge datoteke (externalBoxFinal_2) na vrh kutije i zalijepite oko ruba. Rupe na gornjem dijelu trebaju se poravnati s rupama na manjim kutijama. Ako ne, preuredite svoje manje kutije. Manjim kutijama uopće nemojte dodavati ljepilo.
  8. Ako koristite ploču s ljepljivim komadom na dnu, postavite je blizu središta donjeg dijela na mjesto na kojem bi, kad zatvorite kutiju, matična ploča zajedno s fotonima nestala. Na donjem dijelu nalaze se mali prorezi koji vam olakšavaju spajanje na fotone izvana.

Korak 5: Slinky igračke ?? O moj

Slinky Toys ?? O moj!
Slinky Toys ?? O moj!
Slinky Toys ?? O moj!
Slinky Toys ?? O moj!

Zmajevo tijelo:

1. Kombinirajte tri klizaljke zajedno vrućim ljepilom ili trakom.

2. Izmjerite dužinu i promjer klizača i izrežite komad ukrasne tkanine.

3. Donesite dva kraja tkanine i sašite ih zajedno.

4. Kada završite sa šivanjem, uvucite klizače poput čarape.

5. Prišijte krajeve šljokice na sašivenu tkaninu.

Korak 6: Odštampajte svog zmaja

3D štampani dijelovi zmaja:

1. Dijelovi su preuzeti sa

2. Koristili smo samo glavu, noge i oči.

3. Nakon 3D ispisa dijela, zagladite ga brusnim papirom i acetonom.

4. Obojite dijelove onako kako želite ukrasiti.

Korak 7: Vrijeme je da pojačate svog zmaja pomoću NeoPixela

Vrijeme je da pojačate svog zmaja pomoću NeoPixela!
Vrijeme je da pojačate svog zmaja pomoću NeoPixela!
Vrijeme je da pojačate svog zmaja pomoću NeoPixela!
Vrijeme je da pojačate svog zmaja pomoću NeoPixela!

Svjetlosni segment:

1. Možete jednostavno koristiti nit od neopiksela za stvaranje svjetla ako želite. (Ponestalo nam je niti).

2. Koristili smo 20 neopikselnih svjetala i povezali ih žicama. Ove su žice bile lemljene na njih i povezane s fotonom pomoću crvenog ožičenja tako da odgovara temi zmaja.

3. Svoje neopikselne svjetiljke možete sašiti i na dugačak komad tkanine, ali ih nismo koristili jer smo imali metalnu šljokicu.

Sklapanje dijelova: Osigurajte svjetlosni segment unutar tijela zmaja pomoću niti ili žica. Uvjerite se da možete spojiti svjetla na foton unutar osnovne kutije. Pričvrstite glavu, noge i rep uz tijelo ljepilom. Nakon što su na svom mjestu, pričvrstite tijelo u uske držače koje smo prethodno odštampali. Sada je tijelo spremno za programiranje.

Korak 8: Vrijeme programiranja

Budući da ćemo koristiti dva fotona čestica za rad sa šest zasebnih servo motora (jedan Foton može raditi samo sa četiri), pisat ćemo dva odvojena, ali slična koda koja će se postaviti na mikrokontrolere.

Sada, za prvi mikrokontroler …

U Arduino datoteku (.ino) uključite sljedeće biblioteke i definirajte:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Zatim deklarirajte sljedeće varijable:

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 između 0 i 180 (u stupnjevima) int positionUpDown_2 = 180; // mora biti između 0 i 180 (u stupnjevima) int leftRight_2 = 1; // 0 = lijevo, 1 = desno int upDown_2 = 1; // 0 = gore, 1 = dolje 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 390; veličina const_t tamponSizeForecast = 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_JSONJ (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; temperatura plovkaArray [3]; vlažnost plutajućeg polja [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Kliknite ovdje da biste saznali kako postaviti web -dojavnike. Kada završite, dodajte sljedeće deklaracije i funkcije i izvršite odgovarajuće promjene ako je potrebno:

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

Sljedeće funkcije kontroliraju kretanje zmaja gore/dolje i lijevo/desno:

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

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

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

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

Da biste mogli mijenjati kretnje u intervalu, stvaraju se mjerači vremena.

Tajmer timerLeftRight1 (100, changeLeftRight1);

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

Sljedeća je funkcija konačno dodana. Obavezno unesite odgovarajuće izmjene u redove koda koji se bave webhookovima.

void setup () {// pokretanje vremenskih mjerača timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopikseli strip.begin (); // Stavite inicijalizaciju kao pinMode i započnite funkcije ovdje. // Postavljanje Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // inicijalizira položaj servo servoUpDown_1.write (positionUpDown_1); // inicijalizira položaj servo servoLeftRight_2.write (positionLeftRight_2); // inicijalizira položaj servo servoUpDown_2.write (positionUpDown_2); // inicijalizira položaj servo timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Otvorite konzolu Serial.begin (9600); kašnjenje (2000); Serial.println ("Zdravo!"); // Pretplatite se na get_weather5DayForecast i get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Funkcija petlje se ne koristi za ovaj projekt. Ne možemo zaboraviti funkcije za obradu podataka primljenih od webhookova!

void gotWeather5DayForecast (const char *događaj, const char *podaci) {allData5DaysForecast += podaci; // sprema sve podatke u jedan niz. int allData5DaysForecastLen = allData5DaysForecast.length (); me uspremnik [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (međuspremnik, allData5DaysForecastLen + 1); // kreiramo međuspremnik za niz int bufferLength = sizeof (baffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (bafer); // Testiraj da li je raščlanjivanje uspjelo. if (! root.success ()) {//Serial.println("Partizacija vremena za 5 -dnevnu prognozu … GREŠKA! "); return; } int i = 1; JsonArray & list = root ["lista"]; za (JsonObject & currentObject: lista) {if (i <3) {JsonObject & main = currentObject ["main"]; temperatura plovka = main ["temp"]; int vlažnost = main ["vlažnost"]; JsonObject & weather = currentObject ["vreme"] [0]; const char* weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* vremenska oznaka = 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 = vremenska oznaka; i ++; } else {break; }}}

void gotCurrentWeatherData (const char *događaj, const char *podaci) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (podaci); // Testiraj da li je raščlanjivanje uspjelo. if (! root.success ()) {//Serial.println("Partiranje trenutnog vremena … GREŠKA! "); return; } JsonObject & weather = root ["vreme"] [0]; const char* weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["vlažnost"]; float wind_speed = root ["vjetar"] ["brzina"]; const char* vremenska oznaka = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (brzina_ vjetra); leftRightSpeed [0] = servoIncrement; setColor (weather_main, 0); weatherArray [0] = weather_main; temperatureArray [0] = tempFah; moisArray [0] = glavna_vlažnost; windSpeedArray [0] = brzina vjetra; timestampArray [0] = vremenska oznaka; }

U nastavku možete pronaći dodatne funkcije koje kontroliraju ažuriranje položaja servo motora, pretvaranje temperature iz Kelvina u Fahrenheit i postavljanje boja LED dioda.

int updateUpDown (float temp) {// Mapiranje stepena u raspon od [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("novi servo stepen:"); Serial.println (servoMaxDegree); povrat servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Mapirajte brzinu vjetra u raspon od [1, 100] plutajućeg servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("nova vrijednost povećanja servo:"); Serial.println (servoIncrement); return servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

void setColor (String weatherDesc, int indeks) {

int ledIndex = 0; if (indeks == 0) {ledIndex = 0; } else if (indeks == 1) {ledIndex = 6; } else if (indeks == 2) {ledIndex = 12; } else {return; } if (weatherDesc == "Clear") {// žuto za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // žuta traka.show (); kašnjenje (20); }} else if (weatherDesc == "Clouds") {// sivo za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // siva traka.show (); kašnjenje (20); }} else if (weatherDesc == "Snow") {// bijelo za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // bijela traka.show (); kašnjenje (20); }} else if (weatherDesc == "Rain") {// plavo za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // plava traka.show (); kašnjenje (20); }} else {// crveno za (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // crvena strip.show (); kašnjenje (20); }}}

Kada dodate sve u svoju Arduino datoteku, sastavite je. Ako nema grešaka, nastavite i prebacite kôd na prvi Photon. Sljedeći korak će vam pružiti sličan kôd koji će biti postavljen na drugom fotonu.

Korak 9: Programiranje se nastavlja

Budući da je kôd za drugi Photon gotovo identičan kodu za prvi, cijeli se kôd kopira i zalijepi ispod:

#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 bafferSizeCurrent = 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 (6) + JSON_OBJECT_SIZE (6) + 12

const size_t bafferSizeForecast = 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_JSUB (5) + 76*JSON_OBJECT_SIZE (8) + 12490;

String weatherArray [3];

temperatura plovkaArray [3]; vlažnost plutajućeg polja [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String allData5DaysForecast;

void getWeather5DayForecast ()

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

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

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Timer timerWeatherCurrent (60000, getCurrentWeather);

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

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

Tajmer timerLeftRight3 (100, changeLeftRight3);

Tajmer timerUpDown3 (10, changeUpDown3);

void setup () {

// pokretanje vremenskih mjerača timerWeatherForecast.start (); timerWeatherCurrent.start (); // Stavite inicijalizaciju kao pinMode i započnite funkcije ovdje. // Postavljanje Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // inicijalizacija servo položaja

servoUpDown_3.write (positionUpDown_3); // inicijalizacija servo položaja

timerLeftRight3.start ();

timerUpDown3.start (); // Otvorite konzolu Serial.begin (9600); kašnjenje (2000); Serial.println ("Zdravo!"); // Pretplatite se na get_weather5DayForecast i 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 *događaj, const char *podaci)

{allData5DaysForecast += podaci; // sprema sve podatke u jedan niz. int allData5DaysForecastLen = allData5DaysForecast.length (); me uspremnik [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (međuspremnik, allData5DaysForecastLen + 1); // kreiramo međuspremnik za niz int bufferLength = sizeof (baffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (bafer); //Serial.println(allData5DaysForecast); // Testiraj da li je raščlanjivanje uspjelo. if (! root.success ()) {//Serial.println("Partizacija vremena za 5 -dnevnu prognozu … GREŠKA! "); return; } int i = 1; JsonArray & list = root ["lista"]; za (JsonObject & currentObject: lista) {if (i <3) {JsonObject & main = currentObject ["main"]; temperatura plovka = main ["temp"]; int vlažnost = main ["vlažnost"]; JsonObject & weather = currentObject ["vreme"] [0]; const char* weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* vremenska oznaka = 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 = vremenska oznaka; i ++; } else {break; }}}

void gotCurrentWeatherData (const char *događaj, const char *podaci)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (podaci); //Serial.println(data); // Testiraj da li je raščlanjivanje uspjelo. if (! root.success ()) {//Serial.println("Partiranje trenutnog vremena … GREŠKA! "); return; } JsonObject & weather = root ["vreme"] [0]; const char* weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["vlažnost"]; float wind_speed = root ["vjetar"] ["brzina"]; const char* vremenska oznaka = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (brzina_ vjetra); leftRightSpeed [0] = servoIncrement; weatherArray [0] = weather_main; temperatureArray [0] = tempFah; moisArray [0] = glavna_vlažnost; windSpeedArray [0] = brzina vjetra; timestampArray [0] = vremenska oznaka; }

int updateUpDown (float temp) {

// Mapiranje stupnjeva u raspon od [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("novi servo stepen:"); Serial.println (servoMaxDegree); povrat servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Mapirajte brzinu vjetra u raspon od [1, 100] plutajućeg servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("nova vrijednost povećanja servo:"); Serial.println (servoIncrement); return servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

Uspio si! Uspjeli ste kroz programski odjeljak projekta! Sada svakako ožičite i spojite sve od servo motora i neopiksela do matične ploče i mikrokontrolera. NAPOMENA: umetnite dodatne klinove/štapiće kroz okomite proreze na kutijama za lijevo i desno kretanje tijela. Drugi kraj bi trebao biti povezan s tijelom zmaja.

Korak 10: Uživajte u svom zmaju

Čestitamo! Izgradili ste Sine-ese zmaja od nule! Sada sve što trebate učiniti je sjesti i uživati u ambijentalnom prikazu!

NAPOMENA: Ovaj projekt izgrađen je kao dio kursa koji su radile Joan Bempong i Soundarya Muthuvel. Stranicu kursa možete pronaći ovdje.

Preporučuje se: