Inhaltsverzeichnis:

Sinus-Drache - Gunook
Sinus-Drache - Gunook

Video: Sinus-Drache - Gunook

Video: Sinus-Drache - Gunook
Video: Kingmaker - The Change of Destiny Episode 10 | Arabic, English, Turkish, Spanish Subtitles 2024, Juli
Anonim
Sinus-Drache
Sinus-Drache

Sine-ese Dragon ist ein stimmungsvolles Wohnaccessoire, das mechanische Bewegungen und Lichter verwendet, um Ihnen die Wettervorhersage für die nächsten drei Drei-Stunden-Intervalle mitzuteilen. Per Definition beschreibt Ambient die unmittelbare Umgebung von etwas; Daher wurde entschieden, Wetterdaten in eine Umgebungsanzeige zu integrieren. Wetter ist ein Aspekt, der den Tag der Menschen ungewollt verändert und ist eine Information, die sich jede Minute oder sogar sekundengenau ändert.

Der chinesische Drache ist „ein Symbol für Macht, Stärke und Glück“und wird auf dem gesamten asiatischen Subkontinent häufig mit einem hohen kulturellen und traditionellen Wert bewertet. Der chinesische Drache soll nicht nur Glück bringen, sondern auch über mächtige Kräfte verfügen, die "Wasser, Regen, Taifune und Überschwemmungen" kontrollieren. Letztendlich wurde der Chinesische Drache als geeignet erachtet, Wetterdaten darzustellen.

Visualisierung

Der Sine-ese Dragon wird an sechs Hauptpunkten in drei separaten Abschnitten manipuliert, die die Wettervorhersage für drei 3-Stunden-Intervalle darstellen. Für jedes 3-Stunden-Intervall werden die folgenden Informationen aufgenommen:

  • Wetterbeschreibung - bestimmt die Farbe der aktuellen Wetterinformationen.
  • Temperatur - gibt die Körpergröße an
  • Luftfeuchtigkeit - Blinken der LED-Segmente
  • Windgeschwindigkeit - steuert die Geschwindigkeit des Körpers, der sich nach links und rechts bewegt.

Benötigte Materialien

  1. 3 mm Sperrholz/Karton
  2. 5 mm Holzdübel oder Essstäbchen
  3. 2 Teilchenphotonen
  4. 3 schlüpfrige Spielzeuge
  5. 6 Servomotoren
  6. NeoPixel-Lichter (entweder ein Strang oder einzelne Lichter zusammengenäht)
  7. Viel Superkleber
  8. Leitfähiger Faden
  9. Acrylfarbe
  10. Dekostoff
  11. Laserschneider
  12. 3D Drucker

Schritt 1: Auf und ab

Auf und ab!
Auf und ab!
Auf und ab!
Auf und ab!
Auf und ab!
Auf und ab!

Ihr allererster Schritt zum Bau des Sinus-Drachen besteht darin, die Komponente zu konstruieren, die die Auf- und Abbewegung des Körpers steuert. Wie aufregend!

  1. Laden Sie die Adobe Illustrator-Dateien (.ai) herunter und drucken Sie sie mit einer Laserschneidmaschine aus.

    upDownBoxWithPlatform.ai sollte auf Karton gedruckt werden

  2. Laden Sie die 3D-Druckdateien (.stl) herunter und verwenden Sie Ihren bevorzugten 3D-Drucker, um sie auszudrucken.

    Die Farbe spielt für die Scheibe oder den Scheibendreher keine Rolle. Im zweiten Bild wurde der Plattenwender in das Loch der Platte eingesetzt

  3. Montieren Sie die ersten beiden Komponenten und kleben Sie sie wie in den Bildern 3 bis 5 gezeigt zusammen.

    1. Die Platform
    2. Die Rillen für die Scheibe
  4. Stellen Sie nun die Box zusammen, indem Sie die folgenden Tipps befolgen.

    1. Die Drähte des Servos sollten durch die rechteckige Öffnung an der Seite der Box gehen.
    2. Das kürzeste Ende des Plattenwenders wird am Servokopf befestigt und das längere Ende geht durch das Loch auf der anderen Seite der Box mit einem kreisförmigen Loch darauf. Dies wird in Bild 6 demonstriert.
  5. Jetzt brauchen wir etwas, um sicherzustellen, dass die Plattform waagerecht bleibt, wenn die Scheibe gedreht wird. Schneiden Sie das Essstäbchen in 75 mm lange Stäbchen (Bild 7) und kleben Sie diese mit Heißkleber durch die Oberseite der Schachtel in die Oberseite der Plattform. Stellen Sie sicher, dass die Stöcke im 90-Grad-Winkel zur Plattform ausgerichtet sind.
  6. Stecken Sie einen 212 mm langen Stock in das mittlere Loch oben an der Box auf die Plattform.

Süss! Jetzt haben Sie eine komplette Box (Bild 8) für die Auf- und Abbewegung des Drachen. Wiederholen Sie nun die obigen Schritte noch zweimal!

Schritt 2: Was ist mit links und rechts?

Was ist mit Links und Rechts?!
Was ist mit Links und Rechts?!
Was ist mit Links und Rechts?!
Was ist mit Links und Rechts?!
Was ist mit Links und Rechts?!
Was ist mit Links und Rechts?!
Was ist mit Links und Rechts?!
Was ist mit Links und Rechts?!

Jetzt können wir die linke und rechte Bewegung des Sine-ese-Drachen nicht vergessen, oder? Springen wir in den zweiten Schritt!

  1. Laden Sie die Adobe Illustrator-Dateien (.ai) herunter und drucken Sie sie mit einer Laserschneidmaschine aus.

    1. leftRightBoxWithPlatforms.ai sollte auf einem Karton gedruckt werden.
    2. Die Datei armTurner.ai sollte auf einem 3 mm dicken Material gedruckt werden.
  2. Laden Sie die 3D-Druckdateien (.stl) herunter und verwenden Sie Ihren bevorzugten 3D-Drucker, um sie auszudrucken.

    Stellen Sie sicher, dass Sie zwei der Arme drucken! Die Farbe spielt hier keine Rolle

  3. Montieren Sie die beiden Plattformen wie in Bild 3 gezeigt mit Heißkleber.
  4. Stellen Sie die Kiste zusammen. Dies kann zwar schwierig sein, ist jedoch einfacher zu erreichen, indem Sie:

    1. Einsetzen der beiden Plattformen zwischen die beiden großen Schlitze auf beiden Seiten der Box.
    2. Platzieren des ersten Arms oben auf der oberen Plattform.
    3. Einfädeln des Armwenders durch den Arm und dann die obere Plattform.
    4. Platzieren Sie den zweiten Arm oben auf der unteren Plattform.
    5. Einfädeln des Armwenders durch den zweiten Arm und dann die untere Plattform.
    6. Stecken Sie den Armturner durch die rechteckige Öffnung des 3D-gedruckten Armturners.
    7. Das andere Ende des Wenders geht auf den Servomotor.
    8. Fügen Sie die oberen, unteren und hinteren Teile der Schachtel hinzu.

Ihre endgültig zusammengebaute Box sollte wie das sechste Bild aussehen. Jetzt können Sie das noch zweimal wiederholen!

Am Ende dieses Schrittes sollten Sie sechs Boxen mit jeweils drei der Auf/Ab- und Links/Rechts-Bewegungssysteme haben.

Schritt 3: Den Körper hochhalten … WIE?

Den Körper hochhalten…WIE?
Den Körper hochhalten…WIE?

Gute Frage! Dann kommen diese 3D-gedruckten Slinky-Halter ins Spiel. Laden Sie die mitgelieferte.stl-Datei herunter und drucken Sie sie mit einem 3D-Drucker aus. Achten Sie darauf, insgesamt 6 Halter für die 6 verschiedenen Boxen zu drucken.

Wenn Sie das Bild des Slinky-Halters oben gesehen haben, ist die Überraschung ruiniert - das ist die Farbe unseres Sinus-Drachen!

Schritt 4: Aber diese Boxen sind nicht so hübsch …

Und ich stimme zu! Aus diesem Grund werden wir einen Laserschneider verwenden, um eine viel attraktivere Schachtel zu schneiden, die all diese Schachteln enthält und sie verdeckt.

Laden Sie diese Adobe Illustrator-Dateien herunter und schneiden Sie sie mit dem Laserschneider aus. Das Wolkendesign wurde von einem der Mitwirkenden von Hand gezeichnet. Fühlen Sie sich frei, sie zu ändern, indem Sie sie aus der Illustrator-Datei entfernen und Ihr eigenes Design hinzufügen, wie Sie es für richtig halten! Nachfolgend finden Sie die empfohlenen Schritte, um alles zusammenzustellen.

  1. Montieren und kleben Sie alle drei Teile aus der ersten Datei (outerBoxFinal_1) zusammen.
  2. Fügen Sie das Stück aus der zweiten Datei (outerBoxFinal_2) noch nicht hinzu.
  3. Legen Sie das Stück aus der dritten Datei (outerBoxFinal_3) an den Boden der Box und es sollte oben schließen. Kleben Sie NUR auf den Boden der Box.
  4. Drucken Sie innerBoxesPlatform zweimal. Kleben Sie die beiden Teile mit großen rechteckigen Löchern zusammen. Kleben Sie dann drei der restlichen Teile zusammen. Schließlich kleben Sie es auf das andere geklebte Set mit Löchern darin.
  5. Platzieren Sie die Plattform unten in der großen Kiste.
  6. Setzen Sie alle 6 kleineren Kisten in die entsprechenden Stellen auf der Plattform ein.
  7. Legen Sie nun das Stück aus der zweiten Datei (outerBoxFinal_2) auf die Oberseite der Schachtel und kleben Sie die Kante um. Die Löcher im Oberteil sollten mit den Löchern der kleineren Schachteln übereinstimmen. Wenn nicht, ordnen Sie Ihre kleineren Boxen neu an. Fügen Sie den kleineren Kartons überhaupt keinen Kleber hinzu.
  8. Wenn Sie ein Steckbrett verwenden, das unten ein klebriges Stück hat, platzieren Sie dieses in der Nähe der Mitte des unteren Stücks an einer Stelle, an der beim Schließen der Schachtel das Steckbrett zusammen mit den Photonen verschwinden sollte. Am unteren Teil befinden sich kleine Schlitze, die es Ihnen erleichtern, sich von außen mit den Photonen zu verbinden.

Schritt 5: Slinky Toys?? Oh mein

Schleichendes Spielzeug?? Oh mein!
Schleichendes Spielzeug?? Oh mein!
Schleichendes Spielzeug?? Oh mein!
Schleichendes Spielzeug?? Oh mein!

Körper des Drachen:

1. Kombinieren Sie drei Slinkies mit Heißkleber oder Klebeband.

2. Messen Sie Länge und Durchmesser der Slinkies und schneiden Sie ein Stück Dekostoff zu.

3. Bringen Sie die beiden Stoffenden zusammen und nähen Sie sie zusammen.

4. Wenn Sie mit dem Nähen fertig sind, schieben Sie die Slinkies wie eine Socke hinein.

5. Nähen Sie die Enden des Slinkys an den genähten Stoff.

Schritt 6: Drucken Sie Ihren Drachen

3D-gedruckte Teile des Drachen:

1. Die Teile wurden von https://www.thingiverse.com/thing:854575 übernommen.

2. Wir haben nur den Kopf, die Beine und die Augen verwendet.

3. Glätten Sie das Teil nach dem 3D-Druck mit Schleifpapier und Aceton.

4. Bemalen Sie die Teile so, wie Sie sie dekorieren möchten.

Schritt 7: Zeit, Ihren Drachen mit NeoPixels zu verbessern

Zeit, Ihren Drachen mit NeoPixels zu verbessern!
Zeit, Ihren Drachen mit NeoPixels zu verbessern!
Zeit, Ihren Drachen mit NeoPixels zu verbessern!
Zeit, Ihren Drachen mit NeoPixels zu verbessern!

Lichtsegment:

1. Sie können einfach einen Neopixel-Strang verwenden, um die Lichter zu erstellen, wenn Sie möchten. (Uns sind die Stränge ausgegangen).

2. Wir haben 20 Neopixel-Lichter verwendet und sie mit Drähten verbunden. Diese Drähte wurden darauf gelötet und mit roten Drähten mit dem Photon verbunden, damit es zum Thema des Drachen passt.

3. Sie können Ihre Neopixel-Leuchten auch auf ein langes Stück Stoff nähen, aber wir haben sie nicht verwendet, weil wir eine Slinky aus Metall hatten.

Zusammenbau der Teile: Befestigen Sie das Leuchtsegment im Inneren des Drachenkörpers mit Fäden oder Drähten. Stellen Sie sicher, dass Sie die Lichter mit dem Photon in der Basisbox verbinden können. Kopf, Beine und Schwanz mit Kleber am Körper befestigen. Sobald sie an Ort und Stelle sind, befestigen Sie den Körper in den schleichenden Haltern, die wir zuvor gedruckt haben. Jetzt ist der Körper bereit, programmiert zu werden.

Schritt 8: Programmierzeit

Da wir zwei Particle Photons verwenden werden, um mit sechs separaten Servomotoren zu arbeiten (ein Photon kann nur mit vier arbeiten), werden wir zwei separate, aber ähnliche Codes schreiben, die auf den Mikrocontrollern geflasht werden.

Nun zum ersten Mikrocontroller…

Fügen Sie in eine Arduino-Datei (.ino) die folgenden Bibliotheken und Definitionen ein:

#include "neopixel.h"

#include "ArduinoJson.h"

#define PIXEL_PIN D4

#define PIXEL_COUNT 18

Als nächstes deklarieren Sie die folgenden Variablen:

Adafruit_NeoPixel-Streifen = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN);

ServoservoLeftRight_1; Servo-ServoUpDown_1; ServoservoLeftRight_2; Servo-ServoUpDown_2; int positionLeftRight_1 = 0; int positionUpDown_1 = 0; int leftRight_1 = 1; int upDown_1 = 1; int positionLeftRight_2 = 100; // muss zwischen 0 und 180 (in Grad) liegen int positionUpDown_2 = 180; // muss zwischen 0 und 180 (in Grad) liegen int leftRight_2 = 1; //0=links, 1=rechts int upDown_2 = 1; //0=up, 1=down 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(3) + 38*JSON_OBJECT + J_. SIZE(4) (5) + 76*JSON_OBJECT_SIZE(8) + 12490; Zeichenfolge WeatherArray[3]; Float-TemperaturArray[3]; Float-Feuchtigkeits-Array[3]; float windSpeedArray[3]; Zeichenfolgen-ZeitstempelArray[3]; int upDownMaxDegree[3]; int leftRightSpeed[3]; String allData5DaysForecast;

Klicken Sie hier, um zu erfahren, wie Sie Webhooks einrichten. Wenn Sie fertig sind, fügen Sie die folgenden Deklarationen und Funktionen hinzu und nehmen Sie gegebenenfalls die entsprechenden Änderungen vor:

void getWeather5DayForecast() { Particle.publish("get_weather5DayForecast"); allData5DaysForecast = ""; } Timer-TimerWeatherForecast(60000, getWeather5DayForecast); void getCurrentWeather() { Particle.publish("get_currentWeather"); } Timer-TimerWeatherCurrent(60000, getCurrentWeather);

Die folgenden Funktionen steuern die Auf-/Ab- und Links-/Rechts-Bewegungen des Drachen:

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

Um die Bewegungen in einem Intervall ändern zu können, werden Timer erstellt.

Timer-TimerLeftRight1(100, changeLeftRight1);

Timer-TimerLeftRight2(100, changeLeftRight2); Timer-TimerUpDown1(10, changeUpDown1); Timer-TimerUpDown2(10, changeUpDown2);

Als nächstes kommt schließlich die Setup-Funktion hinzu. Stellen Sie sicher, dass Sie die Codezeilen für Webhooks entsprechend ändern.

Void setup () {// die Wetter-Timer starten timerWeatherForecast.start (); TimerWetterAktuell.start(); // Neopixel strip.begin (); // Setzen Sie die Initialisierung wie pinMode und beginnen Sie hier mit Funktionen. // Richten Sie den Micro Servo servoLeftRight_1.attach (D1) ein; servoUpDown_1.attach(D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach(D2); servoLeftRight_1.write(positionLeftRight_1); // Servoposition initialisieren servoUpDown_1.write (positionUpDown_1); // Servoposition initialisieren servoLeftRight_2.write (positionLeftRight_2); // Servoposition initialisieren servoUpDown_2.write (positionUpDown_2); // Servopositionstimer initialisierenLeftRight1.start (); timerLeftRight2.start(); TimerUpDown1.start(); TimerUpDown2.start(); // Öffnen Sie eine Konsole Serial.begin (9600); Verzögerung (2000); Serial.println ("Hallo!"); // Abonnieren Sie die Webhooks get_weather5DayForecast und get_currentWeather Particle.subscribe("hook-response/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe("hook-response/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getAktuellesWetter(); getWeather5DayForecast(); }

Eine Schleifenfunktion wird für dieses Projekt nicht verwendet. Wir dürfen die Funktionen zur Verarbeitung der von den Webhooks empfangenen Daten nicht vergessen!

void gotWeather5DayForecast(const char *event, const char *data){ allData5DaysForecast += data; // speichert alle Daten in einem String. int allData5DaysForecastLen = allData5DaysForecast.length(); Zeichenpuffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray(Puffer, allData5DaysForecastLen + 1); // einen Puffer für den String erstellen int bufferLength = sizeof(buffer); DynamicJsonBuffer jsonBufferWeather(bufferLength); JsonObject& root = jsonBufferWeather.parseObject(buffer); // Testen, ob das Parsen erfolgreich ist. if (!root.success()) { //Serial.println("Parsing für die Wettervorhersage für 5 Tage…FEHLER!"); Rückkehr; } int i = 1; JsonArray& list = root["list"]; for (JsonObject& currentObject: list){ if (i < 3){ JsonObject& main = currentObject["main"]; Schwimmertemperatur = main["temp"]; int Luftfeuchtigkeit = main["Luftfeuchtigkeit"]; JsonObject& Wetter = currentObject["Wetter"][0]; const char* weatherInfo = weather["main"]; float windSpeed = currentObject["wind"]["speed"]; const char* Zeitstempel = currentObject["dt_txt"]; int tempFah = convertToFahrenheit(temperatur); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = ServoInkrement; setColor(WetterInfo, i); temperatureArray = tempFah; FeuchtigkeitArray = Feuchtigkeit; WetterArray = WetterInfo; windSpeedArray = windSpeed; ZeitstempelArray = Zeitstempel; i++; } sonst{ Pause; } } }

void gotCurrentWeatherData(const char *event, const char *data){ DynamicJsonBuffer jsonBufferWeather(bufferSizeCurrent); JsonObject& root = jsonBufferWeather.parseObject(data); // Testen, ob das Parsen erfolgreich ist. if (!root.success()) { //Serial.println("Parsing für aktuelles Wetter…FEHLER!"); Rückkehr; } JsonObject& Wetter = root["Wetter"][0]; const char* weather_main = weather["main"]; JsonObject& main = root["main"]; float main_temp = main["temp"]; int main_humidity = main["Luftfeuchtigkeit"]; float wind_speed = root["wind"]["speed"]; const char* Zeitstempel = root["dt_txt"]; int tempFah = convertToFahrenheit(main_temp); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree[0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed[0] = ServoInkrement; setColor (wetter_main, 0); WetterArray[0] = Wetter_Haupt; temperatureArray[0] = tempFah; FeuchtigkeitArray[0]= main_humidity; windSpeedArray[0] = wind_speed; ZeitstempelArray[0] = Zeitstempel; }

Nachfolgend finden Sie zusätzliche Funktionen, die die Aktualisierung der Position der Servomotoren, die Umrechnung der Temperatur von Kelvin in Fahrenheit und die Einstellung der Farben der LEDs steuern.

int updateUpDown (float temp) {// Weisen Sie den Grad auf einen Bereich von [0, 180] zu float servoMaxDegree = temp * 45 / 31 + (990 / 31); Serial.print("neuer Servograd:"); Serial.println (servoMaxDegree); Rückgabe von servoMaxDegree; }

int updateleftRight(float windSpeed){

// Ordne die Windgeschwindigkeit einem Bereich von [1, 100] zu. float servoIncrement = windSpeed * 99 / 26 + 1; Serial.print ("neuer Servoinkrementwert: "); Serial.println (servoIncrement); ServoInkrement zurückgeben; }

int convertToFahrenheit(float tempKel){

int tempFah = tempKel * 9,0 / 5,0 - 459,67; Rückgabe tempFah; }

void setColor(String weatherDesc, int index){

int ledIndex = 0; wenn (Index == 0) {ledIndex = 0; aufrechtzuerhalten. Sonst wenn (Index == 1) {ledIndex = 6; aufrechtzuerhalten. Sonst wenn (Index == 2) {ledIndex = 12; } sonst{ zurück; } if(weatherDesc == "Clear") {//gelb für (int j = ledIndex; j <ledIndex+6; j++) { strip.setPixelColor(j, strip. Color(253, 219, 62)); // gelber Streifen.show(); Verzögerung (20); aufrechtzuerhalten. // grauer Streifen.show (); Verzögerung (20); } } Else if (weatherDesc == "Snow") {//weiß für (int j = ledIndex; j <ledIndex + 6; j++) { strip.setPixelColor (j, strip. Color (255, 225, 225)); //weißer Streifen.show(); Verzögerung (20); aufrechtzuerhalten. // blauer Streifen.show (); Verzögerung (20); aufrechtzuerhalten. Verzögerung (20); } } }

Sobald Sie alles zu Ihrer Arduino-Datei hinzugefügt haben, kompilieren Sie sie. Wenn es keine Fehler gibt, fahren Sie fort und flashen Sie den Code auf das erste Photon. Im nächsten Schritt erhalten Sie einen ähnlichen Code, der auf dem zweiten Photon geflasht wird.

Schritt 9: Die Programmierung wird fortgesetzt

Da der Code für das zweite Photon fast identisch mit dem des ersten ist, wird der gesamte Code kopiert und unten eingefügt:

#include "ArduinoJson.h"

ServoservoLeftRight_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(3) + 38*JSON_OBJECT + J_SIZE(4) (5) + 76*JSON_OBJECT_SIZE(8) + 12490;

Zeichenfolge WeatherArray[3];

Float-TemperaturArray[3]; Float-Feuchtigkeits-Array[3]; float windSpeedArray[3]; Zeichenfolgen-ZeitstempelArray[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 Tage

void getCurrentWeather()

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

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

Leere Einrichtung () {

// starte die Wetter-Timer timerWeatherForecast.start(); TimerWetterAktuell.start(); // Setzen Sie die Initialisierung wie pinMode und beginnen Sie hier mit Funktionen. // Richten Sie den Micro Servo servoLeftRight_3.attach (D1) ein; servoUpDown_3.attach(D0);

servoLeftRight_3.write (positionLeftRight_3); // Servoposition initialisieren

servoUpDown_3.write (positionUpDown_3); // Servoposition initialisieren

timerLeftRight3.start();

TimerUpDown3.start(); // Öffnen Sie eine Konsole Serial.begin (9600); Verzögerung (2000); Serial.println ("Hallo!"); // Abonnieren Sie die Webhooks get_weather5DayForecast und get_currentWeather Particle.subscribe("hook-response/get_weather5DayForecast2", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe("hook-response/get_currentWeather2/0", gotCurrentWeatherData, MY_DEVICES); getAktuellesWetter(); getWeather5DayForecast(); }

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

{ allData5DaysForecast += Daten; // speichert alle Daten in einem String. int allData5DaysForecastLen = allData5DaysForecast.length(); Zeichenpuffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray(Puffer, allData5DaysForecastLen + 1); // einen Puffer für den String erstellen int bufferLength = sizeof(buffer); DynamicJsonBuffer jsonBufferWeather(bufferLength); JsonObject& root = jsonBufferWeather.parseObject(buffer); //Serial.println (allData5DaysForecast); // Testen, ob das Parsen erfolgreich ist. if (!root.success()) { //Serial.println("Parsing für die Wettervorhersage für 5 Tage…FEHLER!"); Rückkehr; } int i = 1; JsonArray& list = root["list"]; for (JsonObject& currentObject: list){ if (i < 3){ JsonObject& main = currentObject["main"]; Schwimmertemperatur = main["temp"]; int Luftfeuchtigkeit = main["Luftfeuchtigkeit"]; JsonObject& Wetter = currentObject["Wetter"][0]; const char* weatherInfo = weather["main"]; float windSpeed = currentObject["wind"]["speed"]; const char* Zeitstempel = currentObject["dt_txt"]; int tempFah = convertToFahrenheit(temperatur); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = ServoInkrement; temperatureArray = tempFah; FeuchtigkeitArray = Feuchtigkeit; WetterArray = WetterInfo; windSpeedArray = windSpeed; ZeitstempelArray = Zeitstempel; i++; } sonst{ Pause; } } }

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

{ DynamicJsonBuffer jsonBufferWeather(bufferSizeCurrent); JsonObject& root = jsonBufferWeather.parseObject(data); //Seriell.println (Daten); // Testen, ob das Parsen erfolgreich ist. if (!root.success()) { //Serial.println("Parsing für aktuelles Wetter…FEHLER!"); Rückkehr; } JsonObject& Wetter = root["Wetter"][0]; const char* weather_main = weather["main"]; JsonObject& main = root["main"]; float main_temp = main["temp"]; int main_humidity = main["Luftfeuchtigkeit"]; float wind_speed = root["wind"]["speed"]; const char* Zeitstempel = root["dt_txt"]; int tempFah = convertToFahrenheit(main_temp); int servoMaxDegree = updateUpDown(tempFah); upDownMaxDegree[0] = servoMaxDegree; int servoIncrement = updateleftRight (wind_speed); leftRightSpeed[0] = ServoInkrement; WetterArray[0] = Wetter_Haupt; temperatureArray[0] = tempFah; FeuchtigkeitArray[0]= main_humidity; windSpeedArray[0] = wind_speed; ZeitstempelArray[0] = Zeitstempel; }

int updateUpDown(float temp){

// Ordne den Grad einem Bereich von [0, 180] zu float servoMaxDegree = temp * 45 / 31 + (990 / 31); Serial.print("neuer Servograd:"); Serial.println (servoMaxDegree); Rückgabe von servoMaxDegree; }

int updateleftRight(float windSpeed){

// Ordne die Windgeschwindigkeit einem Bereich von [1, 100] zu. float servoIncrement = windSpeed * 99 / 26 + 1; Serial.print ("neuer Servoinkrementwert: "); Serial.println (servoIncrement); ServoInkrement zurückgeben; }

int convertToFahrenheit(float tempKel){

int tempFah = tempKel * 9,0 / 5,0 - 459,67; Rückgabe tempFah; }

Du hast es geschafft! Sie haben es durch den Programmierabschnitt des Projekts geschafft! Stellen Sie nun sicher, dass Sie alle Kabel und Verbindungen von den Servomotoren und Neopixeln zum Steckbrett und zu den Mikrocontrollern herstellen. HINWEIS: Stecken Sie die zusätzlichen Dübel / Essstäbchen durch die vertikalen Schlitze an den Kästen für die linke und rechte Bewegung des Körpers. Das andere Ende sollte mit dem Körper des Drachen verbunden werden.

Schritt 10: Genießen Sie Ihren Drachen

Herzliche Glückwünsche! Du hast einen Sinus-Drachen von Grund auf neu gebaut! Jetzt müssen Sie sich nur noch zurücklehnen und Ihr Ambient-Display genießen!

HINWEIS: Dieses Projekt wurde als Teil einer Kursarbeit von Joan Bempong und Soundarya Muthuvel erstellt. Die Kursseite finden Sie hier.