Cuprins:

Sine-ese Dragon: 10 pași (cu imagini)
Sine-ese Dragon: 10 pași (cu imagini)

Video: Sine-ese Dragon: 10 pași (cu imagini)

Video: Sine-ese Dragon: 10 pași (cu imagini)
Video: Imagine Dragons - Whatever It Takes (Official Music Video) 2024, Iulie
Anonim
Dragon Sine-ese
Dragon Sine-ese

Sine-ese Dragon este o piesă decorativă ambientală care folosește mișcări mecanice și lumini pentru a vă spune prognoza meteo pentru următoarele trei intervale de trei ore. Prin definiție, ambientul descrie împrejurimile imediate ale ceva; prin urmare, sa decis să fie adecvat să se încorporeze datele meteo pe un afișaj ambiental. Vremea este un aspect care schimbă în mod neintenționat ziua oamenilor și este o informație care se schimbă constant în fiecare minut, sau chiar până în al doilea.

Dragonul chinez este „un simbol al puterii, puterii și norocului” și este frecvent deținut la o înaltă valoare culturală și tradițională în subcontinentul asiatic. Pe lângă faptul că aduce noroc, Dragonul chinez are și puteri puternice care controlează „apa, precipitațiile, taifunurile și inundațiile”. În cele din urmă, Dragonul chinez a fost considerat adecvat pentru a reprezenta datele meteo.

Vizualizare

Dragonul Sine-ese este manipulat în șase puncte principale în trei secțiuni separate reprezentând prognoza meteo pentru trei intervale de 3 ore. Pentru fiecare interval de 3 ore, vor fi incluse următoarele informații:

  • Descrierea vremii - determină culoarea informațiilor meteo curente.
  • Temperatura - specifică înălțimea corpului
  • Umiditate - clipirea segmentelor LED
  • Viteza vântului - controlează viteza corpului care se mișcă la stânga și la dreapta.

Materiale necesare

  1. Placaj de 3 mm / Carton
  2. Dibluri sau betisoare din lemn de 5 mm
  3. 2 fotoni de particule
  4. 3 jucării slinky
  5. 6 servomotoare
  6. Luminile NeoPixel (fie un fir sau lumini individuale cusute împreună)
  7. O mulțime de super Glue
  8. Fir conductiv
  9. Vopsea acrilică
  10. Țesătură decorativă
  11. Cutter cu laser
  12. imprimantă 3d

Pasul 1: Sus și Jos

Sus si jos!
Sus si jos!
Sus si jos!
Sus si jos!
Sus si jos!
Sus si jos!

Primul dvs. pas către construirea Dragonului Sine-ese este să construiți componenta care controlează mișcarea în sus și în jos a corpului. Ce palpitant!

  1. Descărcați fișierele Adobe Illustrator (.ai) și imprimați-le folosind un aparat de tăiat cu laser.

    upDownBoxWithPlatform.ai ar trebui să fie tipărit pe un carton

  2. Descărcați fișierele de imprimare 3D (.stl) și utilizați imprimanta 3D preferată pentru a le imprima.

    Culoarea nu contează pentru disc sau rotitorul de disc. În a doua imagine, dispozitivul de turnare a discului a fost introdus în gaura discului

  3. Asamblați primele două componente și lipiți-le împreună așa cum se arată în imaginile 3-5.

    1. Platforma
    2. Șanțurile pentru disc
  4. Acum, puneți împreună caseta urmând sfaturile de mai jos.

    1. Firele servo ar trebui să treacă prin deschiderea dreptunghiulară din partea laterală a cutiei.
    2. Cel mai scurt capăt al rotitorului de disc este atașat la capul servo, iar cel mai lung trece prin orificiul celeilalte părți a cutiei, cu o gaură circulară pe el. Acest lucru este demonstrat în imaginea 6.
  5. Acum, avem nevoie de ceva pentru a ne asigura că platforma rămâne nivelată atunci când discul este rotit. Tăiați bețișorul în bețișoare lungi de 75 mm (imaginea 7) și lipiți-le prin partea superioară a cutiei în partea superioară a platformei folosind lipici fierbinte. Asigurați-vă că bețele sunt nivelate în jos la 90 de grade față de platformă.
  6. Introduceți un baston lung de 212 mm în gaura din mijlocul din partea superioară a cutiei pe platformă.

Dulce! Acum aveți o casetă completă (imaginea 8) pentru mișcarea în sus și în jos a dragonului. Acum, repetați pașii de mai sus de încă două ori!

Pasul 2: Dar stânga și dreapta ?

Dar stânga și dreapta ?!
Dar stânga și dreapta ?!
Dar stânga și dreapta ?!
Dar stânga și dreapta ?!
Dar stânga și dreapta ?!
Dar stânga și dreapta ?!
Dar stânga și dreapta ?!
Dar stânga și dreapta ?!

Acum, nu putem uita de mișcarea stângă și dreaptă a Dragonului Sine-ese, nu-i așa? Să sărim în al doilea pas!

  1. Descărcați fișierele Adobe Illustrator (.ai) și imprimați-le folosind un aparat de tăiat cu laser.

    1. leftRightBoxWithPlatforms.ai ar trebui să fie tipărite pe un carton.
    2. fișierul armTurner.ai trebuie tipărit pe un material cu grosimea de 3 mm.
  2. Descărcați fișierele de imprimare 3D (.stl) și utilizați imprimanta 3D preferată pentru a le imprima.

    Asigurați-vă că imprimați două dintre brațe! Culoarea nu contează aici

  3. Asamblați cele două platforme împreună așa cum se arată în imaginea 3 folosind adeziv fierbinte.
  4. Puneți împreună cutia. Deși poate fi dificil să o faci, este mai ușor de realizat prin:

    1. Introducerea celor două platforme între cele două fante mari de pe ambele părți ale cutiei.
    2. Așezarea primului braț pe partea superioară a platformei superioare.
    3. Infilați rotitorul brațului prin braț și apoi pe platforma superioară.
    4. Așezați al doilea braț pe partea superioară a platformei inferioare.
    5. Infilarea rotitorului brațului prin al doilea braț și apoi pe platforma inferioară.
    6. Introduceți rotitorul de brațe prin deschiderea dreptunghiulară a rotitorului de brațe imprimate 3D.
    7. Celălalt capăt al strunjitorului merge deasupra servomotorului.
    8. Adăugați piesele de sus, de jos și din spate în cutie.

Cutia finală asamblată ar trebui să arate ca a șasea imagine. Acum, trebuie să repeti asta încă de două ori!

La sfârșitul acestui pas, ar trebui să aveți șase cutii cu câte trei sisteme de mișcare sus / jos și stânga / dreapta.

Pasul 3: Ridicarea corpului … CUM?

Ținând corpul … CUM?
Ținând corpul … CUM?

Buna intrebare! Atunci intervin acele suporturi slinky imprimate 3D. Descărcați fișierul.stl inclus și imprimați-l folosind o imprimantă 3D. Asigurați-vă că imprimați 6 suporturi în total pentru cele 6 cutii diferite.

Dacă ați văzut imaginea suportului slinky de mai sus, surpriza a fost distrusă - aceasta este culoarea Dragonului nostru Sine-ese!

Pasul 4: Dar acele cutii nu sunt atât de frumoase …

Și sunt de acord! Acesta este motivul pentru care vom folosi un dispozitiv de tăiat cu laser pentru a tăia o cutie mult mai atractivă pentru a conține toate aceste cutii și a le ascunde.

Descărcați acele fișiere Adobe Illustrator și tăiați-le folosind dispozitivul de tăiere cu laser. Designul norilor a fost desenat manual de unul dintre colaboratori. Simțiți-vă liber să le modificați, îndepărtându-le din fișierul ilustrator și adăugând propriul design după cum doriți! Mai jos sunt pașii sugerați pentru a pune totul împreună.

  1. Asamblați și lipiți toate cele trei piese din primul fișier (exteriorBoxFinal_1) împreună.
  2. Nu adăugați încă piesa din al doilea fișier (exteriorBoxFinal_2).
  3. Puneți piesa de la al treilea fișier (exteriorBoxFinal_3) în partea de jos a cutiei și ar trebui să se închidă în partea de sus. Lipiți DOAR în partea de jos a cutiei.
  4. Imprimați innerBoxesPlatform de două ori. Lipiți cele două piese care au găuri mari dreptunghiulare împreună. Apoi, lipiți trei dintre piesele rămase împreună. În cele din urmă, lipiți-l de celălalt set lipit cu găuri în ele.
  5. Așezați platforma în partea de jos a cutiei mari.
  6. Introduceți toate cele 6 cutii mai mici în locurile corespunzătoare de pe platformă.
  7. Acum, așezați piesa din al doilea fișier (exteriorBoxFinal_2) în partea de sus a cutiei și lipiți în jurul marginii. Găurile de pe partea superioară ar trebui să se alinieze cu găurile de pe cutiile mai mici. Dacă nu, rearanjați cutiile mai mici. Nu adăugați deloc clei la cutiile mai mici.
  8. Dacă utilizați o placă de prindere care are o piesă lipicioasă în partea de jos, așezați-o lângă centrul piesei de jos într-un loc care atunci când închideți cutia, plăcuța de prăjitură împreună cu fotonii ar trebui să dispară. Există mici fante pe partea inferioară, ceea ce vă permite să vă conectați mai ușor la fotoni din exterior.

Pasul 5: Jucării Slinky ?? Vai

Jucării Slinky ?? Vai!
Jucării Slinky ?? Vai!
Jucării Slinky ?? Vai!
Jucării Slinky ?? Vai!

Corpul dragonului:

1. Combinați trei slinkies împreună folosind lipici fierbinte sau bandă adezivă.

2. Măsurați lungimea și diametrul slinkies-urilor și tăiați o bucată de țesătură decorativă.

3. Aduceți cele două capete ale țesăturii și coaseți-le împreună.

4. După ce ați terminat de cusut, glisați slinkies-ul ca o șosetă.

5. Coaseți capetele strălucitoare pe țesătura cusută.

Pasul 6: Tipărește-ți dragonul

Părți imprimate 3D ale dragonului:

1. Piesele au fost preluate de pe

2. Am folosit doar capul, picioarele și ochii.

3. După imprimarea 3D a piesei, neteziți-o folosind șmirghel și acetonă.

4. Vopsiți părțile așa cum doriți să o decorați.

Pasul 7: E timpul să-ți intensifici dragonul cu NeoPixels

E timpul să-ți intensifici dragonul cu NeoPixels!
E timpul să-ți intensifici dragonul cu NeoPixels!
E timpul să-ți intensifici dragonul cu NeoPixels!
E timpul să-ți intensifici dragonul cu NeoPixels!

Segment de lumină:

1. Puteți utiliza pur și simplu un fir de neopixel pentru a crea luminile, dacă doriți. (Am rămas fără fire).

2. Am folosit 20 de lumini neopixel și le-am conectat folosind fire. Aceste fire au fost lipite pe ele și conectate la foton folosind cabluri roșii, astfel încât să se potrivească cu tema dragonului.

3. Puteți, de asemenea, să vă coaseți luminile de neopixel pe o bucată lungă de pânză, dar nu le-am folosit pentru că aveam un slinky din metal.

Asamblarea pieselor: Asigurați segmentul luminos în interiorul corpului dragonului folosind fire sau fire. Asigurați-vă că puteți conecta luminile la fotonul din interiorul cutiei de bază. Atașați capul, picioarele și coada la corp folosind lipici. Odată ce sunt la locul lor, fixați corpul în suporturile slinky pe care le-am imprimat anterior. Acum corpul este gata să fie programat.

Pasul 8: Timp de programare

Deoarece vom folosi doi fotoni de particule pentru a lucra cu șase servo-motoare separate (un foton poate funcționa doar cu patru), vom scrie două coduri separate, dar similare, care vor fi clipite pe microcontrolere.

Acum, pentru primul microcontroler …

Într-un fișier Arduino (.ino), includeți următoarele biblioteci și definiți:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Apoi, declarați următoarele variabile:

Adafruit_NeoPixel strip = 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; // trebuie să fie între 0 și 180 (în grade) int positionUpDown_2 = 180; // trebuie să fie între 0 și 180 (în grade) int leftRight_2 = 1; // 0 = stânga, 1 = dreapta int upDown_2 = 1; // 0 = sus, 1 = jos const size_t tampon SizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2 * JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + JSON_OBJECT_SIZE (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_SIZE (2) + JSON_OBJECT_SIZ (JSON_OBJECT_SIZE) (5) + 76 * JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; float temperatureArray [3]; umiditate plutitoare Array [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Faceți clic aici pentru a afla cum să configurați webhook-uri. Când ați terminat, adăugați următoarele declarații și funcții și faceți modificările corespunzătoare, dacă este necesar:

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

Următoarele funcții controlează mișcările sus / jos și stânga / dreapta dragonului:

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 (susDown_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 (susDown_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); }

Pentru a putea schimba mișcările într-un interval, sunt create temporizatoare.

Timer timerLeftRight1 (100, changeLeftRight1);

Timer timerLeftRight2 (100, changeLeftRight2); Timer timerUpDown1 (10, changeUpDown1); Timer timerUpDown2 (10, changeUpDown2);

Funcția de configurare este adăugată în cele din urmă. Asigurați-vă că faceți modificările corespunzătoare liniilor de cod care se ocupă de webhooks.

void setup () {// pornește temporizatoarele meteo timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixeli strip.begin (); // Puneți inițializarea ca pinMode și începeți funcțiile aici. // Configurați Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // inițializați poziția servo servoUpDown_1.write (positionUpDown_1); // inițializați poziția servo servoLeftRight_2.write (positionLeftRight_2); // inițializează servo position servoUpDown_2.write (positionUpDown_2); // inițializează poziția servo timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Deschideți o consolă Serial.begin (9600); întârziere (2000); Serial.println ("Bună ziua!"); // Abonați-vă la 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 (); }

O funcție de buclă nu este utilizată pentru acest proiect. Nu putem uita funcțiile de gestionare a datelor primite de pe webhooks!

void gotWeather5DayForecast (const char * event, const char * data) {allData5DaysForecast + = data; // salvează toate datele într-un singur șir. int allData5DaysForecastLen = allData5DaysForecast.length (); buff buff [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (tampon, allData5DaysForecastLen + 1); // creați un buffer pentru șirul int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (tampon); // Testați dacă analiza reușește. if (! root.success ()) {//Serial.println("Parsing for weather 5 days forecast … EROARE! "); întoarcere; } int i = 1; JsonArray & list = root ["list"]; pentru (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; float temperature = main ["temp"]; int umiditate = main ["umiditate"]; JsonObject & weather = currentObject ["weather"] [0]; const char * weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; umiditateArray = umiditate; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; i ++; } else {break; }}}

void gotCurrentWeatherData (const char * event, const char * data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (date); // Testați dacă analiza reușește. if (! root.success ()) {//Serial.println("Parsing for weather current … ERROR! "); întoarcere; } JsonObject & weather = root ["weather"] [0]; const char * weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["umiditate"]; float wind_speed = root ["wind"] ["speed"]; const char * timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (weather_main, 0); weatherArray [0] = weather_main; temperatureArray [0] = tempFah; moistureArray [0] = main_humidity; windSpeedArray [0] = vânt_viteză; timestampArray [0] = timestamp; }

Mai jos, puteți găsi funcții suplimentare care controlează actualizarea pozițiilor servomotorelor, conversia temperaturii de la Kelvin la Fahrenheit și setarea culorilor LED-urilor.

int updateUpDown (float temp) {// Mapează gradul la un interval de [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print („nou grad servo:”); Serial.println (servoMaxDegree); returnează servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Asociați viteza vântului la o gamă de [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("nouă valoare a incrementului servo:"); Serial.println (servoIncrement); returnează servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

void setColor (String weatherDesc, int index) {

int ledIndex = 0; if (index == 0) {ledIndex = 0; } else if (index == 1) {ledIndex = 6; } else if (index == 2) {ledIndex = 12; } else {return; } if (weatherDesc == "Clear") {// galben pentru (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // bandă galbenă.show (); întârziere (20); }} else if (weatherDesc == "Clouds") {// gri pentru (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // striy gri.show (); întârziere (20); }} else if (weatherDesc == "Snow") {// alb pentru (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // strip alb.show (); întârziere (20); }} else if (weatherDesc == "Rain") {// blue for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // strip albastru.show (); întârziere (20); }} else {// red for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // red strip.show (); întârziere (20); }}}

Odată ce ați adăugat totul la fișierul Arduino, compilați-l. Dacă nu există erori, continuați și blocați codul către primul foton. Următorul pas vă va oferi un cod similar care va fi afișat pe al doilea foton.

Pasul 9: Programarea continuă

Deoarece codul pentru al doilea foton este aproape identic cu cel pentru primul, întregul cod este copiat și lipit mai jos:

#include "ArduinoJson.h"

Servo servoLeftRight_3;

Servo servoUpDown_3;

int positionLeftRight_3 = 45;

int positionUpDown_3 = 0; int leftRight_3 = 1; int susDown_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_SIZE (6) + JSON_SIZE (6)

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_SIZ (JSON_OBJECT_SIZE) (5) + 76 * JSON_OBJECT_SIZE (8) + 12490;

String weatherArray [3];

float temperatureArray [3]; umiditate plutitoare Array [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String allData5DaysForecast;

void getWeather5DayForecast ()

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

Timer timerWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 zile

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 (susDown_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);

configurare nulă () {

// porniți temporizatoarele meteo timerWeatherForecast.start (); timerWeatherCurrent.start (); // Puneți inițializarea ca pinMode și începeți funcțiile aici. // Configurați Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // inițializați poziția servo

servoUpDown_3.write (positionUpDown_3); // inițializați poziția servo

timerLeftRight3.start ();

timerUpDown3.start (); // Deschideți o consolă Serial.begin (9600); întârziere (2000); Serial.println ("Bună ziua!"); // Abonați-vă la 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 * event, const char * data)

{allData5DaysForecast + = date; // salvează toate datele într-un singur șir. int allData5DaysForecastLen = allData5DaysForecast.length (); buff buff [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (tampon, allData5DaysForecastLen + 1); // creați un buffer pentru șirul int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (tampon); //Serial.println(allData5DaysForecast); // Testați dacă analiza reușește. if (! root.success ()) {//Serial.println("Parsing for weather 5 days forecast … EROARE! "); întoarcere; } int i = 1; JsonArray & list = root ["list"]; pentru (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; float temperature = main ["temp"]; int umiditate = main ["umiditate"]; JsonObject & weather = currentObject ["weather"] [0]; const char * weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; umiditateArray = umiditate; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; i ++; } else {break; }}}

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

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (date); //Serial.println(data); // Testați dacă analiza reușește. if (! root.success ()) {//Serial.println("Parsing for weather current … ERROR! "); întoarcere; } JsonObject & weather = root ["weather"] [0]; const char * weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["umiditate"]; float wind_speed = root ["wind"] ["speed"]; const char * timestamp = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; weatherArray [0] = weather_main; temperatureArray [0] = tempFah; moistureArray [0] = main_humidity; windSpeedArray [0] = vânt_viteză; timestampArray [0] = timestamp; }

int updateUpDown (float temp) {

// Mapează gradul la un interval de [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print („nou grad servo:”); Serial.println (servoMaxDegree); returnează servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Asociați viteza vântului la o gamă de [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("nouă valoare a incrementului servo:"); Serial.println (servoIncrement); returnează servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

Tu ai făcut-o! Ați reușit prin secțiunea de programare a proiectului! Acum, asigurați-vă că faceți toate cablurile și conexiunile de la servomotori și neopixeli la panoul de control și microcontrolere. NOTĂ: introduceți diblurile / bețișoarele suplimentare prin fantele verticale de pe cutii pentru mișcările stânga și dreapta ale corpului. Celălalt capăt ar trebui să fie conectat la corpul dragonului.

Pasul 10: Bucură-te de dragonul tău

Felicitări! Ai construit un Dragon Sine-ese de la zero! Acum tot ce trebuie să faceți este să vă așezați și să vă bucurați de afișajul dvs. ambiental!

NOTĂ: Acest proiect a fost construit ca parte a unui curs de către Joan Bempong și Soundarya Muthuvel. Pagina cursului poate fi găsită aici.

Recomandat: