Sadržaj:
- Korak 1: Gore i dolje
- Korak 2: Što je s lijevom i desnom stranom ?
- Korak 3: Podizanje tijela … KAKO?
- Korak 4: Ali te kutije nisu tako lijepe …
- Korak 5: Slinky igračke ?? Oh moj
- Korak 6: Ispišite svog zmaja
- Korak 7: Vrijeme je da pojačate svog zmaja pomoću NeoPixela
- Korak 8: Programiranje vremena
- Korak 9: Programiranje se nastavlja
- Korak 10: Uživajte u svom zmaju
Video: Sine-ese zmaj: 10 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:37
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
- 3 mm šperploča/karton
- Drveni klinovi ili štapići za drvo od 5 mm
- 2 fotona čestica
- 3 klizave igračke
- 6 servo motora
- NeoPixel svjetla (žica ili pojedina svjetla ušivena zajedno)
- Puno super ljepila
- Vodljivi navoj
- Akrilna boja
- Dekorativna tkanina
- Laserski rezač
- 3D pisač
Korak 1: Gore i dolje
Vaš prvi korak u izgradnji Sine-ese Zmaja je izgradnja komponente koja kontrolira kretanje tijela gore i dolje. Kako uzbudljivo!
-
Preuzmite datoteke Adobe Illustrator (.ai) i ispišite ih pomoću stroja za lasersko rezanje.
upDownBoxWithPlatform.ai treba ispisati na kartonu
-
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
-
Sastavite prve dvije komponente i zalijepite ih zajedno kao što je prikazano na slikama 3 do 5.
- Platforma
- Utori za disk
-
Sada sastavite okvir slijedeći donje savjete.
- Servo žice trebaju proći kroz pravokutni otvor na bočnoj strani kutije.
- 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.
- 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.
- 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 ?
Ne možemo zaboraviti lijevo i desno kretanje Sine-ese Zmaja, zar ne? Prijeđimo na drugi korak!
-
Preuzmite datoteke Adobe Illustrator (.ai) i ispišite ih pomoću stroja za lasersko rezanje.
- leftRightBoxWithPlatforms.ai treba ispisati na kartonu.
- Datoteku armTurner.ai treba ispisati na materijalu debljine 3 mm.
-
Preuzmite datoteke za 3D ispis (.stl) i ispišite ih svojim omiljenim 3D pisačem.
Ispišite dvije ruke! Boja ovdje nije bitna
- Sastavite dvije platforme zajedno kao što je prikazano na slici 3 pomoću vrućeg ljepila.
-
Sastavite kutiju. Iako je to možda teško, to je lakše postići:
- Umetanje dviju platformi između dva velika proreza s obje strane kutije.
- Postavljanje prve ruke na vrh gornje platforme.
- Provucite okretač ruke kroz ruku, a zatim gornju platformu.
- Postavljanje druge ruke na vrh donje platforme.
- Provucite tokarenje ruke kroz drugu ruku, a zatim donju platformu.
- Provlačenje tokarila za ruke kroz pravokutni otvor 3D tiskanog okretača za ruke.
- Drugi kraj okretača ide preko servo motora.
- 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?
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.
- Sastavite i zalijepite sva tri dijela iz prve datoteke (externalBoxFinal_1) zajedno.
- Nemojte još dodavati komad iz druge datoteke (externalBoxFinal_2).
- Stavite komad iz treće datoteke (externalBoxFinal_3) na dno okvira i trebao bi se zatvoriti pri vrhu. Ljepilo SAMO na dnu kutije.
- 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.
- Postavite platformu na dno velike kutije.
- Umetnite svih 6 manjih kutija u njihova odgovarajuća mjesta na platformi.
- 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.
- 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
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
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:
Igračke sa prilagodbom na prekidač: pristupačan zmaj koji hoda, koji diše vodom!: 7 koraka (sa slikama)
Switch-Adapt Toys: Voda koja diše, zmaj je dostupan !: Adaptacija igračaka otvara nove načine i prilagođena rješenja koja omogućuju djeci s ograničenim motoričkim sposobnostima ili s teškoćama u razvoju neovisnu interakciju s igračkama. U mnogim slučajevima djeca kojima su potrebne prilagođene igračke nisu u mogućnosti
Kako: Instaliranje Raspberry PI 4 bez glave (VNC) s Rpi-imagerom i slikama: 7 koraka (sa slikama)
Kako: Instaliranje Raspberry PI 4 Headless (VNC) s Rpi-imagerom i slikama: Planiram koristiti ovaj Rapsberry PI u hrpi zabavnih projekata na svom blogu. Slobodno provjerite. Htio sam se vratiti korištenju Raspberry PI -a, ali nisam imao tipkovnicu ili miš na novoj lokaciji. Prošlo je dosta vremena od postavljanja maline
Kako napraviti brojač koraka?: 3 koraka (sa slikama)
Kako napraviti brojač koraka?: Nekada sam se dobro snašao u mnogim sportovima: hodanje, trčanje, vožnja bicikla, igranje badmintona itd. Volim jahanje da bih brzo putovao. Pa, pogledaj moj trbušni trbuh … Pa, u svakom slučaju, odlučujem ponovno početi vježbati. Koju opremu trebam pripremiti?
Videojuego "Povijest Maxa: Mali zmaj": 10 koraka
Videojuego "Povijest Maxa: Mali zmaj": Si quieres crear el videojuego " Povijest Maxa: Mali zmaj " puedes seguir este paso a paso:
Kako rastaviti računalo jednostavnim koracima i slikama: 13 koraka (sa slikama)
Kako rastaviti računalo jednostavnim koracima i slikama: Ovo uputstvo o tome kako rastaviti računalo. Većina osnovnih komponenti je modularna i lako se uklanja. Međutim, važno je da se oko toga organizirate. To će vam pomoći da spriječite gubitak dijelova, a također i prilikom ponovnog sastavljanja