Indholdsfortegnelse:

Sinusdrage: 10 trin (med billeder)
Sinusdrage: 10 trin (med billeder)

Video: Sinusdrage: 10 trin (med billeder)

Video: Sinusdrage: 10 trin (med billeder)
Video: Squid game #shorts 2024, Juli
Anonim
Sinusdrage
Sinusdrage

Sine-ese Dragon er en stemningsfuld boligindretning, der anvender mekaniske bevægelser og lys til at fortælle dig vejrudsigten for de næste tre timers intervaller. Per definition beskriver ambient de umiddelbare omgivelser ved noget; derfor blev det besluttet at være passende at indarbejde vejrdata i et omgivende display. Vejret er et aspekt, der utilsigtet ændrer folks dag og er et stykke information, der konstant ændrer sig hvert minut eller endda ned til det andet.

Den kinesiske drage er "et symbol på magt, styrke og held og lykke" og holdes ofte med en høj kulturel og traditionel værdi på tværs af det asiatiske subkontinent. Udover at bringe lykke til siges det også, at den kinesiske drage har stærke kræfter, der styrer "vand, nedbør, tyfoner og oversvømmelser." I sidste ende blev den kinesiske drage anset for passende at repræsentere vejrdata.

Visualisering

Sine-ese Dragon manipuleres på seks hovedpunkter på tre separate sektioner, der repræsenterer vejrudsigten i tre 3 timers intervaller. For hvert 3-timers interval vil følgende oplysninger blive inkluderet:

  • Vejrbeskrivelse - bestemmer farven på den aktuelle vejrinformation.
  • Temperatur - angiver kroppens højde
  • Fugtighed - blinkende LED -segmenter
  • Vindhastighed - styrer hastigheden på kroppen, der bevæger sig til venstre og højre.

Materialer påkrævet

  1. 3 mm krydsfiner/pap
  2. 5 mm træpinde eller spisepinde
  3. 2 partikelfotoner
  4. 3 slank legetøj
  5. 6 servomotorer
  6. NeoPixel -lys (enten en streng eller individuelle lys syet sammen)
  7. Masser af superlim
  8. Ledende tråd
  9. Akrylmaling
  10. Dekorativt stof
  11. Laserskærer
  12. 3D printer

Trin 1: Op og ned

Op og ned!
Op og ned!
Op og ned!
Op og ned!
Op og ned!
Op og ned!

Dit allerførste skridt til at bygge den Sinus-drage er at konstruere den komponent, der styrer op og ned bevægelse af kroppen. Hvor spændende!

  1. Download Adobe Illustrator -filerne (.ai) og udskriv dem ved hjælp af en laserskæremaskine.

    upDownBoxWithPlatform.ai skal udskrives på et pap

  2. Download 3D -udskrivningsfilerne (.stl), og brug din yndlings 3D -printer til at udskrive dem.

    Farven er ligegyldig for disken eller diskturneren. I det andet billede er disketurneren indsat inde i diskens hul

  3. Saml de to første komponenter og lim dem sammen som vist på billederne 3 til 5.

    1. Platformen
    2. Rillerne til skiven
  4. Saml nu kassen ved at følge nedenstående tips.

    1. Servoens ledninger skal gå gennem den rektangulære åbning på siden af kassen.
    2. Den korteste ende af diskturneren bliver fastgjort til servohovedet, og den længere ende går gennem hullet på den anden side af kassen med et cirkulært hul på det. Dette er vist på billede 6.
  5. Nu har vi brug for noget for at sikre, at platformen forbliver i vater, når disken drejes. Skær spisepinden i 75 mm lange pinde (billede 7) og lim dem gennem toppen af kassen ind i toppen af platformen med varm lim. Sørg for, at stængerne er udjævnet 90 grader i forhold til platformen.
  6. Sæt en 212 mm lang pind i det midterste hul på toppen af kassen på platformen.

Sød! Nu har du en komplet kasse (billede 8) til dragen op og ned. Gentag nu ovenstående trin to gange mere!

Trin 2: Hvad med venstre og højre ?

Hvad med venstre og højre ?!
Hvad med venstre og højre ?!
Hvad med venstre og højre ?!
Hvad med venstre og højre ?!
Hvad med venstre og højre ?!
Hvad med venstre og højre ?!
Hvad med venstre og højre ?!
Hvad med venstre og højre ?!

Nu kan vi ikke glemme den venstre og højre bevægelse af den sinusiske drage, kan vi? Lad os springe ind i det andet trin!

  1. Download Adobe Illustrator -filerne (.ai) og udskriv dem ved hjælp af en laserskæremaskine.

    1. leftRightBoxWithPlatforms.ai skal udskrives på et pap.
    2. armTurner.ai -filen skal udskrives på et materiale, der er 3 mm tykt.
  2. Download 3D -udskrivningsfilerne (.stl), og brug din yndlings 3D -printer til at udskrive dem.

    Sørg for at printe to af armene! Farven er ligegyldig her

  3. Saml de to platforme sammen som vist på billede 3 ved hjælp af varm lim.
  4. Sæt æsken sammen. Selvom det kan være svært at gøre det, er det lettere at opnå ved at:

    1. Indsætning af de to platforme mellem de to store slidser på hver side af kassen.
    2. Placering af den første arm på toppen af den øverste platform.
    3. Tråd i armdrejeren gennem armen og derefter den øverste platform.
    4. Placering af den anden arm på toppen af den nederste platform.
    5. Trådarmsvenderen gennem den anden arm og derefter bundplatformen.
    6. Stikker armvenderen gennem den rektangulære åbning af den 3D -trykte armsvender.
    7. Den anden ende af drejeren går oven på servomotoren.
    8. Føj de øverste, nederste og bageste stykker til æsken.

Din endelige samlede kasse skal ligne det sjette billede. Nu skal du gentage det to gange mere!

Ved afslutningen af dette trin skal du have seks kasser med tre hver af op/ned og venstre/højre bevægelsessystemer.

Trin 3: Hold kroppen op … HVORDAN?

Holder kroppen op … HVORDAN?
Holder kroppen op … HVORDAN?

Godt spørgsmål! Det er, når de 3D -udskrevne glatte holdere kommer ind. Download den medfølgende.stl -fil, og udskriv den ved hjælp af en 3D -printer. Sørg for at printe 6 holdere i alt til de 6 forskellige kasser.

Hvis du har set billedet af den slankede holder ovenfor, er overraskelsen ødelagt - det er farven på vores Sinese -Dragon!

Trin 4: Men de kasser er ikke så smukke …

Og jeg er enig! Det er derfor, vi vil bruge en laserskærer til at skære en meget mere attraktiv kasse for at indeholde alle disse kasser og skjule dem.

Download disse Adobe Illustrator -filer, og skær dem ud ved hjælp af laserskæreren. Skydesignet blev håndtegnet af en af bidragyderne. Du er velkommen til at ændre dem ved at fjerne dem inde i illustratorfilen og tilføje dit eget design, som du finder passende! Nedenfor er de foreslåede trin til at sætte alt sammen.

  1. Saml og lim alle tre stykker fra den første fil (ydreBoxFinal_1) sammen.
  2. Tilføj ikke stykket fra den anden fil (outerBoxFinal_2) endnu.
  3. Læg stykket fra den tredje fil (ydreBoxFinal_3) til bunden af kassen, og det skal lukke øverst. Lim KUN i bunden af æsken.
  4. Udskriv indre boksePlatform to gange. Lim de to stykker, der har store rektangelhuller i dem sammen. Lim derefter tre af de resterende stykker sammen. Lim det til sidst til det andet limede sæt med huller i.
  5. Placer platformen i bunden af den store kasse.
  6. Indsæt alle 6 mindre kasser på deres tilsvarende steder på platformen.
  7. Placer nu stykket fra den anden fil (ydreBoxFinal_2) på toppen af æsken og lim rundt om kanten. Hullerne på det øverste stykke skal flugte med hullerne på de mindre kasser. Hvis ikke, skal du omarrangere dine mindre kasser. Tilføj slet ikke lim til de mindre kasser.
  8. Hvis du bruger et brødbræt, der har et klæbrigt stykke i bunden, skal du placere dette nær midten af bundstykket på et sted, at når du lukker kassen, skal brødbrættet sammen med fotonerne forsvinde. Der er små slidser på bundstykket, der gør det lettere for dig at oprette forbindelse til fotoner udefra.

Trin 5: Slinky Legetøj ?? Åh min

Slank Legetøj ?? Åh min!
Slank Legetøj ?? Åh min!
Slank Legetøj ?? Åh min!
Slank Legetøj ?? Åh min!

Dragens krop:

1. Kombiner tre slinkies sammen ved hjælp af varm lim eller tape.

2. Mål længden og diameteren på slinkies og skær et stykke dekorativt stof.

3. Tag de to ender af stoffet med, og sy dem sammen.

4. Når du er færdig med at sy dem, skal du skubbe slinkies ind som en strømpe.

5. Sy enderne af det slanke til det syede stof.

Trin 6: Udskriv din drage

3D -printede dele af dragen:

1. Delene blev taget fra

2. Vi brugte kun hoved, ben og øjne.

3. Efter 3D -udskrivning af delen glattes den ud med sandpapir og acetone.

4. Mal delene, som du ønsker at dekorere det.

Trin 7: Tid til at opgradere din drage med NeoPixels

Tid til at forstærke din drage med NeoPixels!
Tid til at forstærke din drage med NeoPixels!
Tid til at forstærke din drage med NeoPixels!
Tid til at forstærke din drage med NeoPixels!

Let segment:

1. Du kan simpelthen bruge en neopixel streng til at oprette lysene, hvis du ønsker det. (Vi løb tør for trådene).

2. Vi brugte 20 neopixellys og tilsluttede dem ved hjælp af ledninger. Disse ledninger blev loddet på dem og forbundet til foton ved hjælp af røde ledninger, så det matcher temaet for dragen.

3. Du kan også sy dine neopixellamper på et langt stykke klud, men vi brugte dem ikke, fordi vi havde en slanky lavet af metal.

Montering af delene: Fastgør lyssegmentet inde i dragens krop ved hjælp af tråde eller ledninger. Sørg for, at du er i stand til at slutte lysene til fotonet inde i basisboksen. Fastgør hovedet, benene og halen til kroppen ved hjælp af lim. Når de er på plads, skal du fastgøre kroppen i de glatte holdere, vi har printet før. Nu er kroppen klar til at blive programmeret.

Trin 8: Programmeringstid

Da vi vil bruge to partikelfotoner til at arbejde med seks separate servomotorer (en foton kan kun fungere med fire), skriver vi to separate, men lignende koder, der skal blinkes på mikrokontrollerne.

Nu til den første mikrokontroller …

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

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Angiv derefter 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; // skal være mellem 0 og 180 (i grader) int positionUpDown_2 = 180; // skal være mellem 0 og 180 (i grader) int leftRight_2 = 1; // 0 = venstre, 1 = højre int upDown_2 = 1; // 0 = op, 1 = ned konstant 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) + 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 (JOHN) (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; float temperatureArray [3]; flyde fugtighedArray [3]; float windSpeedArray [3]; String tidsstempelArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Klik her for at lære, hvordan du konfigurerer webhooks. Når du er færdig, skal du tilføje følgende erklæringer og funktioner og foretage passende ændringer, hvis det er nødvendigt:

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

Følgende funktioner styrer op/ned og venstre/højre bevægelse af dragen:

void changeLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; hvis (positionLeftRight_1> 100) {leftRight_1 = 0; }} else {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; hvis (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }

void changeLeftRight2 () {

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

void changeUpDown1 () {

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

void changeUpDown2 () {

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

For at kunne ændre bevægelserne i et interval, oprettes timere.

Timer timerLeftRight1 (100, changeLeftRight1);

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

Opsætningsfunktionen tilføjes endelig derefter. Sørg for at foretage passende ændringer af kodelinjerne, der omhandler webhooks.

void setup () {// start vejretimerne timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Sæt initialisering som pinMode og start funktioner her. // Opsætning af Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // initialiser servoposition servoUpDown_1.write (positionUpDown_1); // initialiser servoposition servoLeftRight_2.write (positionLeftRight_2); // initialiser servoposition servoUpDown_2.write (positionUpDown_2); // initialiser servopositionstimerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Åbn en konsol Serial.begin (9600); forsinkelse (2000); Serial.println ("Hej!"); // 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 -funktion bruges ikke til dette projekt. Vi kan ikke glemme funktionerne til at håndtere data modtaget fra webhooks!

void gotWeather5DayForecast (const char *event, const char *data) {allData5DaysForecast += data; // gemmer alle data i en streng. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // opret en buffer til strengen int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); // Test om parsing lykkes. hvis (! root.success ()) {//Serial.println("Parsing for vejrprognose 5 dages vejrudsigt … FEJL! "); Vend tilbage; } int i = 1; JsonArray & list = root ["liste"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; flyde temperatur = main ["temp"]; int fugtighed = main ["fugtighed"]; JsonObject & weather = currentObject ["weather"] [0]; const char* weatherInfo = vejr ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* tidsstempel = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; moistArray = fugtighed; weatherArray = weatherInfo; windSpeedArray = windSpeed; tidsstempelArray = tidsstempel; i ++; } andet {pause; }}}

void gotCurrentWeatherData (const char *event, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); // Test om parsing lykkes. if (! root.success ()) {//Serial.println("Parsing for aktuelt vejr … FEJL! "); Vend tilbage; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = vejr ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["fugtighed"]; float wind_speed = root ["vind"] ["hastighed"]; const char* tidsstempel = root ["dt_txt"]; int tempFah = convertToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = servoIncrement; setColor (vejr_main, 0); weatherArray [0] = vejr_main; temperatureArray [0] = tempFah; moistArray [0] = hoved_fugtighed; windSpeedArray [0] = vindhastighed; tidsstempelArray [0] = tidsstempel; }

Nedenfor kan du finde yderligere funktioner, der styrer opdateringen af servomotorernes positioner, konvertering af temperatur fra Kelvin til Fahrenheit og indstilling af farverne på lysdioderne.

int updateUpDown (float temp) {// Map 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) {

// Kort vindhastigheden til et område på [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("ny servo -stigningsværdi:"); Serial.println (servoIncrement); returner 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; } ellers hvis (indeks == 1) {ledIndex = 6; } ellers hvis (indeks == 2) {ledIndex = 12; } andet {return; } hvis (weatherDesc == "Clear") {// gul for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // gul strimmel.vis (); forsinkelse (20); }} ellers hvis (weatherDesc == "Clouds") {// grå for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // grå strip.show (); forsinkelse (20); }} ellers hvis (weatherDesc == "Snow") {// hvid for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // hvid strip.show (); forsinkelse (20); }} ellers hvis (weatherDesc == "Rain") {// blå for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // blå strip.show (); forsinkelse (20); }} andet {// 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 tilføjet alt til din Arduino -fil, skal du kompilere den. Hvis der ikke er nogen fejl, skal du blinke koden til den første foton. Det næste trin giver dig en lignende kode, der skal blinkes på den anden foton.

Trin 9: Programmeringen fortsætter

Fordi koden for den anden foton er næsten identisk med den for den første, kopieres og indsættes hele koden herunder:

#include "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_SON (3) + JSON_SON (3) + 6)

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

String weatherArray [3];

float temperatureArray [3]; flyde fugtighedArray [3]; float windSpeedArray [3]; String tidsstempelArray [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 dage

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 ++; hvis (positionUpDown_3> upDownMaxDegree [2]) {upDown_3 = 0; }} andet {positionUpDown_3--; hvis (positionUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (positionUpDown_3); }

Timer timerLeftRight3 (100, changeLeftRight3);

Timer timerUpDown3 (10, changeUpDown3);

ugyldig opsætning () {

// start vejretimerne timerWeatherForecast.start (); timerWeatherCurrent.start (); // Sæt initialisering som pinMode og start funktioner her. // Opsætning af Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // initialiser servoposition

servoUpDown_3.write (positionUpDown_3); // initialiser servoposition

timerLeftRight3.start ();

timerUpDown3.start (); // Åbn en konsol Serial.begin (9600); forsinkelse (2000); Serial.println ("Hej!"); // 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 *hændelse, const char *data)

{allData5DaysForecast += data; // gemmer alle data i en streng. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // opret en buffer til strengen int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); //Serial.println(allData5DaysForecast); // Test om parsing lykkes. hvis (! root.success ()) {//Serial.println("Parsing for vejrprognose 5 dages vejrudsigt … FEJL! "); Vend tilbage; } int i = 1; JsonArray & list = root ["liste"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; flyde temperatur = main ["temp"]; int fugtighed = main ["fugtighed"]; JsonObject & weather = currentObject ["weather"] [0]; const char* weatherInfo = vejr ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char* tidsstempel = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; moistArray = fugtighed; weatherArray = weatherInfo; windSpeedArray = windSpeed; tidsstempelArray = tidsstempel; i ++; } andet {pause; }}}

void gotCurrentWeatherData (const char *hændelse, const char *data)

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); //Serial.println(data); // Test om parsing lykkes. if (! root.success ()) {//Serial.println("Parsing for aktuelt vejr … FEJL! "); Vend tilbage; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = vejr ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["fugtighed"]; float wind_speed = root ["vind"] ["hastighed"]; const char* tidsstempel = 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] = vejr_main; temperatureArray [0] = tempFah; moistArray [0] = hoved_fugtighed; windSpeedArray [0] = vindhastighed; tidsstempelArray [0] = tidsstempel; }

int updateUpDown (float temp) {

// Kortlæg 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) {

// Kort vindhastigheden til et område på [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("ny servo -stigningsværdi:"); Serial.println (servoIncrement); returner servoIncrement; }

int convertToFahrenheit (float tempKel) {

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

Du gjorde det! Du har nået det gennem programmeringsafsnittet i projektet! Sørg nu for at foretage alle ledninger og forbindelser fra servomotorer og neopixel til brødbrættet og mikrokontroller. BEMÆRK: Sæt de ekstra dyvler/spisepinde gennem de lodrette slidser på kasserne til venstre og højre bevægelse af kroppen. Den anden ende skal forbindes til dragens krop.

Trin 10: Nyd din drage

Tillykke! Du har bygget en Sinus-drage fra bunden! Det eneste du skal gøre er at læne dig tilbage og nyde dit omgivende display!

BEMÆRK: Dette projekt blev bygget som en del af et kursusarbejde af Joan Bempong og Soundarya Muthuvel. Kursus -siden findes her.

Anbefalede: