Πίνακας περιεχομένων:
- Βήμα 1: Πάνω και κάτω
- Βήμα 2: Τι γίνεται με την Αριστερά και τη Δεξιά;
- Βήμα 3: Κρατώντας το σώμα… ΠΩΣ;
- Βήμα 4: Αλλά αυτά τα κουτιά δεν είναι τόσο όμορφα…
- Βήμα 5: Slinky Toys; Ω θεε μου
- Βήμα 6: Εκτυπώστε τον Δράκο σας
- Βήμα 7: Timeρα να ενισχύσετε τον δράκο σας με NeoPixels
- Βήμα 8: Χρόνος προγραμματισμού
- Βήμα 9: Ο προγραμματισμός συνεχίζεται
- Βήμα 10: Απολαύστε τον Δράκο σας
Βίντεο: Sine-ese Dragon: 10 βήματα (με εικόνες)
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:38
Το Sine-ese Dragon είναι ένα κομμάτι διακόσμησης σπιτιού που χρησιμοποιεί μηχανικές κινήσεις και φώτα για να σας ενημερώσει για την πρόγνωση του καιρού για τα επόμενα τρία διαστήματα τριών ωρών. Εξ ορισμού, το περιβάλλον περιγράφει το άμεσο περιβάλλον ενός πράγματος. Ως εκ τούτου, αποφασίστηκε ότι ήταν σκόπιμο να ενσωματωθούν δεδομένα καιρού σε μια οθόνη περιβάλλοντος. Ο καιρός είναι μια πτυχή που αλλάζει ακούσια την ημέρα των ανθρώπων και είναι μια πληροφορία που αλλάζει συνεχώς κάθε λεπτό, ή ακόμα και στο δεύτερο.
Ο κινεζικός δράκος είναι «σύμβολο δύναμης, δύναμης και καλής τύχης» και συχνά διατηρείται σε υψηλή πολιτιστική και παραδοσιακή αξία σε όλη την ασιατική υποήπειρο. Εκτός από την καλή τύχη, ο κινεζικός δράκος λέγεται ότι έχει επίσης ισχυρές δυνάμεις που ελέγχουν «το νερό, τις βροχοπτώσεις, τους τυφώνες και τις πλημμύρες». Τελικά, ο κινεζικός δράκος κρίθηκε κατάλληλος να αντιπροσωπεύει δεδομένα καιρού.
Οραματισμός
Ο Δράκος Sine-ese χειρίζεται σε έξι κύρια σημεία σε τρία ξεχωριστά τμήματα που αντιπροσωπεύουν την πρόγνωση του καιρού για τρία διαστήματα 3 ωρών. Για κάθε διάστημα 3 ωρών, θα περιλαμβάνονται οι ακόλουθες πληροφορίες:
- Περιγραφή καιρού - καθορίζει το χρώμα των πληροφοριών για τον καιρό.
- Θερμοκρασία - καθορίζει το ύψος του σώματος
- Υγρασία - αναβοσβήνει στα τμήματα LED
- Ταχύτητα ανέμου - ελέγχει την ταχύτητα του σώματος που κινείται αριστερά και δεξιά.
Απαιτούμενα υλικά
- Κόντρα πλακέ 3 mm/Χαρτόνι
- Ξύλινοι πείροι ή ξυλάκια 5 mm
- 2 Φωτόνια σωματιδίων
- 3 Slinky παιχνίδια
- 6 σερβοκινητήρες
- Φώτα NeoPixel (είτε ένα σκέλος είτε μεμονωμένα φώτα ραμμένα μαζί)
- Πολλή σούπερ κόλλα
- Αγώγιμο νήμα
- Ακρυλική μπογιά
- Διακοσμητικό ύφασμα
- Κόφτης λέιζερ
- Τρισδιάστατος εκτυπωτής
Βήμα 1: Πάνω και κάτω
Το πρώτο σας βήμα για την οικοδόμηση του Sine-ese Dragon είναι η κατασκευή του εξαρτήματος που ελέγχει την κίνηση πάνω και κάτω του σώματος. Πόσο συναρπαστικό!
-
Κατεβάστε τα αρχεία Adobe Illustrator (.ai) και εκτυπώστε τα χρησιμοποιώντας ένα μηχάνημα κοπής λέιζερ.
Το upDownBoxWithPlatform.ai θα πρέπει να εκτυπώνεται σε χαρτόνι
-
Κατεβάστε τα αρχεία εκτύπωσης 3D (.stl) και χρησιμοποιήστε τον αγαπημένο σας εκτυπωτή 3D για να τα εκτυπώσετε.
Το χρώμα δεν έχει σημασία για το δίσκο ή το δίσκο περιστροφής. Στη δεύτερη εικόνα, ο περιστροφέας δίσκου έχει εισαχθεί μέσα στην οπή του δίσκου
-
Συγκεντρώστε τα δύο πρώτα εξαρτήματα και κολλήστε τα όπως φαίνεται στις εικόνες 3 έως 5.
- Η πλατφόρμα
- Οι αυλακώσεις για το δίσκο
-
Τώρα, συγκεντρώστε το πλαίσιο ακολουθώντας τις παρακάτω συμβουλές.
- Τα καλώδια του σερβο πρέπει να περάσουν από το ορθογώνιο άνοιγμα στο πλάι του κουτιού.
- Το συντομότερο άκρο του περιστροφικού δίσκου συνδέεται με την κεφαλή σερβομηχανισμού και το μεγαλύτερο άκρο περνά μέσα από την οπή της άλλης πλευράς του κουτιού με μια κυκλική τρύπα πάνω του. Αυτό αποδεικνύεται στην εικόνα 6.
- Τώρα, χρειαζόμαστε κάτι για να διασφαλίσουμε ότι η πλατφόρμα παραμένει επίπεδη όταν γυρίζει ο δίσκος. Κόψτε το ξυλάκι σε μπαστούνια μήκους 75 mm (εικόνα 7) και κολλήστε τα από την κορυφή του κουτιού στην κορυφή της πλατφόρμας χρησιμοποιώντας ζεστή κόλλα. Βεβαιωθείτε ότι τα ραβδιά είναι ισοπεδωμένα σε 90 μοίρες προς την πλατφόρμα.
- Τοποθετήστε ένα ραβδί μήκους 212 mm στη μεσαία τρύπα στο πάνω μέρος του κουτιού στην πλατφόρμα.
Γλυκός! Τώρα έχετε ένα πλήρες κουτί (εικόνα 8) για την κίνηση πάνω και κάτω του δράκου. Τώρα, επαναλάβετε τα παραπάνω βήματα άλλες δύο φορές!
Βήμα 2: Τι γίνεται με την Αριστερά και τη Δεξιά;
Τώρα, δεν μπορούμε να ξεχνάμε την αριστερή και δεξιά κίνηση του Sine-ese Dragon, έτσι δεν είναι; Ας περάσουμε στο δεύτερο βήμα!
-
Κατεβάστε τα αρχεία Adobe Illustrator (.ai) και εκτυπώστε τα χρησιμοποιώντας ένα μηχάνημα κοπής λέιζερ.
- leftRightBoxWithPlatforms.ai θα πρέπει να εκτυπώνεται σε χαρτόνι.
- Το αρχείο armTurner.ai πρέπει να εκτυπώνεται σε υλικό πάχους 3 mm.
-
Κατεβάστε τα αρχεία εκτύπωσης 3D (.stl) και χρησιμοποιήστε τον αγαπημένο σας εκτυπωτή 3D για να τα εκτυπώσετε.
Βεβαιωθείτε ότι έχετε εκτυπώσει δύο από τους βραχίονες! Το χρώμα δεν έχει σημασία εδώ
- Συναρμολογήστε τις δύο πλατφόρμες μαζί όπως φαίνεται στην εικόνα 3 χρησιμοποιώντας θερμή κόλλα.
-
Βάλτε μαζί το κουτί. Αν και μπορεί να είναι δύσκολο να το κάνετε αυτό, είναι πιο εύκολο να το επιτύχετε με:
- Τοποθετώντας τις δύο πλατφόρμες ανάμεσα στις δύο μεγάλες σχισμές εκατέρωθεν του κουτιού.
- Τοποθετώντας τον πρώτο βραχίονα στην κορυφή της επάνω πλατφόρμας.
- Περάστε τον περιστροφικό βραχίονα μέσω του βραχίονα και στη συνέχεια στην επάνω πλατφόρμα.
- Τοποθετώντας τον δεύτερο βραχίονα στην κορυφή της κάτω πλατφόρμας.
- Περάστε τον περιστροφικό βραχίονα μέσω του δεύτερου βραχίονα και στη συνέχεια της κάτω πλατφόρμας.
- Κολλήστε τον περιστροφικό βραχίονα μέσα από το ορθογώνιο άνοιγμα του τρισδιάστατου τυπωμένου περιστροφικού βραχίονα.
- Το άλλο άκρο του περιστροφέα πηγαίνει πάνω από το σερβοκινητήρα.
- Προσθέστε τα επάνω, κάτω και πίσω κομμάτια στο κουτί.
Το τελευταίο συναρμολογημένο κουτί σας πρέπει να μοιάζει με την έκτη εικόνα. Τώρα, πρέπει να το επαναλάβετε άλλες δύο φορές!
Στο τέλος αυτού του βήματος, θα πρέπει να έχετε έξι κουτιά με τρία το καθένα από τα συστήματα κίνησης πάνω/κάτω και αριστερά/δεξιά.
Βήμα 3: Κρατώντας το σώμα… ΠΩΣ;
Καλή ερώτηση! Τότε έρχονται αυτές οι υποδοχές slinky με 3D εκτύπωση. Κατεβάστε το συμπεριλαμβανόμενο αρχείο.stl και εκτυπώστε το χρησιμοποιώντας έναν 3D εκτυπωτή. Φροντίστε να εκτυπώσετε συνολικά 6 θήκες για τα 6 διαφορετικά κουτιά.
Αν έχετε δει την εικόνα της γοητευτικής θήκης παραπάνω, η έκπληξη έχει καταστραφεί - αυτό είναι το χρώμα του Sine -ese Dragon μας!
Βήμα 4: Αλλά αυτά τα κουτιά δεν είναι τόσο όμορφα…
Και συμφωνώ! Αυτός είναι ο λόγος για τον οποίο θα χρησιμοποιήσουμε έναν κόφτη λέιζερ για να κόψουμε ένα πολύ πιο ελκυστικό κουτί για να περιέχει όλα αυτά τα κουτιά και να τα κρύψουμε.
Κατεβάστε αυτά τα αρχεία Adobe Illustrator και κόψτε τα χρησιμοποιώντας τον κόφτη λέιζερ. Ο σχεδιασμός των σύννεφων σχεδιάστηκε με το χέρι από έναν από τους συντελεστές. Μη διστάσετε να τα τροποποιήσετε αφαιρώντας τα μέσα στο αρχείο εικονογράφησης και προσθέτοντας το δικό σας σχέδιο όπως σας ταιριάζει! Παρακάτω είναι τα προτεινόμενα βήματα για να συνδυάσετε τα πάντα.
- Συγκεντρώστε και κολλήστε και τα τρία κομμάτια από το πρώτο αρχείο (outerBoxFinal_1) μαζί.
- Μην προσθέσετε ακόμα το κομμάτι από το δεύτερο αρχείο (externalBoxFinal_2).
- Βάλτε το κομμάτι από το τρίτο αρχείο (outerBoxFinal_3) στο κάτω μέρος του κουτιού και θα πρέπει να κλείσει στο επάνω μέρος. Κολλήστε ΜΟΝΟ στο κάτω μέρος του κουτιού.
- Εκτυπώστε το εσωτερικόBoxesPlatform δύο φορές. Κολλήστε μαζί τα δύο κομμάτια που έχουν μεγάλες ορθογώνιες οπές. Στη συνέχεια, κολλήστε τρία από τα υπόλοιπα κομμάτια μεταξύ τους. Τέλος, κολλήστε το στο άλλο κολλημένο σετ με τρύπες.
- Τοποθετήστε την πλατφόρμα στο κάτω μέρος του μεγάλου κουτιού.
- Τοποθετήστε και τα 6 μικρότερα κουτιά στις αντίστοιχες θέσεις τους στην πλατφόρμα.
- Τώρα, τοποθετήστε το κομμάτι από το δεύτερο αρχείο (outerBoxFinal_2) στην κορυφή του κουτιού και κολλήστε γύρω από την άκρη. Οι οπές στο πάνω κομμάτι πρέπει να ευθυγραμμίζονται με τις τρύπες στα μικρότερα κουτιά. Εάν όχι, αναδιατάξτε τα μικρότερα κουτιά σας. Μην προσθέτετε καθόλου κόλλα στα μικρότερα κουτιά.
- Εάν χρησιμοποιείτε ένα breadboard που έχει ένα κολλώδες κομμάτι στο κάτω μέρος, τοποθετήστε το κοντά στο κέντρο του κάτω τεμαχίου σε ένα μέρος που όταν κλείνετε το κουτί, το ψωμί μαζί με τα Photons θα πρέπει να εξαφανιστεί. Υπάρχουν μικρές σχισμές στο κάτω κομμάτι που σας διευκολύνουν να συνδεθείτε με τα Φωτόνια από έξω.
Βήμα 5: Slinky Toys; Ω θεε μου
Το σώμα του δράκου:
1. Συνδυάστε τρία slinkies μαζί χρησιμοποιώντας ζεστή κόλλα ή ταινία.
2. Μετρήστε το μήκος και τη διάμετρο των slinkies και κόψτε ένα κομμάτι διακοσμητικού υφάσματος.
3. Φέρτε τα δύο άκρα του υφάσματος και ράψτε τα μεταξύ τους.
4. Μόλις τελειώσετε με το ράψιμο, σύρετε τα slinkies σαν κάλτσα.
5. Ράψτε τις άκρες του slinky στο ραμμένο ύφασμα.
Βήμα 6: Εκτυπώστε τον Δράκο σας
Τρισδιάστατα τυπωμένα μέρη του δράκου:
1. Τα μέρη πάρθηκαν από τη διεύθυνση
2. Χρησιμοποιήσαμε μόνο το κεφάλι, τα πόδια και τα μάτια.
3. Μετά την τρισδιάστατη εκτύπωση του εξαρτήματος, εξομαλύνετε το χρησιμοποιώντας γυαλόχαρτο και ακετόνη.
4. Βάψτε τα μέρη με τον τρόπο που θέλετε να το διακοσμήσετε.
Βήμα 7: Timeρα να ενισχύσετε τον δράκο σας με NeoPixels
Φωτεινό τμήμα:
1. Μπορείτε απλώς να χρησιμοποιήσετε ένα σκέλος neopixel για να δημιουργήσετε τα φώτα αν θέλετε. (Ξεμείναμε από τα σκέλη).
2. Χρησιμοποιήσαμε 20 φώτα neopixel και τα συνδέσαμε χρησιμοποιώντας καλώδια. Αυτά τα σύρματα συγκολλήθηκαν πάνω τους και συνδέθηκαν με το φωτόνιο χρησιμοποιώντας κόκκινη καλωδίωση, έτσι ώστε να ταιριάζει με το θέμα του δράκου.
3. Μπορείτε επίσης να ράψετε τα φώτα neopixel σε ένα μακρύ κομμάτι ύφασμα, αλλά δεν τα χρησιμοποιήσαμε επειδή είχαμε ένα slinky κατασκευασμένο από μέταλλο.
Συναρμολόγηση των τμημάτων: Ασφαλίστε το τμήμα φωτός μέσα στο σώμα του δράκου χρησιμοποιώντας νήματα ή σύρματα. Βεβαιωθείτε ότι είστε σε θέση να συνδέσετε τα φώτα στο φωτόνιο στο πλαίσιο βάσης. Συνδέστε το κεφάλι, τα πόδια και την ουρά στο σώμα χρησιμοποιώντας κόλλα. Μόλις είναι στη θέση τους, ασφαλίστε το σώμα στις υποδοχές που εκτυπώσαμε πριν. Τώρα το σώμα είναι έτοιμο για προγραμματισμό.
Βήμα 8: Χρόνος προγραμματισμού
Δεδομένου ότι θα χρησιμοποιήσουμε δύο Φωτόνια σωματιδίων για να λειτουργήσουμε με έξι ξεχωριστούς σερβοκινητήρες (ένα Photon μπορεί να λειτουργήσει μόνο με τέσσερα), θα γράψουμε δύο ξεχωριστούς αλλά παρόμοιους κωδικούς που θα αναβοσβήνουν στους μικροελεγκτές.
Τώρα, για τον πρώτο μικροελεγκτή…
Σε ένα αρχείο Arduino (.ino), συμπεριλάβετε τις ακόλουθες βιβλιοθήκες και ορίζετε:
#include "neopixel.h"
#include "ArduinoJson.h"
#define PIXEL_PIN D4
#define PIXEL_COUNT 18
Στη συνέχεια, δηλώστε τις ακόλουθες μεταβλητές:
Λωρίδα Adafruit_NeoPixel = 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; // πρέπει να είναι μεταξύ 0 και 180 (σε μοίρες) int positionUpDown_2 = 180? // πρέπει να είναι μεταξύ 0 και 180 (σε μοίρες) int αριστεράRight_2 = 1. // 0 = αριστερά, 1 = δεξιά int upDown_2 = 1; // 0 = πάνω, 1 = κάτω const size_t bufferSizeCurrent = JSON_ARRAY_SIZE (1) + JSON_OBJECT_SIZE (1) + 2*JSON_OBJECT_SIZE (2) + JSON_OBJECT_SIZE (4) + JEJS (4) 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_SIZE (4) + JSON_OBJECT_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490; String weatherArray [3]; θερμοκρασία επίπλευσηςArray [3]; float humidityArray [3]; float windSpeedArray [3]; Χρονική σήμανση συμβολοσειράςArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; Συμβολοσειρά allData5DaysForecast;
Κάντε κλικ εδώ για να μάθετε πώς να ρυθμίζετε webhooks. Όταν τελειώσετε, προσθέστε τις ακόλουθες δηλώσεις και συναρτήσεις και κάντε τις κατάλληλες αλλαγές εάν είναι απαραίτητο:
void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Timer timerWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } Timer timerWeatherCurrent (60000, getCurrentWeather);
Οι ακόλουθες λειτουργίες ελέγχουν τις κινήσεις πάνω/κάτω και αριστερά/δεξιά του δράκου:
void changeLeftRight1 () {if (leftRight_1) {positionLeftRight_1 = positionLeftRight_1 + leftRightSpeed [0]; εάν (positionLeftRight_1> 100) {leftRight_1 = 0; }} else {positionLeftRight_1 = positionLeftRight_1 - leftRightSpeed [0]; εάν (positionLeftRight_1 <0) {leftRight_1 = 1; }} servoLeftRight_1.write (positionLeftRight_1); }
void changeLeftRight2 () {
εάν (leftRight_2) {positionLeftRight_2 = positionLeftRight_2 + leftRightSpeed [1]; εάν (positionLeftRight_2> 100) {leftRight_2 = 0; }} else {positionLeftRight_2 = positionLeftRight_2 - leftRightSpeed [1]; εάν (positionLeftRight_2 <0) {leftRight_2 = 1; }} servoLeftRight_2.write (positionLeftRight_2); }
void changeUpDown1 () {
εάν (upDown_1) {positionUpDown_1 ++; εάν (positionUpDown_1> upDownMaxDegree [0]) {upDown_1 = 0; }} else {positionUpDown_1--; εάν (positionUpDown_1 <1) {upDown_1 = 1; }} servoUpDown_1.write (positionUpDown_1); }
void changeUpDown2 () {
εάν (upDown_2) {positionUpDown_2 ++; εάν (positionUpDown_2> upDownMaxDegree [1]) {upDown_2 = 0; }} else {positionUpDown_2--; εάν (positionUpDown_2 <1) {upDown_2 = 1; }} servoUpDown_2.write (positionUpDown_2); }
Για να μπορείτε να αλλάζετε τις κινήσεις σε ένα διάστημα, δημιουργούνται χρονόμετρα.
Timer timerLeftRight1 (100, changeLeftRight1);
Timer timerLeftRight2 (100, changeLeftRight2); Timer timerUpDown1 (10, changeUpDown1); Timer timerUpDown2 (10, changeUpDown2);
Η λειτουργία ρύθμισης προστίθεται τελικά στη συνέχεια. Φροντίστε να κάνετε τις κατάλληλες αλλαγές στις γραμμές κώδικα που ασχολούνται με τα webhooks.
void setup () {// εκκίνηση των χρονομετρητών καιρού timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels strip.begin (); // Βάλτε την αρχικοποίηση όπως το pinMode και ξεκινήστε τις συναρτήσεις εδώ. // Ρύθμιση του Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // αρχικοποίηση servoUpDown_1.write position (positionUpDown_1); // αρχικοποίηση servoLeftRight_2.write position (positionLeftRight_2); // αρχικοποίηση servoUpDown_2.write position (positionUpDown_2); // αρχικοποίηση servo position timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Άνοιγμα κονσόλας Serial.begin (9600); καθυστέρηση (2000). Serial.println ("Γεια σας!"); // Εγγραφείτε στο get_weather5DayForecast και get_currentWeather webhooks Particle.subscribe ("hook-respond/get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-respond/get_currentWeather/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }
Μια συνάρτηση βρόχου δεν χρησιμοποιείται για αυτό το έργο. Δεν μπορούμε να ξεχάσουμε τις λειτουργίες χειρισμού των δεδομένων που λαμβάνονται από τα webhooks!
void gotWeather5DayForecast (const char *event, const char *data) {allData5DaysForecast += data; // αποθηκεύει όλα τα δεδομένα σε μια συμβολοσειρά. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // δημιουργήστε ένα buffer για τη συμβολοσειρά int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); // Δοκιμάστε αν η ανάλυση επιτύχει. εάν (! root.success ()) {//Serial.println("Προσδιορισμός καιρού 5 ημερών πρόβλεψη … ΛΑΘΟΣ! "); ΕΠΙΣΤΡΟΦΗ; } int i = 1; JsonArray & list = root ["list"]; για (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; θερμοκρασία πλωτήρα = κύρια ["θερμοκρασία"]; int υγρασία = κύρια ["υγρασία"]; JsonObject & weather = currentObject ["καιρός"] [0]; const char* weatherInfo = καιρός ["κύριος"]; float windSpeed = currentObject ["άνεμος"] ["ταχύτητα"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (θερμοκρασία); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); temperatureArray = tempFah; υγρασίαΣυστοιχία = υγρασία; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; i ++? } else {break; }}}
void gotCurrentWeatherData (const char *event, const char *data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (δεδομένα); // Δοκιμάστε αν η ανάλυση επιτύχει. εάν (! root.success ()) {//Serial.println("Παρακολούθηση για τις τρέχουσες καιρικές συνθήκες … ΛΑΘΟΣ! "); ΕΠΙΣΤΡΟΦΗ; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = καιρός ["κύρια"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["υγρασία"]; float wind_speed = ρίζα ["άνεμος"] ["ταχύτητα"]; 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] = κύριος καιρός; temperatureArray [0] = tempFah; υγρασίαΣυσκευή [0] = κύρια_ υγρασία. windSpeedArray [0] = ταχύτητα wind_speed; timestampArray [0] = timestamp; }
Παρακάτω, μπορείτε να βρείτε πρόσθετες λειτουργίες που ελέγχουν την ενημέρωση των θέσεων των σερβοκινητήρων, τη μετατροπή της θερμοκρασίας από το Κέλβιν σε Φαρενάιτ και τον καθορισμό των χρωμάτων των LED.
int updateUpDown (float temp) {// Χαρτογραφήστε το βαθμό σε εύρος [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("new servo degree:"); Serial.println (servoMaxDegree); επιστροφή servoMaxDegree; }
int updateleftRight (float windSpeed) {
// Χαρτογραφήστε την ταχύτητα του ανέμου σε εύρος [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("νέα τιμή αύξησης σερβο:"); Serial.println (servoIncrement); επιστροφή servoIncrement? }
int convertToFahrenheit (float tempKel) {
int tempFah = tempKel * 9.0 / 5.0 - 459.67; επιστροφή 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; } else {επιστροφή; } if (weatherDesc == "Clear") {// yellow για (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (253, 219, 62))); // κίτρινη λωρίδα. εμφάνιση (); καθυστέρηση (20)? }} else if (weatherDesc == "Σύννεφα") {// γκρι για (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // γκρι strip.show (); καθυστέρηση (20)? }} else if (weatherDesc == "Χιόνι") {// λευκό για (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // λευκή λωρίδα. εμφάνιση (); καθυστέρηση (20)? }} else if (weatherDesc == "Βροχή") {// μπλε για (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (119, 191, 246)); // μπλε strip.show (); καθυστέρηση (20)? }} else {// red for (int j = ledIndex; j <ledIndex+6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // red strip.show (); καθυστέρηση (20)? }}}
Μόλις προσθέσετε τα πάντα στο αρχείο Arduino, μεταγλωττίστε το. Εάν δεν υπάρχουν σφάλματα, προχωρήστε και αναβοσβήνετε τον κώδικα στο πρώτο Photon. Το επόμενο βήμα θα σας παράσχει παρόμοιο κώδικα που θα αναβοσβήνει στο δεύτερο Photon.
Βήμα 9: Ο προγραμματισμός συνεχίζεται
Επειδή ο κώδικας για το δεύτερο Photon είναι σχεδόν πανομοιότυπος με αυτόν του πρώτου, ολόκληρος ο κώδικας αντιγράφεται και επικολλάται παρακάτω:
#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 (JS)
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_SIZE (4) + JSON_OBJECT_SIZE (5) + 76*JSON_OBJECT_SIZE (8) + 12490;
String weatherArray [3];
θερμοκρασία επίπλευσηςArray [3]; float humidityArray [3]; float windSpeedArray [3]; Χρονική σήμανση συμβολοσειράςArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];
Συμβολοσειρά allData5DaysForecast;
void getWeather5DayForecast ()
{Particle.publish ("get_weather5DayForecast2"); allData5DaysForecast = ""; }
Timer timerWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 ημέρες
void getCurrentWeather ()
{Particle.publish ("get_currentWeather2"); }
Timer timerWeatherCurrent (60000, getCurrentWeather);
void changeLeftRight3 () {
εάν (leftRight_3) {positionLeftRight_3 = positionLeftRight_3 + leftRightSpeed [2]; εάν (positionLeftRight_3> 100) {leftRight_3 = 0; }} else {positionLeftRight_3 = positionLeftRight_3 - leftRightSpeed [2]; εάν (positionLeftRight_3 <0) {leftRight_3 = 1; }} servoLeftRight_3.write (positionLeftRight_3); }
void changeUpDown3 () {
εάν (upDown_3) {positionUpDown_3 ++; if (positionUpDown_3> upDownMaxDegree [2]) {upDown_3 = 0; }} else {positionUpDown_3--; εάν (positionUpDown_3 <1) {upDown_3 = 1; }} servoUpDown_3.write (positionUpDown_3); }
Timer timerLeftRight3 (100, changeLeftRight3);
Timer timerUpDown3 (10, changeUpDown3);
void setup () {
// ξεκινήστε τα χρονόμετρα καιρού timerWeatherForecast.start (); timerWeatherCurrent.start (); // Βάλτε την αρχικοποίηση όπως το pinMode και ξεκινήστε τις συναρτήσεις εδώ. // Ρύθμιση του Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);
servoLeftRight_3.write (positionLeftRight_3); // προετοιμασία θέσης σερβο
servoUpDown_3.write (positionUpDown_3); // προετοιμασία θέσης σερβο
timerLeftRight3.start ();
timerUpDown3.start (); // Άνοιγμα κονσόλας Serial.begin (9600); καθυστέρηση (2000). Serial.println ("Γεια σας!"); // Εγγραφείτε στο get_weather5DayForecast και get_currentWeather webhooks Particle.subscribe ("hook-respond/get_weather5DayForecast2", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-respond/get_currentWeather2/0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }
void gotWeather5DayForecast (const char *event, const char *data)
{allData5DaysForecast += δεδομένα; // αποθηκεύει όλα τα δεδομένα σε μια συμβολοσειρά. int allData5DaysForecastLen = allData5DaysForecast.length (); char buffer [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (buffer, allData5DaysForecastLen + 1); // δημιουργήστε ένα buffer για τη συμβολοσειρά int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (bufferLength); JsonObject & root = jsonBufferWeather.parseObject (buffer); //Serial.println(allData5DaysForecast); // Δοκιμάστε αν η ανάλυση επιτύχει. εάν (! root.success ()) {//Serial.println("Προσδιορισμός καιρού 5 ημερών πρόβλεψη … ΛΑΘΟΣ! "); ΕΠΙΣΤΡΟΦΗ; } int i = 1; JsonArray & list = root ["list"]; για (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; θερμοκρασία πλωτήρα = κύρια ["θερμοκρασία"]; int υγρασία = κύρια ["υγρασία"]; JsonObject & weather = currentObject ["καιρός"] [0]; const char* weatherInfo = καιρός ["κύριος"]; float windSpeed = currentObject ["άνεμος"] ["ταχύτητα"]; const char* timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (θερμοκρασία); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; temperatureArray = tempFah; υγρασίαΣυστοιχία = υγρασία; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = timestamp; i ++? } else {break; }}}
void gotCurrentWeatherData (const char *event, const char *data)
{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (δεδομένα); //Serial.println (δεδομένα); // Δοκιμάστε αν η ανάλυση επιτύχει. εάν (! root.success ()) {//Serial.println("Παρακολούθηση για τις τρέχουσες καιρικές συνθήκες … ΛΑΘΟΣ! "); ΕΠΙΣΤΡΟΦΗ; } JsonObject & weather = root ["weather"] [0]; const char* weather_main = καιρός ["κύρια"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["υγρασία"]; float wind_speed = ρίζα ["άνεμος"] ["ταχύτητα"]; 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] = κύριος καιρός; temperatureArray [0] = tempFah; υγρασίαΣυσκευή [0] = κύρια_ υγρασία. windSpeedArray [0] = ταχύτητα wind_speed; timestampArray [0] = timestamp; }
int updateUpDown (float temp) {
// Χαρτογραφήστε το βαθμό σε εύρος [0, 180] float servoMaxDegree = temp * 45 /31 + (990 /31); Serial.print ("new servo degree:"); Serial.println (servoMaxDegree); επιστροφή servoMaxDegree; }
int updateleftRight (float windSpeed) {
// Χαρτογραφήστε την ταχύτητα του ανέμου σε εύρος [1, 100] float servoIncrement = windSpeed * 99 /26 + 1; Serial.print ("νέα τιμή αύξησης σερβο:"); Serial.println (servoIncrement); επιστροφή servoIncrement? }
int convertToFahrenheit (float tempKel) {
int tempFah = tempKel * 9.0 / 5.0 - 459.67; επιστροφή tempFah; }
Τα κατάφερες! Περάσατε από την ενότητα προγραμματισμού του έργου! Τώρα, βεβαιωθείτε ότι έχετε κάνει όλες τις καλωδιώσεις και τις συνδέσεις από τους σερβοκινητήρες και τα νεοπίξελ μέχρι το breadboard και τους μικροελεγκτές. ΣΗΜΕΙΩΣΗ: εισαγάγετε τους επιπλέον πείρους/ξυλάκια μέσα από τις κάθετες σχισμές στα κουτιά για τις αριστερές και δεξές κινήσεις του σώματος. Το άλλο άκρο πρέπει να συνδεθεί με το σώμα του δράκου.
Βήμα 10: Απολαύστε τον Δράκο σας
Συγχαρητήρια! Έχετε δημιουργήσει έναν Sine-ese Dragon από την αρχή! Τώρα το μόνο που έχετε να κάνετε είναι να καθίσετε και να απολαύσετε την οθόνη του περιβάλλοντός σας!
ΣΗΜΕΙΩΣΗ: Αυτό το έργο χτίστηκε ως μέρος μαθημάτων από τους Joan Bempong και Soundarya Muthuvel. Μπορείτε να βρείτε τη σελίδα του μαθήματος εδώ.
Συνιστάται:
Switch-Adapt Toys: Water-Breathing Walking Dragon Made Accessible!: 7 βήματα (με εικόνες)
Switch-Adapt Toys: Water-Breathing Walking Dragon Made Accessible !: Η προσαρμογή παιχνιδιών ανοίγει νέους δρόμους και προσαρμοσμένες λύσεις για να επιτρέψει στα παιδιά με περιορισμένες κινητικές ικανότητες ή αναπτυξιακές δυσκολίες να αλληλεπιδρούν με τα παιχνίδια ανεξάρτητα. Σε πολλές περιπτώσεις, τα παιδιά που χρειάζονται τα προσαρμοσμένα παιχνίδια δεν είναι σε θέση να
Pure Sine Wave Inverter: 8 Βήματα
Pure Sine Wave Inverter: Η έρευνά μου
3 Phase Sine Wave Generator Βασισμένο στο Arduino due: 5 βήματα
3 Phase Sine Wave Generator βασισμένο στο Arduino Due: ο σκοπός αυτού του μεριδίου είναι να βοηθήσει κάποιον που προσπαθεί να χρησιμοποιήσει τη μεγαλύτερη απόδοση του Due + έλλειψη αναφοράς + μη βοηθητικό φύλλο δεδομένων. Αυτό το έργο είναι σε θέση να δημιουργήσει έως και 3 φάσεις ημιτονοειδές κύμα @ 256 δείγματα / κύκλος σε χαμηλή συχνότητα (< 1kHz) και 16 δευτερόλεπτα
DIY a NE555 Circuit to Generate Sine Wave: 6 βήματα
DIY a NE555 Circuit to Generate Sine Wave: Αυτό το σεμινάριο σας διδάσκει πώς να κάνετε DIY ένα κύκλωμα NE555 για να δημιουργήσετε ημιτονοειδές κύμα. Αυτά τα προσιτά κιτ DIY είναι πολύ χρήσιμα για να καταλάβετε πώς μπορούν οι πυκνωτές να λειτουργούν με αντιστάσεις για τον έλεγχο του χρόνου φόρτισης και εκφόρτισης που δημιουργείται
Πώς να χρησιμοποιήσετε το Dragon Rider 500 With Your AVR Dragon: 10 Βήματα
Πώς να χρησιμοποιήσετε το Dragon Rider 500 With Your AVR Dragon: Αυτό το διδακτικό είναι ένα μάθημα συντριβής για τον τρόπο χρήσης ορισμένων από τις δυνατότητες του Dragon Rider 500 από την Ecros Technologies. Λάβετε υπόψη ότι υπάρχει ένας πολύ λεπτομερής Οδηγός χρήσης διαθέσιμος στον ιστότοπο του Ecros. Το Dragon Rider είναι ένας πίνακας διασύνδεσης