Përmbajtje:

Dragua Sine-ese: 10 hapa (me fotografi)
Dragua Sine-ese: 10 hapa (me fotografi)

Video: Dragua Sine-ese: 10 hapa (me fotografi)

Video: Dragua Sine-ese: 10 hapa (me fotografi)
Video: 10 привычек, чтобы стать счастливым 2024, Dhjetor
Anonim
Dragua Sine-ese
Dragua Sine-ese

Sine-ese Dragon është një dekor ambienti i shtëpisë që përdor lëvizje dhe drita mekanike për t'ju treguar parashikimin e motit për tre intervalet e ardhshme tre-orëshe. Sipas përkufizimit, ambienti përshkruan rrethinën e afërt të diçkaje; prandaj u vendos që të ishte e përshtatshme përfshirja e të dhënave të motit në një ekran ambienti. Moti është një aspekt që ndryshon pa dashje ditën e njerëzve dhe është një pjesë e informacionit që ndryshon vazhdimisht çdo minutë, apo edhe deri në të dytin.

Dragoi kinez është "një simbol i fuqisë, forcës dhe fatit të mirë" dhe shpesh mbahet me një vlerë të lartë kulturore dhe tradicionale në të gjithë nënkontinentin aziatik. Përveçse sjell fat të mirë, Dragoi Kinez thuhet gjithashtu se ka fuqi të fuqishme që kontrollojnë "ujin, reshjet, tajfunët dhe përmbytjet". Në fund të fundit, Dragoi Kinez u konsiderua i përshtatshëm për të përfaqësuar të dhënat e motit.

Vizualizimi

Dragoi Sine-ese është manipuluar në gjashtë pika kryesore në tre seksione të veçanta që përfaqësojnë parashikimin e motit për tre intervale prej 3 orësh. Për çdo interval prej 3 orësh, informacioni i mëposhtëm do të përfshihet:

  • Përshkrimi i motit - përcakton ngjyrën e informacionit aktual të motit.
  • Temperatura - përcakton lartësinë e trupit
  • Lagështia - ndezje e segmenteve LED
  • Shpejtësia e erës - kontrollon shpejtësinë e trupit që lëviz majtas dhe djathtas.

Materialet e kërkuara

  1. Kompensatë 3 mm/Karton
  2. Kunja druri prej 5 mm ose shkopinj shkopi
  3. 2 Fotone grimcash
  4. 3 Lodra slinky
  5. 6 servo motorë
  6. Dritat NeoPixel (ose një fije floku ose drita individuale të qepura së bashku)
  7. Shumë super ngjitës
  8. Fije përçuese
  9. Bojë akrilike
  10. Pëlhurë dekorative
  11. Prerës me lazer
  12. Printer 3D

Hapi 1: Lart dhe Poshtë

Lart dhe poshte!
Lart dhe poshte!
Lart dhe poshte!
Lart dhe poshte!
Lart dhe poshte!
Lart dhe poshte!

Hapi juaj i parë për ndërtimin e Dragoit Sine-ese është të ndërtoni përbërësin që kontrollon lëvizjen lart e poshtë të trupit. Sa emocionuese!

  1. Shkarkoni skedarët Adobe Illustrator (.ai) dhe printoni ato duke përdorur një makinë prerëse lazer.

    upDownBoxWithPlatform.ai duhet të printohet në një karton

  2. Shkarkoni skedarët e printimit 3D (.stl) dhe përdorni printerin tuaj të preferuar 3D për t'i printuar ato.

    Ngjyra nuk ka rëndësi për diskun ose rrotulluesin e diskut. Në imazhin e dytë, rrotulluesi i diskut është futur brenda vrimës së diskut

  3. Mblidhni dy përbërësit e parë dhe ngjitini së bashku siç tregohet në fotot 3 deri në 5.

    1. Platforma
    2. Brazdat për diskun
  4. Tani, bashkoni kutinë duke ndjekur këshillat më poshtë.

    1. Telat e servo duhet të kalojnë nëpër hapjen drejtkëndëshe në anën e kutisë.
    2. Fundi më i shkurtër i rrotulluesit të diskut ngjitet në kokën e servo dhe skaji më i gjatë kalon nëpër vrimën e anës tjetër të kutisë me një vrimë rrethore mbi të. Kjo tregohet në figurën 6.
  5. Tani, ne kemi nevojë për diçka për të siguruar që platforma të mbetet e niveluar kur disku kthehet. Pritini shkopin e shkopit në shkopinj të gjatë 75 mm (figura 7) dhe ngjitini ato në majë të kutisë në pjesën e sipërme të platformës duke përdorur zam të nxehtë. Sigurohuni që shkopinjtë të jenë të niveluar në 90 gradë në platformë.
  6. Futni një shkop të gjatë 212 mm në vrimën e mesme në krye të kutisë në platformë.

E embel! Tani ju keni një kuti të plotë (figura 8) për lëvizjen lart e poshtë të dragoit. Tani, përsëritni hapat e mësipërm edhe dy herë të tjera!

Hapi 2: Po Majtas dhe Djathtas ?

Po Majtas dhe Djathtas ?!
Po Majtas dhe Djathtas ?!
Po Majtas dhe Djathtas ?!
Po Majtas dhe Djathtas ?!
Po Majtas dhe Djathtas ?!
Po Majtas dhe Djathtas ?!
Po Majtas dhe Djathtas ?!
Po Majtas dhe Djathtas ?!

Tani, ne nuk mund të harrojmë lëvizjen e majtë dhe të djathtë të Dragoit Sine-ese, apo jo? Le të kalojmë në hapin e dytë!

  1. Shkarkoni skedarët Adobe Illustrator (.ai) dhe printoni ato duke përdorur një makinë prerëse lazer.

    1. leftRightBoxWithPlatforms.ai duhet të printohet në një karton.
    2. skedari armTurner.ai duhet të printohet në një material që është i trashë 3 mm.
  2. Shkarkoni skedarët e printimit 3D (.stl) dhe përdorni printerin tuaj të preferuar 3D për t'i printuar ato.

    Sigurohuni që të printoni dy krahë! Ngjyra nuk ka rëndësi këtu

  3. Mblidhni të dy platformat së bashku siç tregohet në figurën 3 duke përdorur zam të nxehtë.
  4. Vendoseni së bashku kutinë. Ndërsa mund të jetë e ndërlikuar për ta bërë këtë, është më e lehtë të arrihet duke:

    1. Futja e dy platformave midis dy çarjeve të mëdha në të dy anët e kutisë.
    2. Vendosja e krahut të parë në majë të platformës së sipërme.
    3. Kalimi i rrotulluesit të krahut përmes krahut dhe pastaj platformës së sipërme.
    4. Vendosja e krahut të dytë në krye të platformës së poshtme.
    5. Kalimi i rrotulluesit të krahut përmes krahut të dytë dhe më pas platformës së poshtme.
    6. Ngjitja e rrotulluesit të krahut përmes hapjes drejtkëndore të rrotulluesit të krahut të printuar 3D.
    7. Fundi tjetër i rrotulluesit shkon në krye të servo motorit.
    8. Shtoni pjesët e sipërme, të poshtme dhe të pasme në kuti.

Kutia juaj e fundit e montuar duhet të duket si fotografia e gjashtë. Tani, ju duhet ta përsërisni edhe dy herë të tjera!

Deri në fund të këtij hapi, duhet të keni gjashtë kuti me tre secila nga sistemet e lëvizjes lart/poshtë dhe majtas/djathtas.

Hapi 3: Mbajtja e Trupit… SI?

Mbajtja e Trupit… SI?
Mbajtja e Trupit… SI?

Pyetje e mirë! Kjo është kur ata mbajtës slinky të printuar 3D hyjnë. Shkarkoni skedarin.stl të përfshirë dhe printojeni duke përdorur një printer 3D. Sigurohuni që të printoni 6 mbajtëse në total për 6 kutitë e ndryshme.

Nëse e keni parë fotografinë e mbajtësit të hollë më sipër, surpriza është shkatërruar - kjo është ngjyra e Dragoit tonë Sine -ese!

Hapi 4: Por ato kuti nuk janë aq të bukura…

Dhe jam dakord! Kjo është arsyeja pse ne do të përdorim një prestar lazer për të prerë një kuti shumë më tërheqëse që të përmbajë të gjitha ato kuti dhe t'i fshehë ato.

Shkarkoni ato skedarë Adobe Illustrator dhe prerë ato duke përdorur prestar lazer. Dizajni i reve u vizatua me dorë nga një prej kontribuesve. Ndjehuni të lirë t'i modifikoni duke i hequr ato brenda skedarit të ilustruesit dhe duke shtuar modelin tuaj sipas gjykimit tuaj! Më poshtë janë hapat e sugjeruar për të bashkuar gjithçka.

  1. Mblidhni dhe ngjitni të tre pjesët nga skedari i parë (outerBoxFinal_1) së bashku.
  2. Mos e shtoni ende pjesën nga skedari i dytë (externalBoxFinal_2).
  3. Vendoseni copën nga skedari i tretë (outerBoxFinal_3) në fund të kutisë dhe duhet të mbyllet në krye. Ngjiteni VETYM në fund të kutisë.
  4. Shtypni brendshmeBoxesPlatform dy herë. Ngjitini së bashku dy pjesët që kanë vrima të mëdha drejtkëndëshe. Pastaj, ngjitni tre nga pjesët e mbetura së bashku. Në fund, ngjiteni atë në grupin tjetër të ngjitur me vrima në to.
  5. Vendoseni platformën në fund të kutisë së madhe.
  6. Futini të 6 kutitë më të vogla në pikat e tyre përkatëse në platformë.
  7. Tani, vendoseni copën nga skedari i dytë (outerBoxFinal_2) në krye të kutisë dhe ngjiteni rreth buzës. Vrimat në pjesën e sipërme duhet të përputhen me vrimat në kutitë më të vogla. Nëse jo, rirregulloni kutitë tuaja më të vogla. Mos shtoni fare zam në kutitë më të vogla.
  8. Nëse jeni duke përdorur një dërrasë buke që ka një copë ngjitëse në pjesën e poshtme, vendoseni këtë pranë qendrës së pjesës së poshtme në një vend që kur të mbyllni kutinë, paneli i bukës së bashku me fotonet duhet të zhduken. Ka çarje të vogla në pjesën e poshtme që ju bëjnë më të lehtë lidhjen me Fotonet nga jashtë.

Hapi 5: Lodra Slinky ?? Oh, My

Lodra Slinky ?? Oh, My!
Lodra Slinky ?? Oh, My!
Lodra Slinky ?? Oh, My!
Lodra Slinky ?? Oh, My!

Trupi i dragoit:

1. Kombinoni tre slinkies së bashku duke përdorur zam ose kasetë të nxehtë.

2. Matni gjatësinë dhe diametrin e slinkies dhe prerë një copë pëlhure dekorative.

3. Sillni dy skajet e pëlhurës dhe qepini ato së bashku.

4. Pasi të keni mbaruar qepjen e tyre, rrëshqisni slinkies si një çorapë.

5. Qepni skajet e slinky në pëlhurën e qepur.

Hapi 6: Shtypni Dragoin tuaj

Pjesë të dragoit të printuara 3D:

1. Pjesët janë marrë nga

2. Ne përdorëm vetëm kokën, këmbët dhe sytë.

3. Pas printimit 3D të pjesës, zbuteni atë duke përdorur letër zmerile dhe aceton.

4. Ngjyrosni pjesët ashtu siç dëshironi ta dekoroni.

Hapi 7: Koha për të rritur Dragoin tuaj me NeoPixels

Koha për të rritur Dragoin tuaj me NeoPixels!
Koha për të rritur Dragoin tuaj me NeoPixels!
Koha për të rritur Dragoin tuaj me NeoPixels!
Koha për të rritur Dragoin tuaj me NeoPixels!

Segmenti i dritës:

1. Ju thjesht mund të përdorni një fije neopixel për të krijuar dritat nëse dëshironi. (Ne i mbaruam fillesat).

2. Ne përdorëm 20 drita neopixel dhe i lidhëm ato duke përdorur tela. Këto tela u ngjitën mbi to dhe u lidhën me fotonin duke përdorur tela të kuq në mënyrë që të përputhet me temën e dragoit.

3. Ju gjithashtu mund të qepni dritat tuaja neopixel në një copë të gjatë pëlhure, por ne nuk i përdorëm ato sepse kishim një slinky të bërë nga metali.

Montimi i pjesëve: Siguroni segmentin e dritës brenda trupit të dragoit duke përdorur fije ose tela. Sigurohuni që jeni në gjendje të lidhni dritat me fotonin brenda kutisë bazë. Bashkangjitni kokën, këmbët dhe bishtin në trup duke përdorur zam. Pasi të jenë vendosur, sigurojeni trupin në mbajtëset slinky që shtypëm më parë. Tani trupi është gati për tu programuar.

Hapi 8: Koha e programimit

Meqenëse ne do të përdorim dy fotone grimcash për të punuar me gjashtë servo motorë të veçantë (një foton mund të punojë vetëm me katër), ne do të shkruajmë dy kode të veçanta, por të ngjashme për t'u ndezur në mikrokontrolluesit.

Tani, për mikrokontrolluesin e parë…

Në një skedar Arduino (.ino), përfshini bibliotekat e mëposhtme dhe përcaktoni:

#përfshi "neopixel.h"

#përfshi "ArduinoJson.h"

#përcaktoni PIXEL_PIN D4

#përcaktoni PIXEL_COUNT 18

Tjetra, deklaroni variablat e mëposhtëm:

Rrip Adafruit_NeoPixel = 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 majtasDjathtas = 1; int lartDown_1 = 1; int positionLeftRight_2 = 100; // duhet të jetë midis 0 dhe 180 (në gradë) int positionUpDown_2 = 180; // duhet të jetë midis 0 dhe 180 (në gradë) në të majtëRight_2 = 1; // 0 = majtas, 1 = djathtas lartDown_2 = 1; // 0 = lart, 1 = poshtë 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 (12) + 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_SIZE (2) + JSON_OBJECT_SIZE (3) + 38 * JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490; Moti i stuhishëmArray [3]; temperatura e notimitArray [3]; lagështia notueseArray [3]; noton eraSpeedArray [3]; Vula kohore e vargutArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Klikoni këtu për të mësuar se si të vendosni lidhëset e uebit. Kur të keni mbaruar, shtoni deklaratat dhe funksionet e mëposhtme dhe bëni ndryshimet e duhura nëse është e nevojshme:

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

Funksionet e mëposhtme kontrollojnë lëvizjet lart/poshtë dhe majtas/djathtas të dragoit:

ndryshim i pavlefshëmLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; nëse (positionLeftRight_1> 100) {leftRight_1 = 0; }} else {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; nëse (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }

ndryshim i pavlefshëmLeftRight2 () {

if (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1]; nëse (positionLeftRight_2> 100) {leftRight_2 = 0; }} else {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1]; nëse (positionLeftRight_2 <0) {leftRight_2 = 1; }} servoLeftRight_2.write (positionLeftRight_2); }

void changeUpDown1 () {

nëse (lartDown_1) {positionUpDown_1 ++; nëse (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} else {positionUpDown_1--; nëse (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }

void changeUpDown2 () {

nëse (lartDown_2) {positionUpDown_2 ++; nëse (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} else {positionUpDown_2--; nëse (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }

Për të qenë në gjendje të ndryshoni lëvizjet në një interval, krijohen kohëmatës.

Kohëmatësi i kohëmatësitLeftRight1 (100, changeLeftRight1);

Kohëmatësi i kohëmatësitLeftRight2 (100, changeLeftRight2); Kohëmatësi timerUpDown1 (10, changeUpDown1); Kohëmatësi timerUpDown2 (10, changeUpDown2);

Funksioni i konfigurimit shtohet më në fund tjetër. Sigurohuni që të bëni ndryshimet e duhura në linjat e kodit që merren me lidhëset e uebit.

void setup () {// filloni kohëmatësit e motit timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Vendosni inicimin si pinMode dhe filloni funksionet këtu. // Konfiguro mikro Servo servoLeftRight_1.attach (D1); servoUpDown_1.tash (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // inicializo servo position servoUpDown_1.write (positionUpDown_1); // inicializo servo position servoLeftRight_2.write (positionLeftRight_2); // inicializo servo position servoUpDown_2.write (positionUpDown_2); // inicimi i servo position timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Hapni një tastierë Serial.begin (9600); vonesa (2000); Serial.println ("Përshëndetje!"); // Abonohu në get_weather5DayForecast dhe get_currentWeather webhooks Particle.subscribe ("hook-respond/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-respond/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

Një funksion loop nuk përdoret për këtë projekt. Ne nuk mund të harrojmë funksionet për të trajtuar të dhënat e marra nga lidhësit e uebit!

void gotWeather5DayForecast (const char *event, const char *data) {allData5DaysForecast += të dhëna; // ruan të gjitha të dhënat në një varg. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (tampon, allData5DaysForecastLen + 1); // krijoni një tampon për vargun int bufferLength = sizeof (tampon); DynamicJsonBuffer jsonBufferWeather (tamponLength); JsonObject & root = jsonBufferWeather.parseObject (tampon); // Testoni nëse analizimi ka sukses. nëse (! root.success ()) {//Serial.println("Parasimi për parashikimin e motit për 5 ditë … GABIM! "); kthim; } int i = 1; JsonArray & list = rrënjë ["listë"]; për (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; temperatura e notimit = kryesore ["temp"]; lagështia int = kryesore ["lagështia"]; JsonObject & weather = currentObject ["mot"] [0]; const char* weatherInfo = moti ["kryesor"]; float windSpeed = currentObject ["era"] ["shpejtësia"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); lartDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; lagështiaArray = lagështia; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; i ++; } tjetër {pushim; }}}

void gotCurrentWeatherData (const char *event, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (të dhëna); // Testoni nëse analizimi ka sukses. nëse (! root.success ()) {//Serial.println("Parsing for weather current… ERROR! "); kthim; } JsonObject & weather = rrënjë ["mot"] [0]; const char* weather_main = moti ["kryesor"]; JsonObject & main = rrënja ["kryesore"]; noton main_temp = kryesore ["temp"]; int main_humidity = kryesore ["lagështia"]; noton wind_speed = rrënja ["era"] ["shpejtësia"]; const char* timestamp = rrënja ["dt_txt"]; int tempFah = convertToFahrenheit (tempulli_ kryesor); int servoMaxDegree = updateUpDown (tempFah); lartDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (shpejtësia e erës); leftRightSpeed [0] = servoIncrement; setColor (moti_main, 0); weatherArray [0] = moti_main; temperatureArray [0] = tempFah; lagështiaArray [0] = lagështia kryesore; windSpeedArray [0] = shpejtësia e erës; timestampArray [0] = timestamp; }

Më poshtë, mund të gjeni funksione shtesë që kontrollojnë përditësimin e pozicioneve të servo motorëve, shndërrimin e temperaturës nga Kelvin në Fahrenheit dhe vendosjen e ngjyrave të LED -ve.

int updateUpDown (temperatura e notimit) {// Hartoni shkallën në një interval prej [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("servo gradë e re:"); Serial.println (servoMaxDegree); kthehu servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Hartoni shpejtësinë e erës në një interval prej [1, 100] servoIncrement float = windSpeed * 99 /26 + 1; Serial.print ("vlera e re e rritjes së servo:"); Serial.println (servoIncrement); kthim servoIncrement; }

int convertToFahrenheit (notoni tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67; kthimi tempFah; }

void setColor (String weatherDesc, int index) {

int ledIndex = 0; nëse (indeksi == 0) {ledIndex = 0; } tjetër nëse (indeksi == 1) {ledIndex = 6; } tjetër nëse (indeksi == 2) {ledIndex = 12; } else {kthim; } if (weatherDesc == "Clear") {// verdhë për (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // shirit i verdhë.shfaq (); vonesa (20); }} tjetër nëse (weatherDesc == "Retë") {// gri për (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // shirit gri.shfaq (); vonesa (20); }} tjetër nëse (weatherDesc == "Borë") {// e bardhë për (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // shirit i bardhë.shfaq (); vonesa (20); }} tjetër nëse (weatherDesc == "Shi") {// blu për (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // shirit blu.shfaq (); vonesa (20); }} else {// e kuqe për (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // shirit i kuq. shfaqje (); vonesa (20); }}}

Pasi të keni shtuar gjithçka në skedarin tuaj Arduino, përpilojeni atë. Nëse nuk ka gabime, shkoni përpara dhe ndizni kodin në Photon -in e parë. Hapi tjetër do t'ju ofrojë një kod të ngjashëm që do të ndizet në Photon -in e dytë.

Hapi 9: Programimi vazhdon

Për shkak se kodi për Photon -in e dytë është pothuajse identik me atë për të parin, i gjithë kodi kopjohet dhe ngjitet më poshtë:

#përfshi "ArduinoJson.h"

Servo servoLeftRight_3;

Servo servoUpDown_3;

int positionLeftRight_3 = 45;

int positionUpDown_3 = 0; int majtasDjathtas_3 = 1; int lartDown_3 = 1;

tampon size size_tSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (JOZE)

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_SIZE (2) + JSON_OBJECT_SIZE (3) + 38 * JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490;

Moti i stuhishëmArray [3];

temperatura e notimitArray [3]; lagështia notueseArray [3]; noton eraSpeedArray [3]; Vula kohore e vargutArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String allData5DaysForecast;

void getWeather5DayForecast ()

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

Kohëmatësi i kohëmatësitWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 ditë

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Timer timerWeatherCurrent (60000, getCurrentWeather);

ndryshim i pavlefshëmLeftRight3 () {

nëse (leftRight_3) {positionLeftRight_3 = positionLeftRight_3 + leftRightSpeed [2]; nëse (positionLeftRight_3> 100) {leftRight_3 = 0; }} else {positionLeftRight_3 = positionLeftRight_3 - leftRightSpeed [2]; nëse (positionLeftRight_3 <0) {leftRight_3 = 1; }} servoLeftRight_3.write (positionLeftRight_3); }

void changeUpDown3 () {

nëse (lart -poshtë_3) {positionUpDown_3 ++; nëse (positionUpDown_3> upDownMaxDegree [2]) {lartDown_3 = 0; }} else {positionUpDown_3--; nëse (positionUpDown_3 <1) {lartDown_3 = 1; }} servoUpDown_3.write (positionUpDown_3); }

Kohëmatësi i kohëmatësitLeftRight3 (100, changeLeftRight3);

Kohëmatësi timerUpDown3 (10, changeUpDown3);

void setup () {

// filloni kohëmatësit e motit timerWeatherForecast.start (); timerWeatherCurrent.start (); // Vendosni inicimin si pinMode dhe filloni funksionet këtu. // Konfiguro mikro Servo servoLeftRight_3.attach (D1); servoUpDown_3.tash (D0);

servoLeftRight_3.shkruaj (positionLeftRight_3); // inicializoni pozicionin servo

servoUpDown_3.write (positionUpDown_3); // inicializoni pozicionin e servo

timerLeftRight3.start ();

timerUpDown3.start (); // Hapni një tastierë Serial.begin (9600); vonesa (2000); Serial.println ("Përshëndetje!"); // Abonohu në get_weather5DayForecast dhe get_currentWeather webhooks Particle.subscribe ("hook-respond/get_weather5DayForecast2", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-respond/get_currentWeather2/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

void gotWeather5DayForecast (const char *event, const char *data)

{allData5DaysForecast += të dhëna; // ruan të gjitha të dhënat në një varg. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (tampon, allData5DaysForecastLen + 1); // krijoni një tampon për vargun int bufferLength = sizeof (tampon); DynamicJsonBuffer jsonBufferWeather (tamponLength); JsonObject & root = jsonBufferWeather.parseObject (tampon); //Serial.println(allData5DaysForecast); // Testoni nëse analizimi ka sukses. nëse (! root.success ()) {//Serial.println("Parasimi për parashikimin e motit për 5 ditë … GABIM! "); kthim; } int i = 1; JsonArray & list = rrënjë ["listë"]; për (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; temperatura e notimit = kryesore ["temp"]; lagështia int = kryesore ["lagështia"]; JsonObject & weather = currentObject ["mot"] [0]; const char* weatherInfo = moti ["kryesor"]; float windSpeed = currentObject ["era"] ["shpejtësia"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); lartDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; lagështiaArray = lagështia; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; i ++; } tjetër {pushim; }}}

void gotCurrentWeatherData (const char *event, const char *data)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (të dhëna); //Serial.println(data); // Testoni nëse analizimi ka sukses. nëse (! root.success ()) {//Serial.println("Parsing for weather current… ERROR! "); kthim; } JsonObject & weather = rrënjë ["mot"] [0]; const char* weather_main = moti ["kryesor"]; JsonObject & main = rrënja ["kryesore"]; noton main_temp = kryesore ["temp"]; int main_humidity = kryesore ["lagështia"]; noton wind_speed = rrënja ["era"] ["shpejtësia"]; const char* timestamp = rrënja ["dt_txt"]; int tempFah = convertToFahrenheit (tempulli_ kryesor); int servoMaxDegree = updateUpDown (tempFah); lartDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (shpejtësia e erës); leftRightSpeed [0] = servoIncrement; weatherArray [0] = moti_main; temperatureArray [0] = tempFah; lagështiaArray [0] = lagështia kryesore; windSpeedArray [0] = shpejtësia e erës; timestampArray [0] = timestamp; }

int updateUpDown (temperatura e notimit) {

// Hartoni shkallën në një gamë prej [0, 180] servoMaxDegree float = temp * 45 /31 + (990 /31); Serial.print ("servo gradë e re:"); Serial.println (servoMaxDegree); kthehu servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Hartoni shpejtësinë e erës në një interval prej [1, 100] servoIncrement float = windSpeed * 99 /26 + 1; Serial.print ("vlera e re e rritjes së servo:"); Serial.println (servoIncrement); kthim servoIncrement; }

int convertToFahrenheit (notoni tempKel) {

int tempFah = tempKel * 9.0 / 5.0 - 459.67; kthimi tempFah; }

Ti e bëre! Ju keni arritur përmes seksionit të programimit të projektit! Tani, sigurohuni që të bëni të gjitha telat dhe lidhjet nga motorët servo dhe neopixelët në dërrasën e ngrënies dhe mikrokontrolluesit. Fundi tjetër duhet të lidhet me trupin e dragoit.

Hapi 10: Shijoni Dragoin tuaj

Urime! Ju keni ndërtuar një Dragon Sine-ese nga e para! Tani gjithçka që duhet të bëni është të uleni dhe të shijoni ekranin tuaj të ambientit!

SH NOTNIM: Ky projekt u ndërtua si pjesë e një kursi nga Joan Bempong dhe Soundarya Muthuvel. Faqja e kursit mund të gjendet këtu.

Recommended: