Innholdsfortegnelse:

Sine-ese Dragon: 10 Steps (med bilder)
Sine-ese Dragon: 10 Steps (med bilder)

Video: Sine-ese Dragon: 10 Steps (med bilder)

Video: Sine-ese Dragon: 10 Steps (med bilder)
Video: Imagine Dragons - Natural 2024, November
Anonim
Sinus-drage
Sinus-drage

Sine-ese Dragon er et stemningsfullt interiørstykke som bruker mekaniske bevegelser og lys for å fortelle deg værmeldingen for de neste tre timene. Per definisjon beskriver ambient de umiddelbare omgivelsene til noe; Derfor ble det bestemt å være hensiktsmessig å inkludere værdata i en omgivelsesvisning. Været er et aspekt som utilsiktet endrer folks dag og er en informasjon som stadig endrer seg hvert minutt, eller til og med ned til det andre.

Den kinesiske dragen er "et symbol på makt, styrke og lykke" og holdes ofte med en høy kulturell og tradisjonell verdi over det asiatiske subkontinentet. I tillegg til å bringe lykke til, sies den kinesiske dragen også å ha sterke krefter som styrer "vann, nedbør, tyfoner og flom." Til syvende og sist ble den kinesiske dragen ansett som hensiktsmessig å representere værdata.

Visualisering

The Sin-ese Dragon blir manipulert på seks hovedpunkter i tre separate seksjoner som representerer værmeldingen i tre 3 timers intervaller. Følgende informasjon vil bli inkludert for hvert 3-timers intervall:

  • Værbeskrivelse - bestemmer fargen på gjeldende værinformasjon.
  • Temperatur - angir kroppens høyde
  • Fuktighet - blinking av LED -segmenter
  • Vindhastighet - styrer hastigheten på kroppen som beveger seg til venstre og høyre.

Materialer som kreves

  1. 3 mm kryssfiner/papp
  2. 5 mm dyvler eller spisepinner
  3. 2 partikkelfotoner
  4. 3 slanke leker
  5. 6 servomotorer
  6. NeoPixel -lys (enten en tråd eller individuelle lys sydd sammen)
  7. Mye superlim
  8. Ledende tråd
  9. Akrylmaling
  10. Dekorativt stoff
  11. Laserskjærer
  12. 3D -skriver

Trinn 1: Opp og ned

Opp og ned!
Opp og ned!
Opp og ned!
Opp og ned!
Opp og ned!
Opp og ned!

Ditt aller første trinn for å bygge Sine-ese Dragon er å konstruere komponenten som styrer opp og ned bevegelse av kroppen. Så spennende!

  1. Last ned Adobe Illustrator -filene (.ai) og skriv dem ut med en laserskjæremaskin.

    upDownBoxWithPlatform.ai skal skrives ut på en papp

  2. Last ned 3D -utskriftsfiler (.stl), og bruk 3D -skriveren din til å skrive dem ut.

    Fargen spiller ingen rolle for disken eller diskturneren. I det andre bildet har diskturneren blitt satt inn i hullet på disken

  3. Monter de to første komponentene og lim dem sammen som vist på bildene 3 til 5.

    1. Plattformen
    2. Sporene til platen
  4. Sett sammen boksen etter tipsene nedenfor.

    1. Servotrådene skal gå gjennom den rektangulære åpningen på siden av esken.
    2. Den korteste enden av diskturneren blir festet til servohodet og den lengre enden går gjennom hullet på den andre siden av esken med et sirkulært hull på den. Dette er vist på bilde 6.
  5. Nå trenger vi noe for å sikre at plattformen holder seg jevn når disken blir snudd. Skjær spisepinnen i 75 mm lange pinner (bilde 7) og lim dem gjennom toppen av esken inn i toppen av plattformen med varmt lim. Pass på at pinnene er jevnet 90 grader ned til plattformen.
  6. Sett en 212 mm lang pinne inn i det midterste hullet på toppen av esken på plattformen.

Søt! Nå har du en komplett boks (bilde 8) for opp og ned bevegelse av dragen. Gjenta trinnene ovenfor to ganger til!

Trinn 2: Hva med venstre og høyre ?

Hva med venstre og høyre ?!
Hva med venstre og høyre ?!
Hva med venstre og høyre ?!
Hva med venstre og høyre ?!
Hva med venstre og høyre ?!
Hva med venstre og høyre ?!
Hva med venstre og høyre ?!
Hva med venstre og høyre ?!

Nå kan vi ikke glemme venstre- og høyrebevegelsen til den sinusiske dragen, kan vi? La oss hoppe inn i det andre trinnet!

  1. Last ned Adobe Illustrator -filene (.ai) og skriv dem ut med en laserskjæremaskin.

    1. leftRightBoxWithPlatforms.ai skal skrives ut på en papp.
    2. armTurner.ai -filen skal skrives ut på et materiale som er 3 mm tykt.
  2. Last ned 3D -utskriftsfiler (.stl), og bruk 3D -skriveren din til å skrive dem ut.

    Sørg for å skrive ut to av armene! Fargen spiller ingen rolle her

  3. Monter de to plattformene sammen som vist på bilde 3 ved hjelp av varmt lim.
  4. Sett sammen esken. Selv om det kan være vanskelig å gjøre det, er det lettere å oppnå ved å:

    1. Sett inn de to plattformene mellom de to store slissene på hver side av esken.
    2. Plassering av den første armen på toppen av den øvre plattformen.
    3. Tre armen vender gjennom armen og deretter den øvre plattformen.
    4. Plassering av den andre armen på toppen av den nedre plattformen.
    5. Tre armen vender gjennom den andre armen og deretter den nederste plattformen.
    6. Stikker armsvingen gjennom den rektangulære åpningen til den 3D -trykte armsvingen.
    7. Den andre enden av svingeren går på toppen av servomotoren.
    8. Legg topp-, bunn- og bakstykkene i esken.

Den siste monterte boksen skal se ut som det sjette bildet. Nå må du gjenta det to ganger til!

Ved slutten av dette trinnet bør du ha seks bokser med tre hver av opp/ned og venstre/høyre bevegelsessystemer.

Trinn 3: Hold opp kroppen … HVORDAN?

Holder kroppen opp … HVORDAN?
Holder kroppen opp … HVORDAN?

Godt spørsmål! Det er da de 3D -trykte glatte innehaverne kommer inn. Last ned den medfølgende.stl -filen og skriv den ut med en 3D -skriver. Sørg for å skrive ut 6 holdere totalt for de 6 forskjellige boksene.

Hvis du har sett bildet av den slanke holderen ovenfor, er overraskelsen ødelagt - det er fargen på vår Sinese -drage!

Trinn 4: Men boksene er ikke så vakre …

Og jeg er enig! Dette er grunnen til at vi skal bruke en laserskjærer til å kutte en mye mer attraktiv eske for å inneholde alle disse boksene og skjule dem.

Last ned disse Adobe Illustrator -filene og kutt dem ut ved hjelp av laserskjæreren. Skydesignet ble håndtegnet av en av bidragsyterne. Du er velkommen til å endre dem ved å fjerne dem inne i illustratorfilen og legge til ditt eget design som du synes passer! Nedenfor er de foreslåtte trinnene for å sette alt sammen.

  1. Monter og lim alle tre delene fra den første filen (outerBoxFinal_1) sammen.
  2. Ikke legg til stykket fra den andre filen (outerBoxFinal_2) ennå.
  3. Legg stykket fra den tredje filen (outerBoxFinal_3) til bunnen av esken, og den skal lukkes øverst. Lim BARE i bunnen av esken.
  4. Skriv ut indre bokser. Plattform to ganger. Lim de to bitene som har store rektangelhull i dem sammen. Lim deretter tre av de gjenværende bitene sammen. Lim det til slutt til det andre limte settet med hull i.
  5. Plasser plattformen nederst på den store esken.
  6. Sett alle 6 mindre esker inn på de tilsvarende stedene på plattformen.
  7. Legg nå brikken fra den andre filen (ytterBoksFinal_2) på toppen av esken og lim rundt kanten. Hullene på toppstykket skal være på linje med hullene på de mindre eskene. Hvis ikke, omorganiser de mindre boksene. Ikke legg lim i de mindre eskene i det hele tatt.
  8. Hvis du bruker et brødbrett som har et klebrig stykke i bunnen, plasser dette nær midten av bunnstykket på et sted som når du lukker esken, skal brødbrettet sammen med fotonene forsvinne. Det er små slisser på bunnstykket som gjør det lettere for deg å koble til fotonene fra utsiden.

Trinn 5: Slinky Toys ?? Oi da

Slinky leker ?? Oi da!
Slinky leker ?? Oi da!
Slinky leker ?? Oi da!
Slinky leker ?? Oi da!

Dragens kropp:

1. Kombiner tre slinkies sammen med varmt lim eller tape.

2. Mål lengden og diameteren på slinkies og skjær et stykke dekorativt stoff.

3. Ta med de to endene av stoffet og sy dem sammen.

4. Når du er ferdig med å sy dem, skyver du slinkies som en sokk.

5. Sy endene på slinky til det syte stoffet.

Trinn 6: Skriv ut dragen din

3D -trykte deler av dragen:

1. Delene ble hentet fra

2. Vi brukte bare hodet, bena og øynene.

3. Etter 3D -utskrift, glatt ut med sandpapir og aceton.

4. Mal delene slik du ønsker å dekorere det.

Trinn 7: På tide å trappe opp dragen din med NeoPixels

På tide å trappe opp dragen din med NeoPixels!
På tide å trappe opp dragen din med NeoPixels!
På tide å forsterke dragen din med NeoPixels!
På tide å forsterke dragen din med NeoPixels!

Lys segment:

1. Du kan ganske enkelt bruke en neopikselstreng for å lage lysene hvis du ønsker det. (Vi gikk tom for trådene).

2. Vi brukte 20 neopikslelamper og koblet dem til med ledninger. Disse ledningene ble loddet på dem og koblet til fotonet ved hjelp av røde ledninger slik at det samsvarer med temaet til dragen.

3. Du kan også sy neopiksellysene dine på et langt tøystykke, men vi brukte dem ikke fordi vi hadde en slanky laget av metall.

Montering av delene: Fest lyssegmentet inne i dragen av kroppen ved hjelp av tråder eller ledninger. Sørg for at du er i stand til å koble lysene til fotonen inne i basisboksen. Fest hodet, bena og halen til kroppen ved hjelp av lim. Når de er på plass, fest kroppen i de glatte holderne vi trykte før. Nå er kroppen klar til å bli programmert.

Trinn 8: Programmeringstid

Siden vi skal bruke to partikkelfotoner til å arbeide med seks separate servomotorer (en foton kan bare fungere med fire), skriver vi to separate, men lignende koder som skal blinkes på mikrokontrollerne.

Nå, for den første mikrokontrolleren …

I en Arduino -fil (.ino) inkluderer du følgende biblioteker og definerer:

#inkludere "neopixel.h"

#inkludere "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Deretter deklarerer du følgende variabler:

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; // må være mellom 0 og 180 (i grader) int positionUpDown_2 = 180; // må være mellom 0 og 180 (i grader) int leftRight_2 = 1; // 0 = venstre, 1 = høyre int upDown_2 = 1; // 0 = opp, 1 = ned 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 (5) + JSON_OBJECT_SIZE (5) + JSON_OBJECT_SIZE (5) + JSON_OBJECT_SIZE (5) + JSON_OBJECT_SIZE (5) 390; const size_t bufferSizeForecast = 38*JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2*JSON_OBJECT_SIZE (0) + 112*JSON_OBJECT_SIZE (3) + JSON_SIZE_ (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; flytemperaturArray [3]; flyt fuktighetArray [3]; float windSpeedArray [3]; Tidsstempel for strengerArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Klikk her for å lære hvordan du konfigurerer webhooks. Når du er ferdig, kan du legge til følgende erklæringer og funksjoner og gjøre nødvendige endringer om nødvendig:

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

Følgende funksjoner styrer opp/ned og venstre/høyre bevegelse av dragen:

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]; hvis (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 () {

hvis (upDown_1) {positionUpDown_1 ++; if (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} annet {positionUpDown_1--; hvis (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }

void changeUpDown2 () {

hvis (upDown_2) {positionUpDown_2 ++; if (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} annet {positionUpDown_2--; hvis (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }

For å kunne endre bevegelsene i et intervall, opprettes tidtakere.

Timer timerLeftRight1 (100, changeLeftRight1);

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

Oppsettfunksjonen blir endelig lagt til neste. Sørg for å gjøre passende endringer i kodelinjene som omhandler webhooks.

ugyldig oppsett () {// start værtimerne timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Sett initialisering som pinMode og start funksjonene her. // Sett opp Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // initialiser servoposisjon servoUpDown_1.write (positionUpDown_1); // initialiser servoposisjon servoLeftRight_2.write (positionLeftRight_2); // initialiser servoposisjon servoUpDown_2.write (positionUpDown_2); // initialiser servoposisjonstimerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Åpne en konsoll Serial.begin (9600); forsinkelse (2000); Serial.println ("Hei!"); // Abonner på get_weather5DayForecast og get_currentWeather webhooks Particle.subscribe ("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

En loop -funksjon brukes ikke for dette prosjektet. Vi kan ikke glemme funksjonene for å håndtere dataene som mottas fra webhooks!

void gotWeather5DayForecast (const char *hendelse, const char *data) {allData5DaysForecast += data; // lagrer alle dataene i en streng. int allData5DaysForecastLen = allData5DaysForecast.length (); røyebuffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // lag en buffer for strengen int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); // Test om analysering lykkes. if (! root.success ()) {//Serial.println("Parsing for værmelding 5 dager … FEIL! "); komme tilbake; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; flyte temperatur = main ["temp"]; int fuktighet = main ["fuktighet"]; JsonObject & weather = currentObject ["weather"] [0]; const char* weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; fuktighetArray = fuktighet; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = tidsstempel; i ++; } annet {pause; }}}

void gotCurrentWeatherData (const char *hendelse, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); // Test om analysering lykkes. if (! root.success ()) {//Serial.println("Parsing for nåværende vær … FEIL! "); komme tilbake; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["fuktighet"]; 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; fuktighetArray [0] = hoved_fuktighet; windSpeedArray [0] = vindhastighet; timestampArray [0] = tidsstempel; }

Nedenfor finner du tilleggsfunksjoner som styrer oppdateringen av servomotorenes posisjoner, konvertering av temperatur fra Kelvin til Fahrenheit og innstilling av fargene på lysdiodene.

int updateUpDown (float temp) {// Kartlegg graden til et område på [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("ny servo grad:"); Serial.println (servoMaxDegree); returner servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Kart vindhastigheten til et område på [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("ny servo inkrement verdi:"); Serial.println (servoIncrement); retur servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; retur tempFah; }

void setColor (String weatherDesc, int index) {

int ledIndex = 0; hvis (indeks == 0) {ledIndex = 0; } annet hvis (indeks == 1) {ledIndex = 6; } annet hvis (indeks == 2) {ledIndex = 12; } annet {retur; } if (weatherDesc == "Clear") {// gul for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // gul stripe. vis (); forsinkelse (20); }} annet hvis (weatherDesc == "Skyer") {// grå for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // grå stripe. vis (); forsinkelse (20); }} annet hvis (weatherDesc == "Snow") {// hvit for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // hvit strip.show (); forsinkelse (20); }} annet hvis (weatherDesc == "Rain") {// blått for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // blå stripe. vis (); forsinkelse (20); }} annet {// rød for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // rød strip.show (); forsinkelse (20); }}}

Når du har fått alt lagt til i Arduino -filen, kompilerer du den. Hvis det ikke er noen feil, kan du blinke koden til den første foton. Det neste trinnet gir deg en lignende kode som skal blinkes på den andre fotonen.

Trinn 9: Programmeringen fortsetter

Fordi koden for den andre fotonen er nesten identisk med den for den første, blir hele koden kopiert og limt inn nedenfor:

#inkludere "ArduinoJson.h"

Servo servoLeftRight_3;

Servo servoUpDown_3;

int positionLeftRight_3 = 45;

int positionUpDown_3 = 0; int leftRight_3 = 1; int upDown_3 = 1;

const size_t bufferSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JSON_OBJECT_SIZE (5) + JSON_OON (3) + 6)

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

String weatherArray [3];

flytemperaturArray [3]; flyte fuktighetArray [3]; float windSpeedArray [3]; Tidsstempel for strengerArray [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 dager

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Timer timerWeatherCurrent (60000, getCurrentWeather);

void changeLeftRight3 () {

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

void changeUpDown3 () {

hvis (upDown_3) {positionUpDown_3 ++; if (positionUpDown_3> upDownMaxDegree [2]) {upDown_3 = 0; }} annet {positionUpDown_3--; hvis (positionUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (positionUpDown_3); }

Timer timerLeftRight3 (100, changeLeftRight3);

Timer timerUpDown3 (10, changeUpDown3);

ugyldig oppsett () {

// start værtimerne timerWeatherForecast.start (); timerWeatherCurrent.start (); // Sett initialisering som pinMode og start funksjonene her. // Sett opp Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // initialiser servoposisjon

servoUpDown_3.write (positionUpDown_3); // initialiser servoposisjon

timerLeftRight3.start ();

timerUpDown3.start (); // Åpne en konsoll Serial.begin (9600); forsinkelse (2000); Serial.println ("Hei!"); // Abonner på get_weather5DayForecast og 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 *hendelse, const char *data)

{allData5DaysForecast += data; // lagrer alle dataene i en streng. int allData5DaysForecastLen = allData5DaysForecast.length (); røyebuffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // lag en buffer for strengen int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); //Serial.println(allData5DaysForecast); // Test om analysering lykkes. if (! root.success ()) {//Serial.println("Parsing for værmelding 5 dager … FEIL! "); komme tilbake; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; flyte temperatur = main ["temp"]; int fuktighet = main ["fuktighet"]; JsonObject & weather = currentObject ["weather"] [0]; const char* weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; fuktighetArray = fuktighet; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = tidsstempel; i ++; } annet {pause; }}}

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

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); //Serial.println(data); // Test om analysering lykkes. if (! root.success ()) {//Serial.println("Parsing for nåværende vær … FEIL! "); komme tilbake; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["fuktighet"]; 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; fuktighetArray [0] = hoved_fuktighet; windSpeedArray [0] = vindhastighet; timestampArray [0] = tidsstempel; }

int updateUpDown (flytetid) {

// Kartlegg graden til et område på [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("ny servo grad:"); Serial.println (servoMaxDegree); returner servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Kart vindhastigheten til et område på [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("ny servo inkrement verdi:"); Serial.println (servoIncrement); retur servoIncrement; }

int convertToFahrenheit (float tempKel) {

int tempFah = tempKel * 9,0 / 5,0 - 459,67; retur tempFah; }

Du gjorde det! Du har kommet deg gjennom programmeringsdelen av prosjektet! Sørg for å gjøre alle ledninger og tilkoblinger fra servomotorer og neopiksler til brødbrettet og mikrokontrollerne. MERK: sett inn de ekstra pluggene/spisepinnene gjennom de vertikale spaltene på boksene for venstre og høyre bevegelse av kroppen. Den andre enden skal være koblet til dragen av kroppen.

Trinn 10: Nyt dragen din

Gratulerer! Du har bygget en Sinus-drage fra bunnen av! Alt du trenger å gjøre er å lene deg tilbake og nyte omgivelsesvisningen!

MERK: Dette prosjektet ble bygget som en del av et kurs av Joan Bempong og Soundarya Muthuvel. Kurs -siden finner du her.

Anbefalt: