Tartalomjegyzék:

Sine-ese Dragon: 10 lépés (képekkel)
Sine-ese Dragon: 10 lépés (képekkel)

Videó: Sine-ese Dragon: 10 lépés (képekkel)

Videó: Sine-ese Dragon: 10 lépés (képekkel)
Videó: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, Július
Anonim
Sine-ese Dragon
Sine-ese Dragon

A Sine-ese Dragon egy hangulatos lakberendezési elem, amely mechanikus mozdulatokat és fényeket használ, hogy elmondja az időjárás-előrejelzést a következő három három órás időközönként. Értelemszerűen az ambient leírja valaminek közvetlen környezetét; ezért úgy döntöttek, hogy helyénvaló az időjárási adatokat beépíteni a környezeti kijelzőbe. Az időjárás egy olyan szempont, amely akaratlanul megváltoztatja az emberek napját, és olyan információ, amely folyamatosan változik minden percben, vagy akár a másodpercig.

A kínai sárkány „a hatalom, az erő és a szerencse szimbóluma”, és gyakran magas kulturális és hagyományos értékkel bír az ázsiai szubkontinensen. Amellett, hogy szerencsét hoz, a kínai sárkánynak azt is mondják, hogy erőteljes erőkkel rendelkezik, amelyek irányítják a „vizet, csapadékot, tájfunokat és árvizeket”. Végül a kínai sárkányt tartották megfelelőnek az időjárási adatok ábrázolására.

Megjelenítés

A Sine-ese Dragon-t hat fő ponton manipulálják három különálló szakaszon, amelyek három 3 órás időközönként jelzik az időjárás-előrejelzést. Minden 3 órás időközönként a következő információkat kell tartalmaznia:

  • Időjárás leírása - meghatározza az aktuális időjárási információk színét.
  • Hőmérséklet - meghatározza a test magasságát
  • Páratartalom - a LED szegmensek villogása
  • Szélsebesség - szabályozza a test sebességét, amely balra és jobbra mozog.

Szükséges anyagok

  1. 3 mm rétegelt lemez/karton
  2. 5 mm -es fa tiplik vagy pálcikák
  3. 2 Részecskés fotonok
  4. 3 Karcsú játékok
  5. 6 szervomotor
  6. NeoPixel lámpák (vagy egy szál, vagy egyes lámpák összevarrva)
  7. Sok szuper ragasztó
  8. Vezető szál
  9. Akril festék
  10. Dekoratív szövet
  11. Lézervágó
  12. 3d nyomtató

Lépés: Fel és le

Fel és le!
Fel és le!
Fel és le!
Fel és le!
Fel és le!
Fel és le!

A Sine-ese Dragon építésének első lépése az, hogy megépíti azt az alkatrészt, amely szabályozza a test fel-le mozgását. Milyen izgalmas!

  1. Töltse le az Adobe Illustrator fájlokat (.ai) és nyomtassa ki őket lézervágó gép segítségével.

    Az upDownBoxWithPlatform.ai fájlt kartonra kell nyomtatni

  2. Töltse le a 3D nyomtatási fájlokat (.stl), és használja kedvenc 3D nyomtatóját azok kinyomtatásához.

    A szín nem számít a lemez vagy a lemezforgató számára. A második képen a korongforgató be van helyezve a lemez lyukába

  3. Szerelje össze az első két alkatrészt, és ragassza össze őket a 3–5.

    1. A felhsználói felület
    2. A lemez hornyai
  4. Most állítsa össze a dobozt az alábbi tippek alapján.

    1. A szervó vezetékeinek át kell menniük a doboz oldalán lévő téglalap alakú nyíláson.
    2. A tárcsaforgató legrövidebb vége a szervófejhez csatlakozik, a hosszabb vége pedig a doboz másik oldalának lyukán keresztül, kör alakú lyukkal. Ezt mutatja a 6. kép.
  5. Most szükségünk van valamire annak biztosítására, hogy a platform vízszintes maradjon a lemez elforgatásakor. Vágja a pálcikát 75 mm hosszú rudakra (7. kép), és ragasztja őket a doboz tetején keresztül a platform tetejére forró ragasztóval. Győződjön meg arról, hogy a botok 90 fokos szögben vannak a platformhoz képest.
  6. Helyezzen be egy 212 mm hosszú rudat a doboz tetején lévő középső lyukba a platformra.

Édes! Most már van egy teljes doboza (8. kép) a sárkány fel -le mozgatásához. Most ismételje meg a fenti lépéseket még kétszer!

2. lépés: Mi a helyzet balra és jobbra ?

Mi van balról és jobbról ?!
Mi van balról és jobbról ?!
Mi van balról és jobbról ?!
Mi van balról és jobbról ?!
Mi van balról és jobbról ?!
Mi van balról és jobbról ?!
Mi van balról és jobbról ?!
Mi van balról és jobbról ?!

Most nem feledkezhetünk meg a Sine-ese Dragon bal és jobb mozgásáról, ugye? Ugorjunk a második lépéshez!

  1. Töltse le az Adobe Illustrator fájlokat (.ai) és nyomtassa ki őket lézervágó gép segítségével.

    1. leftRightBoxWithPlatforms.ai -t kartonra kell nyomtatni.
    2. Az armTurner.ai fájlt 3 mm vastag anyagra kell nyomtatni.
  2. Töltse le a 3D nyomtatási fájlokat (.stl), és használja őket kedvenc 3D nyomtatójával.

    Feltétlenül nyomtasson ki két kart! A szín itt nem számít

  3. Szerelje össze a két platformot a 3. kép szerint, forró ragasztóval.
  4. Rakd össze a dobozt. Bár bonyolult lehet, ezt könnyebb elérni:

    1. A két platform behelyezése a doboz két oldalán lévő két nagy rés közé.
    2. Az első kar elhelyezése a felső platform tetején.
    3. A karfordító átfűzése a karon, majd a felső emelvényen.
    4. A második kar elhelyezése az alsó platform tetején.
    5. A karfordító átfűzése a második karon, majd az alsó platformon.
    6. A karfordító beragasztása a 3D nyomtatott karfordító téglalap alakú nyílásába.
    7. Az eszterga másik vége a szervomotor tetejére kerül.
    8. Tegye a felső, alsó és hátsó részeket a dobozba.

Az utolsó összeszerelt doboznak úgy kell kinéznie, mint a hatodik képnek. Most ismételje meg ezt még kétszer!

Ennek a lépésnek a végére hat doboza lesz, három -három fel/le és bal/jobb mozgásrendszerrel.

3. lépés: A test feltartása… HOGYAN?

Feltartani a testet … HOGYAN?
Feltartani a testet … HOGYAN?

Jó kérdés! Ekkor jönnek be ezek a 3D nyomtatott szálkás tartók. Töltse le a mellékelt.stl fájlt, és nyomtassa ki egy 3D nyomtatóval. Győződjön meg róla, hogy összesen 6 tartót nyomtat a 6 különböző dobozhoz.

Ha látta a fenti csúszós tartó képét, a meglepetés tönkrement - ez a Sine -ese Dragon színe!

4. lépés: De ezek a dobozok nem olyan szépek…

És egyetértek! Ezért fogunk lézervágóval vágni egy sokkal vonzóbb dobozt, hogy mindezeket a dobozokat tartalmazza és elrejtse.

Töltse le ezeket az Adobe Illustrator fájlokat, és vágja ki őket a lézervágó segítségével. A felhőtervet az egyik közreműködő kézzel rajzolta. Nyugodtan módosítsa őket úgy, hogy eltávolítja őket az illusztrátor fájlból, és saját belátása szerint hozzáadja! Az alábbiakban bemutatjuk a javasolt lépéseket, hogy mindent összehozzunk.

  1. Szerelje össze és ragassza össze az első fájlból (externalBoxFinal_1) származó mind a három darabot.
  2. Még ne adja hozzá a darabot a második fájlból (externalBoxFinal_2).
  3. Tegye a darabot a harmadik fájlból (externalBoxFinal_3) a doboz aljára, és felül kell zárnia. Ragasztó csak a doboz alján.
  4. Nyomja meg a belső dobozokat kétszer. Ragassza össze a két darabot, amelyekben nagy téglalap alakú lyukak vannak. Ezután ragasszon össze három maradék darabot. Végül ragassza rá a másik ragasztott készletre lyukakkal.
  5. Helyezze a platformot a nagy doboz aljára.
  6. Helyezze be mind a 6 kisebb dobozt a megfelelő helyekre a platformon.
  7. Most helyezze a darabot a második fájlból (externalBoxFinal_2) a doboz tetejére, és ragassza körbe a szélét. A felső darab lyukainak illeszkedniük kell a kisebb dobozon lévő lyukakhoz. Ha nem, akkor rendezze át a kisebb dobozokat. A kisebb dobozokhoz egyáltalán ne adjon ragasztót.
  8. Ha olyan kenyérsütő deszkát használ, amelynek alján ragadós darab van, akkor tegye ezt az alsó darab közepe közelében olyan helyre, ahol a doboz bezárásakor a kenyérlap és a fotonok eltűnnek. Az alsó részen apró rések vannak, amelyek megkönnyítik a fotonokhoz való csatlakozást kívülről.

5. lépés: Slinky Toys ?? Jaj nekem

Slinky játékok ?? Jaj nekem!
Slinky játékok ?? Jaj nekem!
Slinky játékok ?? Jaj nekem!
Slinky játékok ?? Jaj nekem!

A sárkány teste:

1. Forró ragasztó vagy ragasztószalag segítségével keverje össze a három slinkyt.

2. Mérje meg a csúszkák hosszát és átmérőjét, és vágjon le egy darab dekoratív anyagot.

3. Hozza el a szövet két végét, és varrja össze őket.

4. Ha befejezte a varrást, csúsztassa be a slinkit, mint egy zoknit.

5. Varrja a slinky végeit a varrott anyaghoz.

6. lépés: Nyomtassa ki a sárkányát

A sárkány 3D nyomtatott részei:

1. Az alkatrészeket a https://www.thingiverse.com/thing:854575 oldalról vették át.

2. Csak a fejet, a lábakat és a szemeket használtuk.

3. Az alkatrész 3D nyomtatása után simítsa le csiszolópapírral és acetonnal.

4. Fesse le az alkatrészeket úgy, ahogy szeretné díszíteni.

7. lépés: Ideje felemelni a sárkányt a NeoPixels segítségével

Ideje felemelni a sárkányát a NeoPixels segítségével!
Ideje felemelni a sárkányát a NeoPixels segítségével!
Ideje felemelni a sárkányát a NeoPixels segítségével!
Ideje felemelni a sárkányát a NeoPixels segítségével!

Fény szegmens:

1. Ha akarja, egyszerűen használhat neopixel szálat a fények létrehozásához. (Elfogyott a szálak).

2. 20 neopixel lámpát használtunk, és vezetékekkel kötöttük össze. Ezeket a vezetékeket rájuk forrasztották, és piros vezetékekkel kötötték össze a fotonnal, hogy illeszkedjenek a sárkány témájához.

3. A neopixel lámpákat is varrhatja egy hosszú ruhára, de nem használtuk őket, mert fémből készült slinky volt.

Az alkatrészek összeszerelése: Rögzítse a fényszegmenyt a sárkány testén belül menetek vagy vezetékek segítségével. Győződjön meg arról, hogy képes csatlakoztatni a lámpákat az alapdobozon belüli fotonhoz. Rögzítse a fejet, a lábakat és a farkat a testhez ragasztó segítségével. Ha már a helyükön vannak, rögzítse a testet a korábban kinyomtatott csúszós tartókba. Most a test készen áll a programozásra.

8. lépés: Az idő programozása

Mivel két részecske -fotont fogunk használni hat különálló szervomotorral (egy foton csak négynél működik), két különálló, de hasonló kódot fogunk írni a mikrokontrollereken.

Most az első mikrovezérlőről…

Az Arduino fájlban (.ino) tartalmazza a következő könyvtárakat és definiálja:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Ezután deklarálja a következő változókat:

Adafruit_NeoPixel strip = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN);

Szervo servoLeftRight_1; Servo servoUpDown_1; Szervo szervoLeftRight_2; Servo servoUpDown_2; int positionLeftRight_1 = 0; int positionUpDown_1 = 0; int leftRight_1 = 1; int upDown_1 = 1; int positionLeftRight_2 = 100; // 0 és 180 között kell lennie (fokban) int positionUpDown_2 = 180; // 0 és 180 között kell lennie (fokban) int leftRight_2 = 1; // 0 = bal, 1 = jobb int upDown_2 = 1; // 0 = fel, 1 = lefelé 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 (5) + JSON_OBJECT_SIZE 390; const size_t bufferSizeForecast = 38*JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2*JSON_OBJECT_SIZE (0) + 112*JSON_OBJECT_SIZE (1) + 39*JSON_OBJECT_SISIE (2) + JSON (2) + JSON (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; úszó hőmérsékletArray [3]; úszó páratartalomTömb [3]; úszó szélSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; Karakterlánc allData5DaysForecast;

Kattintson ide, hogy megtudja, hogyan kell beállítani a webhookokat. Ha elkészült, adja hozzá a következő nyilatkozatokat és függvényeket, és szükség esetén hajtsa végre a megfelelő módosításokat:

void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Időzítő időzítőWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } Timer timerWeatherCurrent (60000, getCurrentWeather);

A következő funkciók vezérlik a sárkány fel/le és bal/jobb mozgását:

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 () {

ha (lefelé_2) {pozícióUpDown_2 ++; if (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} else {positionUpDown_2--; if (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }

Annak érdekében, hogy a mozgásokat bizonyos időközönként módosítani lehessen, időzítőket hoznak létre.

Timer timerLeftRight1 (100, changeLeftRight1);

Timer timerLeftRight2 (100, changeLeftRight2); Időzítő timerUpDown1 (10, changeUpDown1); Időzítő timerUpDown2 (10, changeUpDown2);

Végül a beállítási funkció kerül hozzáadásra. Győződjön meg arról, hogy megfelelően módosítja a webhook -okkal foglalkozó kódokat.

void setup () {// indítsa el az időjárás -időzítők timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Tegye az inicializálást, mint a pinMode, és itt kezdje el a függvényeket. // A Micro Servo beállítása servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // szervo pozíció inicializálása servoUpDown_1.write (positionUpDown_1); // szervo pozíció inicializálása servoLeftRight_2.write (positionLeftRight_2); // szervo pozíció inicializálása servoUpDown_2.write (positionUpDown_2); // szervo pozíció inicializálása timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Konzol megnyitása Serial.begin (9600); késleltetés (2000); Serial.println ("Hello!"); // Feliratkozás a get_weather5DayForecast és a get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Ehhez a projekthez nem használ ciklusfüggvényt. Nem feledkezhetünk meg a webhookokról kapott adatok kezelésére szolgáló funkciókról!

void gotWeather5DayForecast (const char *esemény, const char *adatok) {allData5DaysForecast += adatok; // az összes adatot egy karakterláncba menti. int allData5DaysForecastLen = allData5DaysForecast.length (); char puffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (puffer, allData5DaysForecastLen + 1); // puffer létrehozása a karakterlánchoz int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (puffer); // Ellenőrizze, hogy az elemzés sikeres -e. if (! root.success ()) {//Serial.println(" 5 napos időjárás -előrejelzés elemzése … HIBA! "); Visszatérés; } int i = 1; JsonArray & list = root ["lista"]; for (JsonObject & currentObject: lista) {if (i <3) {JsonObject & main = currentObject ["main"]; lebegő hőmérséklet = fő ["temp"]; int páratartalom = fő ["páratartalom"]; JsonObject & weather = currentObject ["időjárás"] [0]; const char* weatherInfo = időjárás ["main"]; float windSpeed = currentObject ["szél"] ["sebesség"]; const char* időbélyeg = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (hőmérséklet); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (szélsebesség); leftRightSpeed = szervoIncrement; setColor (weatherInfo, i); hőmérsékletArray = tempFah; páratartalom = páratartalom; weatherArray = weatherInfo; windSpeedArray = szélsebesség; timestampArray = időbélyeg; i ++; } else {break; }}}

void gotCurrentWeatherData (const char *esemény, const char *adatok) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (adatok); // Ellenőrizze, hogy az elemzés sikeres -e. if (! root.success ()) {//Serial.println("Az aktuális időjárás elemzése… HIBA! "); Visszatérés; } JsonObject & weather = root ["időjárás"] [0]; const char* weather_main = időjárás ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_páratartalom = main ["páratartalom"]; float wind_speed = gyökér ["szél"] ["sebesség"]; const char* időbélyeg = gyökér ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (szélsebesség); leftRightSpeed [0] = servoIncrement; setColor (időjárás_fő, 0); weatherArray [0] = weather_main; temperatureArray [0] = tempFah; páratartalom [0] = fő páratartalom; windSpeedArray [0] = szélsebesség; timestampArray [0] = időbélyeg; }

Az alábbiakban további funkciókat talál, amelyek szabályozzák a szervomotorok helyzetének frissítését, a hőmérséklet Kelvin -ről Fahrenheit -re való átalakítását és a LED -ek színének beállítását.

int updateUpDown (float temp) {// Térkép leképezése [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("új szervo fokozat:"); Serial.println (servoMaxDegree); return servoMaxDegree; }

int updateleftRight (float windSpeed) {

// A szélsebesség leképezése [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("új szervo növekmény értéke:"); Serial.println (servoIncrement); visszatérési szervoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; visszatérési tempFah; }

void setColor (String weatherDesc, int index) {

int ledIndex = 0; ha (index == 0) {ledIndex = 0; } else if (index == 1) {ledIndex = 6; } else if (index == 2) {ledIndex = 12; } else {return; } if (weatherDesc == "Clear") {// sárga a (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // sárga csík.show (); késleltetés (20); }} else if (weatherDesc == "Felhők") {// szürke a (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // szürke csík.show (); késleltetés (20); }} else if (weatherDesc == "Snow") {// fehér for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // fehér csík.show (); késleltetés (20); }} else if (weatherDesc == "Rain") {// blue for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // kék csík.show (); késleltetés (20); }} else {// red for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // red strip.show (); késleltetés (20); }}}

Miután mindent hozzáadott az Arduino fájlhoz, fordítsa össze. Ha nincsenek hibák, menjen előre, és villogja a kódot az első fotonhoz. A következő lépésben hasonló kódot kap, amelyet a második fotonon villog.

9. lépés: A programozás folytatódik

Mivel a második foton kódja majdnem megegyezik az első kóddal, a teljes kódot lemásoljuk és beillesztjük az alábbiakba:

#include "ArduinoJson.h"

Szervo szervoLeftRight_3;

Szervo szervoUpDown_3;

int positionLeftRight_3 = 45;

int pozícióUpDown_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_EZJOBJECT_S

const size_t bufferSizeForecast = 38*JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2*JSON_OBJECT_SIZE (0) + 112*JSON_OBJECT_SIZE (1) + 39*JSON_OBJECT_SISIE (2) + JSON (2) + JSON (5) + 76*JSON_OBJECT_SIZE (8) + 12490;

String weatherArray [3];

úszó hőmérsékletArray [3]; úszó páratartalomTömb [3]; úszó szélSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

Karakterlánc allData5DaysForecast;

void getWeather5DayForecast ()

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

Időzítő időzítőWeatherForecast (60000, getWeather5DayForecast); 10, 800, 000 ms = 3 nap

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Időzítő időzítőWeatherCurrent (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 () {

ha (felfelé_3) {pozícióUpDown_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);

Időzítő timerUpDown3 (10, changeUpDown3);

void setup () {

// indítsa el az időjárás időzítőt timerWeatherForecast.start (); timerWeatherCurrent.start (); // Tegye az inicializálást, mint a pinMode, és itt kezdje el a függvényeket. // A Micro Servo szervoLeftRight_3.attach (D1) beállítása; servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // szervo pozíció inicializálása

servoUpDown_3.write (pozícióUpDown_3); // szervo pozíció inicializálása

timerLeftRight3.start ();

timerUpDown3.start (); // Konzol megnyitása Serial.begin (9600); késleltetés (2000); Serial.println ("Hello!"); // Feliratkozás a get_weather5DayForecast és a 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 *esemény, const char *adatok)

{allData5DaysForecast += adatok; // az összes adatot egy karakterláncba menti. int allData5DaysForecastLen = allData5DaysForecast.length (); char puffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (puffer, allData5DaysForecastLen + 1); // puffer létrehozása a karakterlánchoz int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (puffer); //Serial.println(allData5DaysForecast); // Ellenőrizze, hogy az elemzés sikeres -e. if (! root.success ()) {//Serial.println(" 5 napos időjárás -előrejelzés elemzése … HIBA! "); Visszatérés; } int i = 1; JsonArray & list = root ["lista"]; for (JsonObject & currentObject: lista) {if (i <3) {JsonObject & main = currentObject ["main"]; lebegő hőmérséklet = fő ["temp"]; int páratartalom = fő ["páratartalom"]; JsonObject & weather = currentObject ["időjárás"] [0]; const char* weatherInfo = időjárás ["main"]; float windSpeed = currentObject ["szél"] ["sebesség"]; const char* időbélyeg = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (hőmérséklet); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (szélsebesség); leftRightSpeed = szervoIncrement; hőmérsékletArray = tempFah; páratartalom = páratartalom; weatherArray = weatherInfo; windSpeedArray = szélsebesség; timestampArray = időbélyeg; i ++; } else {break; }}}

void gotCurrentWeatherData (const char *esemény, const char *adatok)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (adatok); // Sorozat.println (adatok); // Ellenőrizze, hogy az elemzés sikeres -e. if (! root.success ()) {//Serial.println("Az aktuális időjárás elemzése… HIBA! "); Visszatérés; } JsonObject & weather = root ["időjárás"] [0]; const char* weather_main = időjárás ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_páratartalom = main ["páratartalom"]; float wind_speed = gyökér ["szél"] ["sebesség"]; const char* időbélyeg = gyökér ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (szélsebesség); leftRightSpeed [0] = servoIncrement; weatherArray [0] = weather_main; temperatureArray [0] = tempFah; páratartalom [0] = fő páratartalom; windSpeedArray [0] = szélsebesség; timestampArray [0] = időbélyeg; }

int updateUpDown (lebegési hőmérséklet) {

// Fokozat leképezése [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("új szervo fokozat:"); Serial.println (servoMaxDegree); return servoMaxDegree; }

int updateleftRight (float windSpeed) {

// A szélsebesség leképezése [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("új szervo növekmény értéke:"); Serial.println (servoIncrement); visszatérési szervoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; visszatérési tempFah; }

Megcsináltad! Sikerült a projekt programozási részén keresztül! Most győződjön meg arról, hogy elvégezte az összes vezetéket és csatlakozást a szervomotoroktól és a neopixelektől a kenyértáblához és a mikrovezérlőkhöz. A másik végét a sárkány testéhez kell csatlakoztatni.

10. lépés: Élvezze a sárkányt

Gratulálunk! Sine-ese Dragon-t építettél a semmiből! Most már nem kell mást tennie, mint hátradőlni és élvezni a környezeti kijelzőt!

MEGJEGYZÉS: Ezt a projektet Joan Bempong és Soundarya Muthuvel tanfolyam részeként építették fel. A tanfolyam oldala itt található.

Ajánlott: