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, Srpanj
Anonim
Sine-ese Zmaj
Sine-ese Zmaj

Sine-ese Dragon je ambijentalni komad uređenja doma koji koristi mehanička kretanja 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 diljem azijskog potkontinenta. Osim što donosi sreću, kineski zmaj također ima moćne moći koje kontroliraju „vodu, kišu, tajfune i poplave“. U konačnici, kineski zmaj se smatrao prikladnim za predstavljanje vremenskih podataka.

Vizualizacija

Sineeskim zmajem manipulira se na šest glavnih točaka u tri odvojena dijela koji predstavljaju vremensku prognozu u tri intervala od 3 sata. Za svaki 3-satni interval uključit će se 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 klinovi 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 svjetla ušivena zajedno)
  7. Puno super ljepila
  8. Vodljivi navoj
  9. Akrilna boja
  10. Dekorativna tkanina
  11. Laserski rezač
  12. 3D pisač

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 Sine-ese Zmaja je izgradnja komponente koja kontrolira kretanje tijela gore i dolje. Kako uzbudljivo!

  1. Preuzmite datoteke Adobe Illustrator (.ai) i ispišite ih pomoću stroja za lasersko rezanje.

    upDownBoxWithPlatform.ai treba ispisati na kartonu

  2. Preuzmite datoteke za 3D ispis (.stl) i ispišite ih svojim omiljenim 3D pisačem.

    Boja nije bitna za disk ili okretač diska. Na drugoj slici okretač diska umetnut je u otvor 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 rupu na drugoj strani kutije s kružnom rupom. To je prikazano na slici 6.
  5. Sada nam treba nešto kako bismo osigurali da platforma ostane poravnata kad se disk okrene. Izrežite štapić za štapiće na štapiće duljine 75 mm (slika 7) i vrućim ljepilom zalijepite ih kroz vrh kutije u vrh platforme. Uvjerite se da su štapići poravnati na 90 stupnjeva prema platformi.
  6. Umetnite štap duljine 212 mm u srednju rupu na vrhu kutije na platformu.

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

Korak 2: Što je s lijevom i desnom stranom ?

Što je s ljevicom i desnicom ?!
Što je s ljevicom i desnicom ?!
Što je s ljevicom i desnicom ?!
Što je s ljevicom i desnicom ?!
Što je s ljevicom i desnicom ?!
Što je s ljevicom i desnicom ?!
Što je s ljevicom i desnicom ?!
Što je s ljevicom i desnicom ?!

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

  1. Preuzmite datoteke Adobe Illustrator (.ai) i ispišite ih pomoću stroja za lasersko rezanje.

    1. leftRightBoxWithPlatforms.ai treba ispisati na kartonu.
    2. Datoteku armTurner.ai treba ispisati na materijalu debljine 3 mm.
  2. Preuzmite datoteke za 3D ispis (.stl) i ispišite ih svojim omiljenim 3D pisačem.

    Ispišite dvije ruke! Boja ovdje nije bitna

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

    1. Umetanje dviju platformi 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 tokarenje ruke kroz drugu ruku, a zatim donju platformu.
    6. Provlačenje tokarila za ruke kroz pravokutni otvor 3D tiskanog okretača za ruke.
    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 s po tri sustava za pomicanje gore/dolje i lijevo/desno.

Korak 3: Podizanje tijela … KAKO?

Držanje tijela … KAKO?
Držanje tijela … KAKO?

Dobro pitanje! Tada dolaze ti 3D ispisani držači. Preuzmite priloženu.stl datoteku i ispišite je pomoću 3D pisača. Ispišite ukupno 6 držača za 6 različitih kutija.

Ako ste gore vidjeli sliku drškastog držača, 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 prikriti.

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

  1. Sastavite i zalijepite sva tri dijela 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 pri vrhu. Ljepilo SAMO na dnu kutije.
  4. Ispišite innerBoxesPlatform dvaput. Zalijepite dva komada koji imaju velike pravokutne rupe. Zatim zalijepite tri preostala komada. Na kraju ga zalijepite na drugi zalijepljeni set s rupama.
  5. Postavite platformu na dno velike kutije.
  6. Umetnite svih 6 manjih kutija u njihova odgovarajuća mjesta na platformi.
  7. Sada postavite 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, 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 ?? Oh moj

Ljigave igračke ?? Oh moj!
Ljigave igračke ?? Oh moj!
Ljigave igračke ?? Oh moj!
Ljigave igračke ?? Oh moj!

Zmajevo tijelo:

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

2. Izmjerite duljinu i promjer klizaljki i izrežite komad ukrasne tkanine.

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

4. Nakon što ih završite sa šivanjem, uvucite klizače poput čarape.

5. Krajeve šljokice prišijte na sašivenu tkaninu.

Korak 6: Ispišite svog zmaja

3D ispisani 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 svjetala neopiksela i spojili 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 šljokicu napravljenu od metala.

Sastavljanje dijelova: Osvijetlite svjetlosni segment unutar tijela zmaja pomoću niti ili žica. Provjerite jeste li u mogućnosti spojiti svjetla s fotonom unutar osnovne kutije. Pričvrstite glavu, noge i rep uz tijelo ljepilom. Kad su na svom mjestu, pričvrstite tijelo u škripave držače koje smo prije ispisivali. Sada je tijelo spremno za programiranje.

Korak 8: Programiranje vremena

Budući da ćemo koristiti dva fotona čestica za rad sa šest zasebnih servo motora (jedan Foton može raditi samo s četiri), napisat ć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 traka = 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 + JSON 390; const size_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 (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; temperatura plovkaArray [3]; vlažnost plutajućeg polja [3]; float windSpeedArray [3]; Niz vremenske oznakeArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; Niz allData5DaysForecast;

Kliknite ovdje da biste saznali kako postaviti web -dojavnike. Kad završite, dodajte sljedeće deklaracije i funkcije i po potrebi unesite odgovarajuće izmjene:

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.

Timer timerLeftRight1 (100, changeLeftRight1);

Timer timerLeftRight2 (100, changeLeftRight2); Timer timerUpDown1 (10, changeUpDown1); Timer 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.priključak (D0); servoLeftRight_2.priključak (D3); servoUpDown_2.priključak (D2); servoLeftRight_1.write (positionLeftRight_1); // inicijalizira položaj servo servoUpDown_1.write (positionUpDown_1); // inicijalizirati položaj servo servoLeftRight_2.write (positionLeftRight_2); // inicijalizira položaj servo servoUpDown_2.write (positionUpDown_2); // inicijaliziranje servo položaja timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Otvorite konzolu Serial.begin (9600); odgoda (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 (); }

Za ovaj projekt se ne koristi funkcija petlje. 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 (međuspremnik); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (međuspremnik); // Testiraj je li raščlanjivanje uspjelo. if (! root.success ()) {//Serial.println("Partiziranje vremenske prognoze za 5 dana … ERROR! "); povratak; } int i = 1; JsonArray & list = root ["popis"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; temperatura plovka = main ["temp"]; int vlažnost = main ["vlažnost"]; JsonObject & weather = currentObject ["vrijeme"] [0]; const char* weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* vremenska oznaka = currentObject ["dt_txt"]; int tempFah = pretvoriti uFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; moisArray = vlaga; 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 je li raščlanjivanje uspjelo. if (! root.success ()) {//Serial.println("Partiranje trenutnog vremena … POGREŠKA! "); povratak; } JsonObject & weather = root ["vrijeme"] [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 ["wind"] ["speed"]; 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 stupnja u raspon od [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("novi stupanj servo:"); Serial.println (servoMaxDegree); povratni 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); povratni servoInkrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; povrat 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 traka.show (); kašnjenje (20); }}}

Kad sve dodate u svoju Arduino datoteku, sastavite je. Ako nema pogrešaka, krenite prema prvom fotonu. Sljedeći korak pružit će vam 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 onome 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 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 (6) + JSON_OBJECT_SIZE

const size_t međuspremnikSizeForecast = 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 + JSON (5) + 76*JSON_OBJECT_SIZE (8) + 12490;

String weatherArray [3];

temperatura plovkaArray [3]; vlažnost plutajućeg polja [3]; float windSpeedArray [3]; Niz vremenske oznakeArray [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 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); }

Timer timerLeftRight3 (100, changeLeftRight3);

Timer 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.priključak (D0);

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

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

timerLeftRight3.start ();

timerUpDown3.start (); // Otvorite konzolu Serial.begin (9600); odgoda (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 (međuspremnik); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (međuspremnik); //Serial.println(allData5DaysForecast); // Testiraj je li raščlanjivanje uspjelo. if (! root.success ()) {//Serial.println("Partiziranje vremenske prognoze za 5 dana … ERROR! "); povratak; } int i = 1; JsonArray & list = root ["popis"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; temperatura plovka = main ["temp"]; int vlažnost = main ["vlažnost"]; JsonObject & weather = currentObject ["vrijeme"] [0]; const char* weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* vremenska oznaka = currentObject ["dt_txt"]; int tempFah = pretvoriti uFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; moisArray = vlaga; 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 je li raščlanjivanje uspjelo. if (! root.success ()) {//Serial.println("Partiranje trenutnog vremena … POGREŠKA! "); povratak; } JsonObject & weather = root ["vrijeme"] [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 ["wind"] ["speed"]; 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 stupanj servo:"); Serial.println (servoMaxDegree); povratni 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); povratni servoInkrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; povrat 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 trebao bi 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 svom ambijentalnom prikazu!

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

Preporučeni: