Innehållsförteckning:

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

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

Video: Sine-ese Dragon: 10 steg (med bilder)
Video: Imagine Dragons - Natural 2024, Juli
Anonim
Sinusdrake
Sinusdrake

Sine-ese Dragon är en ambient heminredning som använder mekaniska rörelser och ljus för att berätta väderprognosen för de kommande tre timmars intervallen. Per definition beskriver omgivningen någons närmaste omgivning; därför beslutades det att vara lämpligt att införliva väderdata i en omgivande display. Vädret är en aspekt som oavsiktligt förändrar människors dag och är en information som ständigt förändras varje minut, eller till och med ner till den andra.

Den kinesiska draken är "en symbol för makt, styrka och lycka" och hålls ofta med ett högt kulturellt och traditionellt värde över hela den asiatiska subkontinenten. Förutom att den lyckas, den kinesiska draken sägs också ha starka krafter som styr "vatten, nederbörd, tyfoner och översvämningar." I slutändan ansågs den kinesiska draken lämplig att representera väderdata.

Visualisering

Sinusdraken manipuleras vid sex huvudpunkter vid tre separata sektioner som representerar väderprognosen med tre 3 timmars intervall. För varje 3-timmars intervall kommer följande information att inkluderas:

  • Väderbeskrivning - bestämmer färgen på den aktuella väderinformationen.
  • Temperatur - anger kroppens höjd
  • Luftfuktighet - blinkande av LED -segment
  • Vindhastighet - styr hastigheten på kroppen som rör sig åt vänster och höger.

Material som krävs

  1. 3 mm plywood/kartong
  2. 5 mm träpinnar eller ätpinnar
  3. 2 partikelfoton
  4. 3 luddiga leksaker
  5. 6 servomotorer
  6. NeoPixel -lampor (antingen en tråd eller individuella lampor som sys ihop)
  7. Massor av superlim
  8. Ledande tråd
  9. Akrylfärg
  10. Dekorativt tyg
  11. Laserskärare
  12. 3d skrivare

Steg 1: Upp och ner

Upp och ner!
Upp och ner!
Upp och ner!
Upp och ner!
Upp och ner!
Upp och ner!

Ditt allra första steg för att bygga Sinus-draken är att konstruera den komponent som styr kroppens rörelse upp och ner. Så spännande!

  1. Ladda ner Adobe Illustrator -filerna (.ai) och skriv ut dem med en laserskärmaskin.

    upDownBoxWithPlatform.ai ska skrivas ut på en kartong

  2. Ladda ner 3D -utskriftsfilerna (.stl) och använd din favorit 3D -skrivare för att skriva ut dem.

    Färgen spelar ingen roll för disken eller skivomvändaren. I den andra bilden har skivomvändaren satts in i skivans hål

  3. Montera de två första komponenterna och limma ihop dem som visas på bilderna 3 till 5.

    1. Plattformen
    2. Spåren för skivan
  4. Sätt ihop rutan enligt tipsen nedan.

    1. Servotrådarna ska gå genom den rektangulära öppningen på lådans sida.
    2. Den kortaste änden av diskturnern fästs på servohuvudet och den längre änden går genom hålet på den andra sidan av lådan med ett cirkulärt hål på det. Detta visas på bild 6.
  5. Nu behöver vi något för att säkerställa att plattformen förblir jämn när disken vrids. Skär ätpinnen i 75 mm långa pinnar (bild 7) och lim dem genom lådans ovansida i plattans ovansida med varmt lim. Se till att pinnarna är planade i 90 grader mot plattformen.
  6. Sätt in en 212 mm lång pinne i det mellersta hålet ovanpå lådan på plattformen.

Ljuv! Nu har du en komplett låda (bild 8) för drakens rörelse upp och ner. Upprepa nu stegen ovan två gånger till!

Steg 2: Hur är det med vänster och höger ?

Hur är det med höger och vänster ?!
Hur är det med höger och vänster ?!
Hur är det med höger och vänster ?!
Hur är det med höger och vänster ?!
Hur är det med höger och vänster ?!
Hur är det med höger och vänster ?!
Hur är det med höger och vänster ?!
Hur är det med höger och vänster ?!

Nu kan vi inte glömma vänster och höger rörelse av den Sinusdraken, kan vi? Låt oss hoppa in i det andra steget!

  1. Ladda ner Adobe Illustrator -filerna (.ai) och skriv ut dem med en laserskärmaskin.

    1. leftRightBoxWithPlatforms.ai ska skrivas ut på en kartong.
    2. filen armTurner.ai ska skrivas ut på ett material som är 3 mm tjockt.
  2. Ladda ner 3D -utskriftsfilerna (.stl) och använd din favorit 3D -skrivare för att skriva ut dem.

    Se till att du skriver ut två av armarna! Färgen spelar ingen roll här

  3. Montera ihop de två plattformarna som visas på bild 3 med varmt lim.
  4. Sätt ihop lådan. Även om det kan vara svårt att göra det, är det lättare att uppnå genom att:

    1. Att sätta in de två plattformarna mellan de två stora slitsarna på vardera sidan av lådan.
    2. Placera den första armen på toppen av den övre plattformen.
    3. Trä armsvängaren genom armen och sedan den övre plattformen.
    4. Placera den andra armen på toppen av den nedre plattformen.
    5. Trä armsvängaren genom den andra armen och sedan den nedre plattformen.
    6. Stick armsvängaren genom den rektangulära öppningen på 3D -tryckta armsvängaren.
    7. Den andra änden av vändaren går ovanpå servomotorn.
    8. Lägg de övre, nedre och bakre bitarna i lådan.

Din slutmonterade låda ska se ut som den sjätte bilden. Nu får du upprepa det två gånger till!

I slutet av detta steg bör du ha sex lådor med tre vardera upp/ner och vänster/höger rörelsessystem.

Steg 3: Håll upp kroppen … HUR?

Håller upp kroppen … HUR?
Håller upp kroppen … HUR?

Bra fråga! Det är då de 3D -tryckta slinkiga hållarna kommer in. Ladda ner den medföljande.stl -filen och skriv ut den med en 3D -skrivare. Var noga med att skriva ut 6 hållare totalt för de 6 olika lådorna.

Om du har sett bilden av den slinkiga hållaren ovan har överraskningen förstörts - det är färgen på vår Sinese -drake!

Steg 4: Men de här lådorna är inte så vackra …

Och jag håller med! Det är därför vi kommer att använda en laserskärare för att skära en mycket mer attraktiv låda för att innehålla alla dessa lådor och dölja dem.

Ladda ner dessa Adobe Illustrator -filer och klipp ut dem med laserskäraren. Molndesignen ritades för hand av en av bidragsgivarna. Ändra dem gärna genom att ta bort dem inuti illustratörsfilen och lägga till din egen design som du tycker passar! Nedan följer de föreslagna stegen för att sätta ihop allt.

  1. Montera och limma ihop alla tre bitarna från den första filen (yttreBoxFinal_1).
  2. Lägg inte till biten från den andra filen (ytterBoxFinal_2) än.
  3. Lägg stycket från den tredje filen (yttreBoxFinal_3) till botten av lådan och den ska stängas högst upp. Limma ENDAST i botten av lådan.
  4. Skriv ut innerboxar Plattform två gånger. Limma ihop de två bitarna som har stora rektangelhål i dem. Limma sedan ihop tre av de återstående bitarna. Slutligen limma den på den andra limmade uppsättningen med hål i dem.
  5. Placera plattformen längst ner på den stora lådan.
  6. Sätt in alla 6 mindre lådor på motsvarande platser på plattformen.
  7. Lägg nu biten från den andra filen (yttreBoxFinal_2) ovanpå lådan och limma runt kanten. Hålen på toppstycket ska vara i linje med hålen på de mindre lådorna. Om inte, ordna om dina mindre lådor. Lägg inte till lim på de mindre lådorna alls.
  8. Om du använder en brödbräda som har en klibbig bit i botten, placera den nära mitten av botten på en plats som när du stänger lådan, ska brödbrädan tillsammans med fotonerna försvinna. Det finns små slitsar på botten som gör det lättare för dig att ansluta till fotonerna utifrån.

Steg 5: Slinky Toys ?? Åh, min

Slinkiga leksaker ?? Åh, min!
Slinkiga leksaker ?? Åh, min!
Slinky leksaker ?? Åh, min!
Slinky leksaker ?? Åh, min!

Drakens kropp:

1. Kombinera tre slinkies tillsammans med varmt lim eller tejp.

2. Mät längden och diametern på slinkiesna och skär en bit dekorativt tyg.

3. Ta med de två ändarna av tyget och sy ihop dem.

4. När du har sytt dem, skjut in slinkies som en strumpa.

5. Sy ändarna av det slinkiga till det syade tyget.

Steg 6: Skriv ut din drake

3D -tryckta delar av draken:

1. Delarna togs från

2. Vi använde bara huvudet, benen och ögonen.

3. Efter 3D -utskrift, släta ut den med sandpapper och aceton.

4. Måla delarna så som du vill dekorera det.

Steg 7: Dags att kliva upp din drake med NeoPixels

Dags att stärka din drake med NeoPixels!
Dags att stärka din drake med NeoPixels!
Dags att stärka din drake med NeoPixels!
Dags att stärka din drake med NeoPixels!

Lätt segment:

1. Du kan helt enkelt använda en neopixelsträng för att skapa lamporna om du vill. (Vi tog slut på trådarna).

2. Vi använde 20 neopixellampor och kopplade dem med ledningar. Dessa trådar löddes på dem och kopplades till foton med hjälp av röda ledningar så att det matchar temat för draken.

3. Du kan också sy dina neopixellampor på en lång tygbit, men vi använde dem inte eftersom vi hade en slinky av metall.

Montering av delarna: Säkra det lätta segmentet inuti dragens kropp med hjälp av trådar eller trådar. Se till att du kan ansluta lamporna till fotonen inuti basboxen. Fäst huvudet, benen och svansen på kroppen med hjälp av lim. När de väl är på plats sätter du fast kroppen i de smala hållarna som vi tryckt tidigare. Nu är kroppen redo att programmeras.

Steg 8: Programmeringstid

Eftersom vi kommer att använda två partikelfoton för att arbeta med sex separata servomotorer (en foton kan bara fungera med fyra) kommer vi att skriva två separata men liknande koder som ska blinkas på mikrokontrollerna.

Nu, för den första mikrokontrollern …

I en Arduino -fil (.ino), inkludera följande bibliotek och definierar:

#inkludera "neopixel.h"

#inkludera "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Deklarera sedan följande 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åste vara mellan 0 och 180 (i grader) int positionUpDown_2 = 180; // måste vara mellan 0 och 180 (i grader) int leftRight_2 = 1; // 0 = vänster, 1 = höger int upDown_2 = 1; // 0 = upp, 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) + 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_ (JO) (5) + 76*JSON_OBJECT_SIZE (8) + 12490; SträngväderArray [3]; float temperatureArray [3]; flottörfuktighetArray [3]; float windSpeedArray [3]; SträngstämpelArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Klicka här för att lära dig hur du konfigurerar webhooks. När du är klar lägger du till följande deklarationer och funktioner och gör lämpliga ändringar om det behövs:

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

Följande funktioner styr upp/ner och vänster/höger rörelser av draken:

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 (upDown_1) {positionUpDown_1 ++; if (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} annat {positionUpDown_1--; if (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }

void changeUpDown2 () {

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

För att kunna ändra rörelserna i ett intervall skapas timers.

Timer timerLeftRight1 (100, changeLeftRight1);

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

Installationsfunktionen läggs äntligen till nästa. Var noga med att göra lämpliga ändringar i kodraderna som handlar om webhooks.

void setup () {// start the weather timers timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Sätt initialisering som pinMode och börja funktioner här. // Installera Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // initiera servoposition servoUpDown_1.write (positionUpDown_1); // initiera servoposition servoLeftRight_2.write (positionLeftRight_2); // initiera servoposition servoUpDown_2.write (positionUpDown_2); // initiera servopositionstimerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Öppna en konsol Serial.begin (9600); fördröjning (2000); Serial.println ("Hej!"); // Prenumerera på get_weather5DayForecast och 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 används inte för detta projekt. Vi kan inte glömma funktioner för att hantera data som tas emot från webhooks!

void gotWeather5DayForecast (const char *händelse, const char *data) {allData5DaysForecast += data; // sparar all data i en sträng. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffert [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffert, allData5DaysForecastLen + 1); // skapa en buffert för strängen int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffert); // Testa om analysen lyckas. if (! root.success ()) {//Serial.println("Parsering för väderprognos 5 dagar … FEL! "); lämna tillbaka; } int i = 1; JsonArray & list = root ["list"]; för (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; flottörtemperatur = main ["temp"]; int fuktighet = huvud ["luftfuktighet"]; JsonObject & weather = currentObject ["weather"] [0]; const char* weatherInfo = weather ["main"]; float windSpeed = currentObject ["vind"] ["hastighet"]; 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; moistArray = fuktighet; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = tidsstämpel; i ++; } annat {paus; }}}

void gotCurrentWeatherData (const char *händelse, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); // Testa om analysen lyckas. if (! root.success ()) {//Serial.println("Parsering för aktuellt väder … FEL! "); lämna tillbaka; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = väder ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["fuktighet"]; float wind_speed = root ["vind"] ["hastighet"]; 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; moistArray [0] = main_humidity; windSpeedArray [0] = wind_speed; timestampArray [0] = tidsstämpel; }

Nedan hittar du ytterligare funktioner som styr uppdateringen av servomotornas positioner, temperaturomvandling från Kelvin till Fahrenheit och inställning av färgerna på lysdioderna.

int updateUpDown (float temp) {// Kartlägg graden till ett område av [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("ny servograd:"); Serial.println (servoMaxDegree); returnera servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Kartlägg vindhastigheten till ett område av [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("nytt servicevärde:"); 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; if (index == 0) {ledIndex = 0; } annars if (index == 1) {ledIndex = 6; } annars if (index == 2) {ledIndex = 12; } annat {retur; } if (weatherDesc == "Clear") {// gul för (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // gul remsa. visa (); fördröjning (20); }} annat om (weatherDesc == "Moln") {// grå för (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // grå remsa. visa (); fördröjning (20); }} annat om (weatherDesc == "Snow") {// vit för (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // vit remsa. visa (); fördröjning (20); }} annat ifall (weatherDesc == "Rain") {// blått för (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // blå remsa. visa (); fördröjning (20); }} annat {// röd för (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // röd strip.show (); fördröjning (20); }}}

När du har lagt till allt i din Arduino -fil, kompilera det. Om det inte finns några fel, fortsätt och blinka koden till den första fotonen. Nästa steg ger dig en liknande kod som ska blinkas på den andra fotonen.

Steg 9: Programmeringen fortsätter

Eftersom koden för den andra fotonen är nästan identisk med den för den första, kopieras och klistras hela koden nedan:

#inkludera "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_SONJO_SJO_SJO_SJON_SJÖN_BJÄND_SJÖN_BJÄNT_SJÄNT

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

SträngväderArray [3];

float temperatureArray [3]; flottörfuktighetArray [3]; float windSpeedArray [3]; Sträng tidsstämpelArray [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 dagar

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 () {

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

Timer timerLeftRight3 (100, changeLeftRight3);

Timer timerUpDown3 (10, changeUpDown3);

void setup () {

// starta väderutlösarna timerWeatherForecast.start (); timerWeatherCurrent.start (); // Sätt initialisering som pinMode och börja funktioner här. // Installera Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // initiera servoposition

servoUpDown_3.write (positionUpDown_3); // initiera servoposition

timerLeftRight3.start ();

timerUpDown3.start (); // Öppna en konsol Serial.begin (9600); fördröjning (2000); Serial.println ("Hej!"); // Prenumerera på get_weather5DayForecast och 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; // sparar all data i en sträng. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffert [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffert, allData5DaysForecastLen + 1); // skapa en buffert för strängen int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffert); //Serial.println(allData5DaysForecast); // Testa om analysen lyckas. if (! root.success ()) {//Serial.println("Parsering för väderprognos 5 dagar … FEL! "); lämna tillbaka; } int i = 1; JsonArray & list = root ["list"]; för (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; flottörtemperatur = main ["temp"]; int fuktighet = huvud ["luftfuktighet"]; JsonObject & weather = currentObject ["weather"] [0]; const char* weatherInfo = weather ["main"]; float windSpeed = currentObject ["vind"] ["hastighet"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (temperatur); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; moistArray = fuktighet; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = tidsstämpel; i ++; } annat {paus; }}}

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

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (data); //Serial.println(data); // Testa om analysen lyckas. if (! root.success ()) {//Serial.println("Parsering för aktuellt väder … FEL! "); lämna tillbaka; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = väder ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["fuktighet"]; float wind_speed = root ["vind"] ["hastighet"]; 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; moistArray [0] = main_humidity; windSpeedArray [0] = wind_speed; timestampArray [0] = tidsstämpel; }

int updateUpDown (float temp) {

// Kartlägg graden till ett område av [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("ny servograd:"); Serial.println (servoMaxDegree); returnera servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Kartlägg vindhastigheten till ett område av [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("nytt servicevärde:"); 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 klarat av programmeringsdelen av projektet! Var noga med att göra alla kablar och anslutningar från servomotorerna och neopixlarna till brödbrädan och mikrokontrollerna. OBS: sätt in de extra pluggarna/ätpinnarna genom de vertikala slitsarna på rutorna för kroppens vänstra och högra rörelser. Den andra änden ska vara ansluten till drakens kropp.

Steg 10: Njut av din drake

Grattis! Du har byggt en Sine-ese Dragon från grunden! Allt du behöver göra är att luta dig tillbaka och njuta av din omgivande display!

OBS: Detta projekt byggdes som en del av ett kursarbete av Joan Bempong och Soundarya Muthuvel. Kurssidan hittar du här.

Rekommenderad: