Tartalomjegyzék:
- Lépés: Fel és le
- 2. lépés: Mi a helyzet balra és jobbra ?
- 3. lépés: A test feltartása… HOGYAN?
- 4. lépés: De ezek a dobozok nem olyan szépek…
- 5. lépés: Slinky Toys ?? Jaj nekem
- 6. lépés: Nyomtassa ki a sárkányát
- 7. lépés: Ideje felemelni a sárkányt a NeoPixels segítségével
- 8. lépés: Az idő programozása
- 9. lépés: A programozás folytatódik
- 10. lépés: Élvezze a sárkányt
Videó: Sine-ese Dragon: 10 lépés (képekkel)
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:43
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
- 3 mm rétegelt lemez/karton
- 5 mm -es fa tiplik vagy pálcikák
- 2 Részecskés fotonok
- 3 Karcsú játékok
- 6 szervomotor
- NeoPixel lámpák (vagy egy szál, vagy egyes lámpák összevarrva)
- Sok szuper ragasztó
- Vezető szál
- Akril festék
- Dekoratív szövet
- Lézervágó
- 3d nyomtató
Lépés: 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!
-
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
-
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
-
Szerelje össze az első két alkatrészt, és ragassza össze őket a 3–5.
- A felhsználói felület
- A lemez hornyai
-
Most állítsa össze a dobozt az alábbi tippek alapján.
- A szervó vezetékeinek át kell menniük a doboz oldalán lévő téglalap alakú nyíláson.
- 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.
- 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.
- 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 ?
Most nem feledkezhetünk meg a Sine-ese Dragon bal és jobb mozgásáról, ugye? Ugorjunk a második lépéshez!
-
Töltse le az Adobe Illustrator fájlokat (.ai) és nyomtassa ki őket lézervágó gép segítségével.
- leftRightBoxWithPlatforms.ai -t kartonra kell nyomtatni.
- Az armTurner.ai fájlt 3 mm vastag anyagra kell nyomtatni.
-
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
- Szerelje össze a két platformot a 3. kép szerint, forró ragasztóval.
-
Rakd össze a dobozt. Bár bonyolult lehet, ezt könnyebb elérni:
- A két platform behelyezése a doboz két oldalán lévő két nagy rés közé.
- Az első kar elhelyezése a felső platform tetején.
- A karfordító átfűzése a karon, majd a felső emelvényen.
- A második kar elhelyezése az alsó platform tetején.
- A karfordító átfűzése a második karon, majd az alsó platformon.
- A karfordító beragasztása a 3D nyomtatott karfordító téglalap alakú nyílásába.
- Az eszterga másik vége a szervomotor tetejére kerül.
- 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?
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.
- Szerelje össze és ragassza össze az első fájlból (externalBoxFinal_1) származó mind a három darabot.
- Még ne adja hozzá a darabot a második fájlból (externalBoxFinal_2).
- 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.
- 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.
- Helyezze a platformot a nagy doboz aljára.
- Helyezze be mind a 6 kisebb dobozt a megfelelő helyekre a platformon.
- 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.
- 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
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
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:
Útmutató: A Raspberry PI 4 fej nélküli (VNC) telepítése Rpi-képalkotóval és képekkel: 7 lépés (képekkel)
Útmutató: A Raspberry PI 4 fej nélküli (VNC) telepítése Rpi-képalkotóval és képekkel: Ezt a Rapsberry PI-t tervezem használni egy csomó szórakoztató projektben a blogomban. Nyugodtan nézd meg. Vissza akartam kezdeni a Raspberry PI használatát, de nem volt billentyűzetem vagy egér az új helyen. Rég volt, hogy beállítottam egy málnát
Videojuego "The History of Max: the Little Dragon": 10 lépés
Videojuego "The History of Max: the Little Dragon": Si quieres crear el videojuego " The history of Max: The little dragon " puedes seguir este paso a paso:
ESP8266/Arduino SmartThings Bearded Dragon Habitat Controller/Monitor: 4 lépés
ESP8266/Arduino SmartThings Bearded Dragon Habitat Controller/Monitor: A DaVinci, a mi sárkányunk szoftverfrissítés miatt esedékes a Vivarium vezérlőjére. Úgy döntöttem, hogy áttérünk a jó, hagyományos, teljes „Arduino” logikáról, amely az elmúlt egy évben megbízhatóan eltűnt, egy ST_Anything SmartThings int
Oktatóanyag Interaktív Dragon Trainer Tristana: 4 lépés
Oktatóanyag Interaktív Sárkányoktató Tristana: Ez a projekt első koncepciója. Amikor aktiválja a mini fotocellát, a következő dolgok fognak történni.- A sárkányfej mozogni fog.- A szájban lévő led bekapcsol.- Hangzást fog lejátszani. Amikor a zene vége, minden kikapcsol. Minden
A Dragon Rider 500 használata az AVR Dragon -nal: 10 lépés
A Dragon Rider 500 használata az AVR Dragon készülékkel: Ez az oktatóanyag az Ecros Technologies által kínált Dragon Rider 500 néhány funkciójának összeomlási tanfolyama. Kérjük, vegye figyelembe, hogy az Ecros weboldalán nagyon részletes felhasználói kézikönyv található. A Dragon Rider egy interfész tábla