Taula de continguts:

Drac Sine-ese: 10 passos (amb imatges)
Drac Sine-ese: 10 passos (amb imatges)

Vídeo: Drac Sine-ese: 10 passos (amb imatges)

Vídeo: Drac Sine-ese: 10 passos (amb imatges)
Vídeo: 10 самых АТМОСФЕРНЫХ мест Дагестана. БОЛЬШОЙ ВЫПУСК #Дагестан #ПутешествиеПоДагестану 2024, Desembre
Anonim
Drac Sine-ese
Drac Sine-ese

Sine-ese Dragon és una peça de decoració per a la llar ambiental que utilitza moviments mecànics i llums per indicar-vos la previsió del temps per als propers tres intervals de tres hores. Per definició, ambient descriu l'entorn immediat d'alguna cosa; per tant, es va decidir que era apropiat incorporar les dades meteorològiques a una pantalla ambiental. El temps és un aspecte que canvia involuntàriament el dia de la gent i és una informació que canvia constantment cada minut, fins i tot fins al segon.

El drac xinès és "un símbol de poder, força i bona sort" i es manté sovint amb un alt valor cultural i tradicional a tot el subcontinent asiàtic. A més de portar fortuna, es diu que el drac xinès també té potents potents que controlen "l'aigua, les precipitacions, els tifons i les inundacions". En última instància, el drac xinès es va considerar adequat per representar les dades meteorològiques.

Visualització

El drac Sine-ese es manipula en sis punts principals en tres seccions separades que representen la predicció del temps durant tres intervals de 3 hores. Per a cada interval de 3 hores, s'inclourà la informació següent:

  • Descripció del temps: determina el color de la informació meteorològica actual.
  • Temperatura: especifica l’alçada del cos
  • Humitat: parpelleig de segments LED
  • Velocitat del vent: controla la velocitat del cos que es mou cap a l’esquerra i cap a la dreta.

Materials necessaris

  1. Fusta contraxapat / Cartró de 3 mm
  2. Clavilles o escuradents de fusta de 5 mm
  3. 2 fotons de partícules
  4. 3 joguines Slinky
  5. 6 servomotors
  6. Llums NeoPixel (ja sigui una cadena o llums individuals cosides)
  7. Molta súper cola
  8. Fil conductor
  9. Pintura acrílica
  10. Teixit decoratiu
  11. Tallador làser
  12. Impressora 3D

Pas 1: amunt i avall

Amunt i avall!
Amunt i avall!
Amunt i avall!
Amunt i avall!
Amunt i avall!
Amunt i avall!

El vostre primer pas per construir el drac Sine-ese és construir el component que controla el moviment cap amunt i cap avall del cos. Que emocionant!

  1. Baixeu-vos els fitxers Adobe Illustrator (.ai) i imprimiu-los amb una màquina talladora làser.

    upDownBoxWithPlatform.ai s’hauria d’imprimir en un cartró

  2. Baixeu-vos els fitxers d'impressió 3D (.stl) i utilitzeu la vostra impressora 3D preferida per imprimir-los.

    El color no importa ni per al disc ni per al convertidor de discos. A la segona imatge, el convertidor de disc s'ha inserit dins del forat del disc

  3. Muntar els dos primers components i enganxar-los com es mostra a les imatges 3 a 5.

    1. La plataforma
    2. Les ranures del disc
  4. Ara, ajunteu el quadre seguint els consells següents.

    1. Els cables del servo haurien de passar per l’obertura rectangular del lateral de la caixa.
    2. L'extrem més curt del torner de disc s'uneix al cap de servo i l'extrem més llarg passa pel forat de l'altre costat de la caixa amb un forat circular. Això es demostra a la imatge 6.
  5. Ara necessitem alguna cosa per garantir que la plataforma es mantingui anivellada quan es giri el disc. Talleu l’escuradents en pals de 75 mm de llargada (imatge 7) i enganxeu-los per la part superior de la caixa a la part superior de la plataforma amb cola calenta. Assegureu-vos que els pals s’anivellin a 90 graus de la plataforma.
  6. Introduïu un pal de 212 mm de longitud al forat central de la part superior de la caixa a la plataforma.

Dolç! Ara teniu una caixa completa (imatge 8) per al moviment amunt i avall del drac. Ara, repetiu els passos anteriors dues vegades més.

Pas 2: Què passa amb l’esquerra i la dreta ?

Què passa amb l’esquerra i la dreta ?!
Què passa amb l’esquerra i la dreta ?!
Què passa amb l’esquerra i la dreta ?!
Què passa amb l’esquerra i la dreta ?!
Què passa amb l’esquerra i la dreta ?!
Què passa amb l’esquerra i la dreta ?!
Què passa amb l’esquerra i la dreta ?!
Què passa amb l’esquerra i la dreta ?!

Ara bé, no podem oblidar-nos del moviment esquerre i dret del drac Sine-ese, oi? Saltem al segon pas!

  1. Baixeu-vos els fitxers Adobe Illustrator (.ai) i imprimiu-los amb una màquina talladora làser.

    1. leftRightBoxWithPlatforms.ai s’hauria d’imprimir en un cartró.
    2. El fitxer armTurner.ai s’ha d’imprimir en un material de 3 mm de gruix.
  2. Baixeu-vos els fitxers d'impressió 3D (.stl) i utilitzeu la vostra impressora 3D preferida per imprimir-los.

    Assegureu-vos d’imprimir dos braços! El color no importa aquí

  3. Muntar les dues plataformes juntes com es mostra a la imatge 3 amb cola calenta.
  4. Ajunteu la caixa. Tot i que pot ser complicat fer-ho, és més fàcil aconseguir-ho mitjançant:

    1. Inserció de les dues plataformes entre les dues grans escletxes a banda i banda de la caixa.
    2. Col·locació del primer braç a la part superior de la plataforma superior.
    3. Enfilar el girabrazos pel braç i després per la plataforma superior.
    4. Col·locació del segon braç a la part superior de la plataforma inferior.
    5. Enfilar el girabrazos pel segon braç i després per la plataforma inferior.
    6. Introduir el tornet de braços per l’obertura rectangular del torn de braç imprès en 3D.
    7. L'altre extrem del torner va a la part superior del servomotor.
    8. Afegiu la part superior, inferior i posterior a la caixa.

La vostra caixa final muntada hauria de semblar a la sisena imatge. Ara, podeu repetir-ho dues vegades més!

Al final d'aquest pas, hauríeu de tenir sis quadres amb tres cadascun dels sistemes de moviment amunt / avall i esquerra / dreta.

Pas 3: sostenir el cos … COM?

Aguantant el cos … COM?
Aguantant el cos … COM?

Bona pregunta! És aleshores quan entren aquests suports slinky impresos en 3D. Baixeu-vos el fitxer.stl inclòs i imprimiu-lo amb una impressora 3D. Assegureu-vos d’imprimir 6 titulars en total per a les 6 caixes diferents.

Si heu vist la imatge del suport lliscant de dalt, la sorpresa s’ha arruïnat: aquest és el color del nostre drac Sine-ese!

Pas 4: Però aquestes caixes no són tan boniques …

I hi estic d'acord! És per això que utilitzarem un tallador làser per tallar una caixa molt més atractiva per contenir totes aquestes caixes i amagar-les.

Baixeu-vos els fitxers d'Adobe Illustrator i talleu-los amb el tallador làser. Un dels col·laboradors va dibuixar a mà el disseny dels núvols. No dubteu a modificar-los traient-los dins del fitxer il·lustrador i afegint el vostre propi disseny com convingueu. A continuació es mostren els passos suggerits per ajuntar-ho tot.

  1. Muntar i enganxar les tres peces del primer fitxer (exteriorBoxFinal_1) juntes.
  2. No afegiu la peça del segon fitxer (outerBoxFinal_2) encara.
  3. Poseu la peça del tercer fitxer (outerBoxFinal_3) a la part inferior del quadre i hauria de tancar-se a la part superior. Enganxa NOMÉS a la part inferior de la caixa.
  4. Imprimiu innerBoxesPlatform dues vegades. Enganxeu les dues peces que tenen grans forats rectangles. A continuació, enganxeu tres de les peces restants juntes. Finalment, enganxeu-lo a l’altre joc enganxat amb forats.
  5. Col·loqueu la plataforma a la part inferior de la caixa gran.
  6. Introduïu les 6 caixes més petites als seus llocs corresponents a la plataforma.
  7. Ara, col·loqueu la peça del segon fitxer (outerBoxFinal_2) a la part superior del quadre i enganxeu-la al voltant de la vora. Els forats de la peça superior s’han d’alinear amb els forats de les caixes més petites. Si no, reordeneu les caixes més petites. No afegiu cola a les caixes més petites.
  8. Si feu servir una taula de pa que té una peça enganxosa a la part inferior, col·loqueu-la a prop del centre de la peça inferior en un lloc que quan tanqueu la caixa, la taula de pa juntament amb els fotons haurien de desaparèixer. Hi ha petites escletxes a la peça inferior que us permeten connectar-vos més fàcilment als fotons des de l’exterior.

Pas 5: Slinky Toys ?? Oh el meu

Slinky Toys ?? Oh el meu!
Slinky Toys ?? Oh el meu!
Slinky Toys ?? Oh el meu!
Slinky Toys ?? Oh el meu!

Cos del drac:

1. Combineu tres slinkies junts amb cola calenta o cinta adhesiva.

2. Mesureu la longitud i el diàmetre dels slinkies i talleu un tros de tela decorativa.

3. Porteu els dos extrems de la tela i cosiu-los.

4. Quan hàgiu acabat de cosir-les, feu lliscar els slinkies com un mitjó.

5. Cosiu els extrems de la tela esvelta fins a la tela cosida.

Pas 6: imprimiu el vostre drac

Parts impreses en 3D del drac:

1. Les parts s'han extret de

2. Vam utilitzar només el cap, les cames i els ulls.

3. Després d'imprimir la peça en 3D, suavitzeu-la amb paper de vidre i acetona.

4. Pinta les parts de la manera que vulguis per decorar-la.

Pas 7: és hora de millorar el vostre drac amb NeoPixels

És hora d’incrementar el vostre drac amb NeoPixels!
És hora d’incrementar el vostre drac amb NeoPixels!
És hora d’incrementar el vostre drac amb NeoPixels!
És hora d’incrementar el vostre drac amb NeoPixels!

Segment de llum:

1. Si voleu, podeu utilitzar una cadena de neopíxels per crear els llums (ens hem quedat sense cadenes).

2. Hem utilitzat 20 llums de neopíxels i els hem connectat mitjançant cables. Aquests cables es van soldar sobre ells i es van connectar al fotó mitjançant un cablejat vermell perquè coincidís amb el tema del drac.

3. També podeu cosir els llums de neopíxels en un tros llarg de tela, però no els hem utilitzat perquè teníem un metall feixuc.

Muntatge de les parts: assegureu el segment de llum a l'interior del cos del drac mitjançant fils o fils. Assegureu-vos que podeu connectar els llums al fotó dins de la caixa base. Fixa el cap, les potes i la cua al cos amb cola. Un cop estiguin al seu lloc, fixeu el cos als suports lliscants que vam imprimir abans. Ara el cos està a punt per ser programat.

Pas 8: temps de programació

Com que farem servir dos fotons de partícules per treballar amb sis servomotors separats (un fotó només pot funcionar amb quatre), escriurem dos codis separats però similars per llampar als microcontroladors.

Ara, pel primer microcontrolador …

En un fitxer Arduino (.ino), incloeu les biblioteques i les definicions següents:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

A continuació, declareu les variables següents:

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; // ha de ser entre 0 i 180 (en graus) int positionUpDown_2 = 180; // ha de ser entre 0 i 180 (en graus) int leftRight_2 = 1; // 0 = left, 1 = right int upDown_2 = 1; // 0 = amunt, 1 = avall 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_SIZ (JSON_OBJECT_) 390; const size_t bufferSizeForecast = 38 * JSON_ARRAY_SIZE (1) + JSON_ARRAY_SIZE (38) + 2 * JSON_OBJECT_SIZE (0) + 112 * JSON_OBJECT_SIZE (1) + 39 * JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZ (JSON_OBJECT_SIZE) (5) + 76 * JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; float temperatureArray [3]; flotador Humitat Matriu [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; String allData5DaysForecast;

Feu clic aquí per obtenir informació sobre com configurar webhooks. Quan hàgiu acabat, afegiu les següents declaracions i funcions i, si cal, feu els canvis adequats:

void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Temporitzador temporitzadorWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } Temporitzador temporitzadorWeatherCurrent (60000, getCurrentWeather);

Les funcions següents controlen els moviments amunt / avall i esquerra / dreta del drac:

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

void changeUpDown2 () {

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

Per poder canviar els moviments en un interval, es creen temporitzadors.

Temporitzador timerLeftRight1 (100, changeLeftRight1);

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

La funció de configuració finalment s’afegeix a continuació. Assegureu-vos de fer els canvis adequats a les línies de codi que s’ocupen dels webhooks.

void setup () {// iniciar els temporitzadors meteorològics timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Posa la inicialització com pinMode i comença les funcions aquí. // Configureu el servo microServoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // inicialitzar la servo servo servoUpDown_1.write (positionUpDown_1); // inicialitzar servo posició servoLeftRight_2.write (positionLeftRight_2); // inicialitzar la servo posició servoUpDown_2.write (positionUpDown_2); // inicialitzar la posició del servo timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Obriu una consola Serial.begin (9600); endarreriment (2000); Serial.println ("Hola!"); // Subscriviu-vos als webhooks get_weather5DayForecast i get_currentWeather Particle.subscribe ("hook-response / get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response / get_currentWeather / 0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }

No s’utilitza una funció de bucle per a aquest projecte. No podem oblidar les funcions per gestionar les dades rebudes dels webhooks.

void gotWeather5DayForecast (const char * event, const char * data) {allData5DaysForecast + = data; // desa totes les dades en una cadena. int allData5DaysForecastLen = allData5DaysForecast.length (); buff buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (memòria intermèdia, allData5DaysForecastLen + 1); // creeu un buffer per a la cadena int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (memòria intermèdia); // Prova si l’anàlisi té èxit. if (! root.success ()) {//Serial.println("Parsing for weather weather 5 days… ERROR! "); tornar; } int i = 1; JsonArray & list = root ["llista"]; per a (JsonObject & currentObject: llista) {if (i <3) {JsonObject & main = currentObject ["main"]; temperatura del flotador = principal ["temp"]; int humitat = principal ["humitat"]; JsonObject & weather = currentObject ["weather"] [0]; const char * weatherInfo = weather ["main"]; float windSpeed = currentObject ["vent"] ["velocitat"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertirToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = ServoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; moistureArray = humitat; weatherArray = weatherInfo; windSpeedArray = velocitat del vent; timestampArray = marca de temps; i ++; } else {break; }}}

void gotCurrentWeatherData (const char * event, const char * data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (dades); // Prova si l’anàlisi té èxit. if (! root.success ()) {//Serial.println("Parsing for weather current … ERROR! "); tornar; } JsonObject & weather = root ["weather"] [0]; const char * weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["humitat"]; float wind_speed = root ["vent"] ["velocitat"]; const char * timestamp = root ["dt_txt"]; int tempFah = convertirToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = Increment servo; setColor (weather_main, 0); weatherArray [0] = weather_main; temperatureArray [0] = tempFah; humitatArray [0] = humitat_major; windSpeedArray [0] = velocitat_vent; timestampArray [0] = marca de temps; }

A continuació, podeu trobar funcions addicionals que controlen l’actualització de les posicions dels servomotors, la conversió de temperatura de Kelvin a Fahrenheit i la configuració dels colors dels LED.

int updateUpDown (float temp) {// Assigneu el grau a un interval de [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("nou grau de servo:"); Serial.println (servoMaxDegree); torna servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Assigneu la velocitat del vent a un interval de [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("nou valor d'increment del servo:"); Serial.println (servoIncrement); torna servoIncrement; }

int convertToFahrenheit (floKat tempKel) {

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

void setColor (String weatherDesc, int index) {

int ledIndex = 0; if (índex == 0) {ledIndex = 0; } else if (índex == 1) {ledIndex = 6; } else if (índex == 2) {ledIndex = 12; } else {return; } if (weatherDesc == "Clear") {// groc per a (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62)); // franja groga.show (); retard (20); }} else if (weatherDesc == "Núvols") {// gris per a (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // strip.show gris (); retard (20); }} else if (weatherDesc == "Snow") {// white for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // tira blanca.show (); retard (20); }} else if (weatherDesc == "Rain") {// blue for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // blue strip.show (); retard (20); }} else {// red for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // red strip.show (); retard (20); }}}

Un cop hàgiu afegit tot el fitxer Arduino, compileu-lo. Si no hi ha errors, seguiu endavant i cliqueu el codi al primer fotó. El següent pas us proporcionarà un codi similar que es mostrarà al segon fotó.

Pas 9: la programació continua

Com que el codi del segon fotó és gairebé idèntic al del primer, tot el codi es copia i enganxa a continuació:

#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_OBJECT_SIZE (6) + JSON_SIZE (6)

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

String weatherArray [3];

float temperatureArray [3]; flotador Humitat Matriu [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];

String allData5DaysForecast;

void getWeather5DayForecast ()

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

Temporitzador temporitzadorWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 dies

void getCurrentWeather ()

{Particle.publish ("get_currentWeather2"); }

Temporitzador temporitzadorWeatherCurrent (60000, getCurrentWeather);

void changeLeftRight3 () {

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

void changeUpDown3 () {

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

Temporitzador timerLeftRight3 (100, changeLeftRight3);

Temporitzador timerUpDown3 (10, changeUpDown3);

configuració nul·la () {

// iniciar els temporitzadors meteorològics timerWeatherForecast.start (); timerWeatherCurrent.start (); // Posa la inicialització com pinMode i comença les funcions aquí. // Configureu el Servo Micro servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);

servoLeftRight_3.write (positionLeftRight_3); // inicialitzar la posició del servo

servoUpDown_3.write (positionUpDown_3); // inicialitzar la posició del servo

timerLeftRight3.start ();

timerUpDown3.start (); // Obriu una consola Serial.begin (9600); endarreriment (2000); Serial.println ("Hola!"); // Subscriviu-vos als webhooks get_weather5DayForecast i get_currentWeather 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 + = dades; // desa totes les dades en una cadena. int allData5DaysForecastLen = allData5DaysForecast.length (); buff buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (memòria intermèdia, allData5DaysForecastLen + 1); // creeu un buffer per a la cadena int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (memòria intermèdia); //Serial.println(allData5DaysForecast); // Prova si l’anàlisi té èxit. if (! root.success ()) {//Serial.println("Parsing for weather weather 5 days… ERROR! "); tornar; } int i = 1; JsonArray & list = root ["llista"]; per a (JsonObject & currentObject: llista) {if (i <3) {JsonObject & main = currentObject ["main"]; temperatura del flotador = principal ["temp"]; int humitat = principal ["humitat"]; JsonObject & weather = currentObject ["weather"] [0]; const char * weatherInfo = weather ["main"]; float windSpeed = currentObject ["vent"] ["velocitat"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertirToFahrenheit (temperatura); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = ServoIncrement; temperatureArray = tempFah; moistureArray = humitat; weatherArray = weatherInfo; windSpeedArray = velocitat del vent; timestampArray = marca de temps; i ++; } else {break; }}}

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

{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (dades); //Serial.println(dades); // Prova si l’anàlisi té èxit. if (! root.success ()) {//Serial.println("Parsing for weather current … ERROR! "); tornar; } JsonObject & weather = root ["weather"] [0]; const char * weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["humitat"]; float wind_speed = root ["vent"] ["velocitat"]; const char * timestamp = root ["dt_txt"]; int tempFah = convertirToFahrenheit (main_temp); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree [0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed [0] = Increment servo; weatherArray [0] = weather_main; temperatureArray [0] = tempFah; humitatArray [0] = humitat_major; windSpeedArray [0] = velocitat_vent; timestampArray [0] = marca de temps; }

int updateUpDown (temperatura flotant) {

// Assigneu el grau a un interval de [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("nou grau de servo:"); Serial.println (servoMaxDegree); torna servoMaxDegree; }

int updateleftRight (float windSpeed) {

// Assigneu la velocitat del vent a un interval de [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("nou valor d'increment del servo:"); Serial.println (servoIncrement); torna servoIncrement; }

int convertToFahrenheit (floKat tempKel) {

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

Ho vas fer! Ja ho heu aconseguit a través de la secció de programació del projecte. Ara, assegureu-vos de fer tots els cables i connexions dels servomotors i neopíxels a la placa de control i als microcontroladors. NOTA: introduïu els tacs / escuradents addicionals a través de les escletxes verticals de les caixes per als moviments esquerre i dret del cos. L'altre extrem hauria d'estar connectat al cos del drac.

Pas 10: gaudiu del vostre drac

Enhorabona! Heu construït un drac Sine-ese des de zero! Ara tot el que heu de fer és seure i gaudir de la pantalla ambiental.

NOTA: Aquest projecte va ser construït com a part d’un curs per Joan Bempong i Soundarya Muthuvel. La pàgina del curs es pot trobar aquí.

Recomanat: