Inhoudsopgave:

Sine-ese Dragon - Ajarnpa
Sine-ese Dragon - Ajarnpa

Video: Sine-ese Dragon - Ajarnpa

Video: Sine-ese Dragon - Ajarnpa
Video: Imagine Dragons - Natural 2024, Juli-
Anonim
Sine-ese Dragon
Sine-ese Dragon

Sine-ese Dragon is een sfeervol interieurstuk dat gebruik maakt van mechanische bewegingen en lichten om je de weersvoorspelling voor de komende drie intervallen van drie uur te vertellen. Ambient beschrijft per definitie de directe omgeving van iets; daarom werd besloten om de weergegevens op te nemen in een omgevingsdisplay. Het weer is een aspect dat onbedoeld de dag van mensen verandert en is een stukje informatie dat elke minuut of zelfs tot op de seconde verandert.

De Chinese draak is "een symbool van macht, kracht en geluk" en wordt vaak op een hoge culturele en traditionele waarde gehouden op het Aziatische subcontinent. Naast het brengen van geluk, zou de Chinese draak ook krachtige krachten hebben die "water, regenval, tyfoons en overstromingen" beheersen. Uiteindelijk werd de Chinese draak geschikt geacht om weergegevens weer te geven.

visualisatie

De Sine-ese Dragon wordt gemanipuleerd op zes hoofdpunten in drie afzonderlijke secties die de weersvoorspelling vertegenwoordigen voor drie intervallen van 3 uur. Voor elk interval van 3 uur wordt de volgende informatie opgenomen:

  • Weerbeschrijving - bepaalt de kleur van de huidige weersinformatie.
  • Temperatuur - specificeert de hoogte van het lichaam
  • Vochtigheid - knipperen van LED-segmenten
  • Windsnelheid - regelt de snelheid van het lichaam dat naar links en rechts beweegt.

Vereiste materialen

  1. 3 mm multiplex/karton
  2. 5 mm houten deuvels of eetstokjes
  3. 2 deeltjesfotonen
  4. 3 Slinky-speeltjes
  5. 6 servomotoren
  6. NeoPixel-lampen (een streng of individuele lampen aan elkaar genaaid)
  7. Veel superlijm
  8. Geleidende draad
  9. Acrylverf
  10. Decoratieve stof
  11. Lasersnijder
  12. 3D-printer

Stap 1: Op en neer

Omhoog en omlaag!
Omhoog en omlaag!
Omhoog en omlaag!
Omhoog en omlaag!
Omhoog en omlaag!
Omhoog en omlaag!

Je allereerste stap bij het bouwen van de Sine-ese Dragon is het bouwen van het onderdeel dat de op- en neergaande beweging van het lichaam regelt. Wat spannend!

  1. Download de Adobe Illustrator-bestanden (.ai) en print ze uit met een lasersnijmachine.

    upDownBoxWithPlatform.ai moet op karton worden afgedrukt

  2. Download de 3D-afdrukbestanden (.stl) en gebruik uw favoriete 3D-printer om ze af te drukken.

    De kleur maakt niet uit voor de schijf of de schijvendraaier. In de tweede afbeelding is de schijfdraaier in het gat van de schijf gestoken

  3. Monteer de eerste twee componenten en lijm ze aan elkaar zoals getoond in afbeeldingen 3 tot 5.

    1. Het platform
    2. De groeven voor de schijf
  4. Stel nu de doos samen volgens de onderstaande tips.

    1. De draden van de servo moeten door de rechthoekige opening aan de zijkant van de doos gaan.
    2. Het kortste uiteinde van de schijfdraaier wordt aan de servokop bevestigd en het langere uiteinde gaat door het gat aan de andere kant van de doos met een rond gat erop. Dit wordt gedemonstreerd in afbeelding 6.
  5. Nu hebben we iets nodig om ervoor te zorgen dat het platform waterpas blijft wanneer de schijf wordt gedraaid. Snijd de eetstokjes in 75 mm lange stokjes (afbeelding 7) en lijm ze door de bovenkant van de doos in de bovenkant van het platform met behulp van hete lijm. Zorg ervoor dat de stokken in een hoek van 90 graden ten opzichte van het platform zijn uitgelijnd.
  6. Steek een 212 mm lange stok in het middelste gat aan de bovenkant van de doos op het platform.

Lief hoor! Nu heb je een complete doos (foto 8) voor de op en neer beweging van de draak. Herhaal de bovenstaande stappen nu nog twee keer!

Stap 2: Hoe zit het met links en rechts?

Hoe zit het met links en rechts?!
Hoe zit het met links en rechts?!
Hoe zit het met links en rechts?!
Hoe zit het met links en rechts?!
Hoe zit het met links en rechts?!
Hoe zit het met links en rechts?!
Hoe zit het met links en rechts?!
Hoe zit het met links en rechts?!

Nu kunnen we de beweging naar links en rechts van de Sine-ese draak niet vergeten, toch? Laten we naar de tweede stap springen!

  1. Download de Adobe Illustrator-bestanden (.ai) en print ze uit met een lasersnijmachine.

    1. leftRightBoxWithPlatforms.ai moet op karton worden afgedrukt.
    2. armTurner.ai-bestand moet worden afgedrukt op materiaal met een dikte van 3 mm.
  2. Download de 3D-afdrukbestanden (.stl) en gebruik uw favoriete 3D-printer om ze af te drukken.

    Zorg ervoor dat je twee van de armen afdrukt! De kleur maakt hier niet uit

  3. Monteer de twee platforms samen zoals weergegeven in afbeelding 3 met behulp van hete lijm.
  4. Zet de doos in elkaar. Hoewel het lastig kan zijn om dit te doen, is het gemakkelijker te bereiken door:

    1. De twee platforms tussen de twee grote spleten aan weerszijden van de doos plaatsen.
    2. Het plaatsen van de eerste arm op de bovenkant van het bovenste platform.
    3. De armdraaier door de arm halen en vervolgens door het bovenste platform.
    4. Het plaatsen van de tweede arm op de bovenkant van het onderste platform.
    5. De armdraaier door de tweede arm en vervolgens door het onderste platform halen.
    6. De armturner door de rechthoekige opening van de 3D-geprinte armturner steken.
    7. Het andere uiteinde van de draaier gaat bovenop de servomotor.
    8. Voeg de boven-, onder- en achterkant toe aan de doos.

Je uiteindelijke geassembleerde doos zou eruit moeten zien als de zesde afbeelding. Nu mag je dat nog twee keer herhalen!

Aan het einde van deze stap zou je zes dozen moeten hebben met elk drie op/neer en links/rechts bewegingssystemen.

Stap 3: Het lichaam vasthouden… HOE?

Het lichaam vasthouden… HOE?
Het lichaam vasthouden… HOE?

Goede vraag! Dat is wanneer die 3D-geprinte slinky-houders binnenkomen. Download het meegeleverde.stl-bestand en print het met een 3D-printer. Zorg ervoor dat u in totaal 6 houders bedrukt voor de 6 verschillende dozen.

Als je de afbeelding van de slinky houder hierboven hebt gezien, is de verrassing verpest - dat is de kleur van onze Sine-ese Dragon!

Stap 4: Maar die dozen zijn niet zo mooi…

En ik ga akkoord! Daarom gaan we een lasersnijder gebruiken om een veel mooiere doos te snijden om al die dozen te bevatten en ze te verbergen.

Download die Adobe Illustrator-bestanden en knip ze uit met de lasersnijder. Het wolkenontwerp is met de hand getekend door een van de medewerkers. Voel je vrij om ze aan te passen door ze in het illustratorbestand te verwijderen en je eigen ontwerp toe te voegen zoals je wilt! Hieronder staan de voorgestelde stappen om alles in elkaar te zetten.

  1. Monteer en lijm alle drie de stukken uit het eerste bestand (outerBoxFinal_1) aan elkaar.
  2. Voeg het stuk uit het tweede bestand (outerBoxFinal_2) nog niet toe.
  3. Leg het stuk uit het derde bestand (outerBoxFinal_3) naar de onderkant van de doos en het moet bovenaan sluiten. Lijm ALLEEN op de bodem van de doos.
  4. Print innerBoxesPlatform twee keer. Lijm de twee stukken met grote rechthoekige gaten erin aan elkaar. Lijm vervolgens drie van de resterende stukken aan elkaar. Lijm het tenslotte op de andere gelijmde set met gaten erin.
  5. Plaats het platform op de bodem van de grote doos.
  6. Plaats alle 6 kleinere dozen in hun corresponderende plekken op het platform.
  7. Plaats nu het stuk uit het tweede bestand (outerBoxFinal_2) op de bovenkant van de doos en lijm rond de rand. De gaten in het bovenste stuk moeten uitgelijnd zijn met de gaten in de kleinere dozen. Als dat niet het geval is, herschikt u uw kleinere dozen. Voeg helemaal geen lijm toe aan de kleinere dozen.
  8. Als je een breadboard gebruikt met een plakkerig stuk aan de onderkant, plaats dit dan in de buurt van het midden van het onderste stuk op een plaats waar wanneer je de doos sluit, het breadboard samen met de fotonen zou moeten verdwijnen. Er zijn kleine spleten op het onderste stuk waardoor u gemakkelijker van buitenaf verbinding kunt maken met de fotonen.

Stap 5: Slinky Toys?? Oh mijn

Slinks speelgoed?? Oh mijn!
Slinks speelgoed?? Oh mijn!
Slinks speelgoed?? Oh mijn!
Slinks speelgoed?? Oh mijn!

Lichaam van de draak:

1. Combineer drie slinkies met hete lijm of tape.

2. Meet de lengte en diameter van de slinkies en knip een stuk decoratieve stof af.

3. Breng de twee uiteinden van de stof samen en naai ze aan elkaar.

4. Als je klaar bent met naaien, schuif je de slinkies naar binnen als een sok.

5. Naai de uiteinden van de slinky aan de genaaide stof.

Stap 6: Print je draak

3D-geprinte delen van de draak:

1. De onderdelen zijn afkomstig van

2. We gebruikten alleen het hoofd, de benen en de ogen.

3. Na het 3D-printen van het onderdeel, maakt u het glad met schuurpapier en aceton.

4. Verf de onderdelen zoals je ze wilt decoreren.

Stap 7: Tijd om je draak te versterken met NeoPixels

Tijd om je draak te versterken met NeoPixels!
Tijd om je draak te versterken met NeoPixels!
Tijd om je draak te versterken met NeoPixels!
Tijd om je draak te versterken met NeoPixels!

Lichtsegment:

1. Je kunt eenvoudig een neopixel-streng gebruiken om de lichten te maken als je dat wilt. (We hadden geen strengen meer).

2. We gebruikten 20 neopixel-lampen en verbonden ze met draden. Deze draden werden erop gesoldeerd en met rode bedrading verbonden met het foton, zodat het past bij het thema van de draak.

3. Je kunt je neopixel-lampen ook op een lang stuk stof naaien, maar we hebben ze niet gebruikt omdat we een slinky van metaal hadden.

Montage van de onderdelen: Zet het lichtsegment vast in het lichaam van de draak met behulp van draden of draden. Zorg ervoor dat u de lichten kunt aansluiten op het foton in de basisdoos. Bevestig het hoofd, de poten en de staart met lijm aan het lichaam. Zodra ze op hun plaats zitten, bevestigt u het lichaam in de slinky houders die we eerder hebben afgedrukt. Nu is het lichaam klaar om geprogrammeerd te worden.

Stap 8: Programmeertijd

Aangezien we twee deeltjesfotonen zullen gebruiken om met zes afzonderlijke servomotoren te werken (één foton kan slechts met vier werken), zullen we twee afzonderlijke maar vergelijkbare codes schrijven die op de microcontrollers moeten worden geflitst.

Nu, voor de eerste microcontroller…

Neem in een Arduino-bestand (.ino) de volgende bibliotheken en definities op:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Declareer vervolgens de volgende variabelen:

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN);

Servo servoLeftRight_1; Servo servoUpDown_1; Servo servoLinksRechts_2; Servo servoUpDown_2; int positieLinksRechts_1 = 0; int positionUpDown_1 = 0; int leftRight_1 = 1; int upDown_1 = 1; int positionLeftRight_2 = 100; // moet tussen 0 en 180 (in graden) liggen int positionUpDown_2 = 180; // moet tussen 0 en 180 (in graden) zijn int leftRight_2 = 1; //0=links, 1=rechts int upDown_2 = 1; //0=omhoog, 1=omlaag 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) + JSIZE_OBJECT_JSIZE(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_4) + JECT_JSIZE_(4) (5) + 76*JSON_OBJECT_SIZE(8) + 12490; String weerArray[3]; vlottertemperatuurArray[3]; float vochtigheidArray[3]; float windSpeedArray[3]; TekenreekstijdstempelArray[3]; int upDownMaxDegree[3]; int leftRightSpeed[3]; Tekenreeks allData5DaysForecast;

Klik hier om te leren hoe u webhooks instelt. Als u klaar bent, voegt u de volgende verklaringen en functies toe en brengt u indien nodig de nodige wijzigingen aan:

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

De volgende functies regelen de op/neer en links/rechts bewegingen van de draak:

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

ongeldige wijzigingLeftRight2() {

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

ongeldige wijzigingUpDown1() {

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

ongeldige wijzigingUpDown2() {

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

Om de bewegingen in een interval te kunnen veranderen, worden timers aangemaakt.

Timer timerLeftRight1(100, changeLeftRight1);

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

De setup-functie wordt tenslotte als volgende toegevoegd. Zorg ervoor dat u de nodige wijzigingen aanbrengt in de coderegels die te maken hebben met webhooks.

void setup () { // start de weertimers timerWeatherForecast.start (); timerWeerHuidige.start(); //Neopixels strip.begin(); // Zet initialisatie zoals pinMode en begin hier met functies. // Stel de Micro Servo servoLeftRight_1.attach (D1) in; servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write(positionLeftRight_1); // initialiseer servopositie servoUpDown_1.write (positionUpDown_1); // initialiseer servopositie servoLeftRight_2.write (positionLeftRight_2); // initialiseer servopositie servoUpDown_2.write (positionUpDown_2); // initialiseer servopositie timerLeftRight1.start(); timerLinksRechts2.start(); timerUpDown1.start(); timerUpDown2.start(); // Open een console Serial.begin (9600); vertraging (2000); Serial.println("Hallo!"); // Abonneer je op de get_weather5DayForecast en get_currentWeather webhooks Particle.subscribe("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather(); getWeather5DayForecast(); }

Voor dit project wordt geen lusfunctie gebruikt. We mogen de functies voor het verwerken van de gegevens van de webhooks niet vergeten!

void gotWeather5DayForecast(const char *event, const char *data){ allData5DaysForecast += data; // slaat alle gegevens op in één string. int allData5DaysForecastLen = allData5DaysForecast.length(); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // maak een buffer voor de string int bufferLength = sizeof(buffer); DynamicJsonBuffer jsonBufferWeather (bufferlengte); JsonObject& root = jsonBufferWeather.parseObject(buffer); // Test of het parseren lukt. if (!root.success()) { //Serial.println("Ontleding voor weersvoorspelling voor 5 dagen…ERROR!"); opbrengst; } int ik = 1; JsonArray& list = root ["lijst"]; for (JsonObject& currentObject: lijst){ if (i < 3){ JsonObject& main = currentObject["main"]; vlottertemperatuur = hoofd["temp"]; int vochtigheid = belangrijkste ["vochtigheid"]; JsonObject& weather = currentObject["weer"][0]; const char* weatherInfo = weer["hoofd"]; float windSpeed = currentObject["wind"]["speed"]; const char* timestamp = currentObject["dt_txt"]; int tempFah = convertToFahrenheit(temperatuur); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight(windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, ik); temperatuurArray = tempFah; vochtigheidArray = vochtigheid; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = tijdstempel; i++; } anders{ breken; } } }

void gotCurrentWeatherData (const char * event, const char * data) { DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject& root = jsonBufferWeather.parseObject(data); // Test of het parseren lukt. if (!root.success()) { //Serial.println("Ontleding voor het huidige weer…ERROR!"); opbrengst; } JsonObject& weather = root["weer"][0]; const char* weather_main = weather["main"]; JsonObject& main = root ["hoofd"]; float main_temp = main["temp"]; int main_humidity = main["vochtigheid"]; float wind_speed = root["wind"]["snelheid"]; 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; temperatuurArray[0] = tempFah; vochtigheidArray[0]= main_humidity; windSpeedArray[0] = windsnelheid; timestampArray[0] = tijdstempel; }

Hieronder vindt u extra functies die het bijwerken van de servomotoren regelen, de temperatuuromrekening van Kelvin naar Fahrenheit en het instellen van de kleuren van de LED's.

int updateUpDown (float temp) {// Wijs de graad toe aan een bereik van [0, 180] float servoMaxDegree = temp * 45 / 31 + (990 / 31); Serial.print ("nieuwe servograad: "); Serial.println(servoMaxDegree); retour servoMaxDegres; }

int updateleftRight(zwevende windSnelheid){

// Breng de windsnelheid in kaart met een bereik van [1, 100] float servoIncrement = windSpeed * 99 / 26 + 1; Serial.print ("nieuwe servo-incrementwaarde: "); Serial.println(servoIncrement); retour servoIncrement; }

int convertToFahrenheit(float tempKel){

int tempFah = tempKel * 9,0 / 5,0 - 459,67; retour 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; } anders{ terugkeer; } if(weatherDesc == "Clear") {// geel voor (int j = ledIndex; j < ledIndex+6; j++) {strip.setPixelColor(j, strip. Color(253, 219, 62));// gele strook.show(); vertraging(20); } } else if(weatherDesc == "Clouds") {//grey for (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color (223, 229, 237)); //grijze strook.show(); vertraging(20); } } else if (weatherDesc == "Snow") { //white for (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(255, 225, 225)); //witte strook.show(); vertraging(20); } } else if (weatherDesc == "Rain"){//blue for (int j = ledIndex; j < ledIndex+6; j++){ strip.setPixelColor(j, strip. Color(119, 191, 246)); //blauwe strook.show(); vertraging(20); } } else{ //red for (int j = ledIndex; j <ledIndex+6; j++){ strip.setPixelColor(j, strip. Color (254, 11, 5));//red strip.show(); vertraging(20); } } }

Zodra je alles hebt toegevoegd aan je Arduino-bestand, compileer je het. Als er geen fouten zijn, ga je gang en flash de code naar de eerste Photon. De volgende stap geeft u een vergelijkbare code die op de tweede Photon moet worden geflitst.

Stap 9: Programmeren gaat door

Omdat de code voor de tweede Photon bijna identiek is aan die voor de eerste, wordt de volledige code hieronder gekopieerd en geplakt:

#include "ArduinoJson.h"

Servo servoLinksRechts_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_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_4) + JECT_JSIZE_(4) (5) + 76*JSON_OBJECT_SIZE(8) + 12490;

String weerArray[3];

vlottertemperatuurArray[3]; float vochtigheidArray[3]; float windSpeedArray[3]; TekenreekstijdstempelArray[3]; int upDownMaxDegree[3]; int leftRightSpeed[3];

Tekenreeks allData5DaysForecast;

void getWeather5DayForecast()

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

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

void getCurrentWeather()

{ Particle.publish("get_currentWeather2"); }

TimertimerWeatherCurrent(60000, getCurrentWeather);

ongeldige wijzigingLeftRight3() {

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

ongeldige wijzigingUpDown3() {

if (upDown_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);

ongeldige setup() {

// start de weertimers timerWeatherForecast.start(); timerWeerHuidige.start(); // Zet initialisatie zoals pinMode en begin hier met functies. // Stel de Micro Servo servoLeftRight_3.attach (D1) in; servoUpDown_3.attach (D0);

servoLeftRight_3.write(positionLeftRight_3); // initialiseer servopositie

servoUpDown_3.write(positionUpDown_3); // initialiseer servopositie

timerLinksRechts3.start();

timerUpDown3.start(); // Open een console Serial.begin (9600); vertraging (2000); Serial.println("Hallo!"); // Abonneer je op de get_weather5DayForecast en 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 += gegevens; // slaat alle gegevens op in één string. int allData5DaysForecastLen = allData5DaysForecast.length(); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // maak een buffer voor de string int bufferLength = sizeof(buffer); DynamicJsonBuffer jsonBufferWeather (bufferlengte); JsonObject& root = jsonBufferWeather.parseObject(buffer); //Serial.println(allData5DaysForecast); // Test of het parseren lukt. if (!root.success()) { //Serial.println("Ontleding voor weersvoorspelling voor 5 dagen…ERROR!"); opbrengst; } int ik = 1; JsonArray& list = root ["lijst"]; for (JsonObject& currentObject: lijst){ if (i < 3){ JsonObject& main = currentObject["main"]; vlottertemperatuur = hoofd["temp"]; int vochtigheid = belangrijkste ["vochtigheid"]; JsonObject& weather = currentObject["weer"][0]; const char* weatherInfo = weer["hoofd"]; float windSpeed = currentObject["wind"]["speed"]; const char* timestamp = currentObject["dt_txt"]; int tempFah = convertToFahrenheit(temperatuur); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight(windSpeed); leftRightSpeed = servoIncrement; temperatuurArray = tempFah; vochtigheidArray = vochtigheid; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = tijdstempel; i++; } anders{ breken; } } }

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

{ DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject& root = jsonBufferWeather.parseObject(data); //Serial.println(gegevens); // Test of het parseren lukt. if (!root.success()) { //Serial.println("Ontleding voor het huidige weer…ERROR!"); opbrengst; } JsonObject& weather = root["weer"][0]; const char* weather_main = weather["main"]; JsonObject& main = root ["hoofd"]; float main_temp = main["temp"]; int main_humidity = main["vochtigheid"]; float wind_speed = root["wind"]["snelheid"]; 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; temperatuurArray[0] = tempFah; vochtigheidArray[0]= main_humidity; windSpeedArray[0] = windsnelheid; timestampArray[0] = tijdstempel; }

int updateUpDown(float temp){

// Wijs de graad toe aan een bereik van [0, 180] float servoMaxDegree = temp * 45 / 31 + (990 / 31); Serial.print ("nieuwe servograad: "); Serial.println(servoMaxDegree); retour servoMaxDegres; }

int updateleftRight(zwevende windSnelheid){

// Breng de windsnelheid in kaart met een bereik van [1, 100] float servoIncrement = windSpeed * 99 / 26 + 1; Serial.print ("nieuwe servo-incrementwaarde: "); Serial.println(servoIncrement); retour servoIncrement; }

int convertToFahrenheit(float tempKel){

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

Je hebt het gedaan! Je bent door het programmeergedeelte van het project gekomen! Zorg er nu voor dat u alle bedrading en verbindingen van de servomotoren en neopixels naar het breadboard en de microcontrollers maakt. OPMERKING: steek de extra deuvels/eetstokjes door de verticale sleuven op de dozen voor de linker- en rechterbewegingen van het lichaam. Het andere uiteinde moet worden verbonden met het lichaam van de draak.

Stap 10: Geniet van je draak

Gefeliciteerd! Je hebt een Sine-ese Dragon helemaal opnieuw gebouwd! Nu hoef je alleen nog maar achterover te leunen en te genieten van je ambient display!

OPMERKING: Dit project is gebouwd als onderdeel van een cursus door Joan Bempong en Soundarya Muthuvel. De cursuspagina vind je hier.

Aanbevolen: