Mục lục:
- Bước 1: Lên và xuống
- Bước 2: Còn về Trái và Phải ?
- Bước 3: Giữ cơ thể … BẰNG CÁCH NÀO?
- Bước 4: Nhưng những chiếc hộp đó không đẹp…
- Bước 5: Đồ chơi Slinky ?? Ôi trời
- Bước 6: In Rồng của bạn
- Bước 7: Đã đến lúc nâng tầm con rồng của bạn với NeoPixels
- Bước 8: Thời gian lập trình
- Bước 9: Tiếp tục lập trình
- Bước 10: Thưởng thức Rồng của bạn
Video: Sine-ese Dragon: 10 bước (có hình ảnh)
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:35
Sine-ese Dragon là một tác phẩm trang trí nhà xung quanh sử dụng các chuyển động cơ học và đèn chiếu sáng để cho bạn biết dự báo thời tiết trong khoảng thời gian ba giờ tới. Theo định nghĩa, môi trường xung quanh mô tả môi trường xung quanh ngay lập tức của một cái gì đó; do đó nó được quyết định là thích hợp để kết hợp dữ liệu thời tiết vào màn hình xung quanh. Thời tiết là một khía cạnh vô tình thay đổi ngày của con người và là một phần thông tin liên tục thay đổi theo từng phút hoặc thậm chí xuống từng giây.
Rồng Trung Quốc là “biểu tượng của quyền lực, sức mạnh và sự may mắn” và thường được lưu giữ với giá trị văn hóa và truyền thống cao trên khắp tiểu lục địa Châu Á. Ngoài việc mang lại may mắn, Rồng Trung Quốc cũng được cho là có sức mạnh mạnh mẽ kiểm soát “nước, mưa, bão và lũ lụt”. Cuối cùng, Rồng Trung Quốc được cho là thích hợp để đại diện cho dữ liệu thời tiết.
Hình dung
Sine-ese Dragon được chế tác tại sáu điểm chính tại ba phần riêng biệt đại diện cho dự báo thời tiết trong ba khoảng thời gian 3 giờ. Đối với mỗi khoảng thời gian 3 giờ, thông tin sau sẽ được bao gồm:
- Mô tả thời tiết - xác định màu sắc của thông tin thời tiết hiện tại.
- Nhiệt độ - chỉ định chiều cao của cơ thể
- Độ ẩm - nhấp nháy của các đoạn LED
- Tốc độ gió - điều khiển tốc độ di chuyển của cơ thể sang trái và phải.
Vật liệu thiết yếu
- Ván ép / bìa cứng 3 mm
- Chốt hoặc đũa gỗ 5 mm
- 2 hạt photon
- 3 đồ chơi lóng ngóng
- 6 động cơ servo
- Đèn NeoPixel (đèn một sợi hoặc đèn riêng lẻ được khâu lại với nhau)
- Rất nhiều keo siêu dính
- Chủ đề dẫn điện
- Sơn acrylic
- Vải trang trí
- Máy cắt laser
- máy in 3D
Bước 1: Lên và xuống
Bước đầu tiên của bạn để xây dựng Sine-ese Dragon là xây dựng thành phần điều khiển chuyển động lên và xuống của cơ thể. Thật thú vị!
-
Tải xuống các tệp Adobe Illustrator (.ai) và in chúng ra bằng máy cắt laser.
upDownBoxWithPlatform.ai nên được in trên bìa cứng
-
Tải xuống các tệp in 3D (.stl) và sử dụng máy in 3D yêu thích của bạn để in chúng ra.
Màu sắc không quan trọng đối với đĩa hoặc bộ quay đĩa. Trong hình ảnh thứ hai, bộ quay đĩa đã được đưa vào bên trong lỗ của đĩa
-
Ráp hai thành phần đầu tiên và dán chúng lại với nhau như trong hình 3 đến hình 5.
- Nền tảng
- Các rãnh của đĩa
-
Bây giờ, hãy đặt hộp lại với nhau theo các mẹo dưới đây.
- Các dây của servo phải đi qua lỗ hình chữ nhật ở mặt bên của hộp.
- Đầu ngắn nhất của bộ quay đĩa được gắn vào đầu servo và đầu dài hơn đi qua lỗ của mặt bên kia của hộp có một lỗ tròn trên đó. Điều này được thể hiện trong hình 6.
- Bây giờ, chúng ta cần một cái gì đó để đảm bảo nền tảng luôn ở trạng thái cân bằng khi đĩa được quay. Cắt chiếc đũa thành những que dài 75 mm (hình 7) và dùng keo nóng dán chúng xuyên qua miệng hộp vào đỉnh bệ. Đảm bảo rằng các thanh được đặt nghiêng 90 độ so với mặt phẳng.
- Chèn một thanh dài 212 mm vào lỗ giữa trên đầu hộp lên bệ.
Ngọt! Bây giờ bạn có một hộp hoàn chỉnh (hình 8) cho chuyển động lên và xuống của con rồng. Bây giờ, hãy lặp lại các bước trên hai lần nữa!
Bước 2: Còn về Trái và Phải ?
Bây giờ, chúng ta không thể quên về chuyển động trái và phải của Rồng Sine-ese, phải không? Hãy chuyển sang bước thứ hai!
-
Tải xuống các tệp Adobe Illustrator (.ai) và in chúng ra bằng máy cắt laser.
- leftRightBoxWithPlatforms.ai nên được in trên bìa cứng.
- Tệp armTurner.ai phải được in trên vật liệu dày 3 mm.
-
Tải xuống các tệp in 3D (.stl) và sử dụng máy in 3D yêu thích của bạn để in chúng ra.
Hãy chắc chắn rằng bạn in hai trong số các cánh tay! Màu sắc không quan trọng ở đây
- Sử dụng keo nóng để lắp ráp hai nền tảng với nhau như trong hình 3.
-
Đặt hộp lại với nhau. Mặc dù có thể khó để làm như vậy, nhưng bạn sẽ dễ dàng đạt được hơn bằng cách:
- Chèn hai bệ vào giữa hai khe lớn ở hai bên của hộp.
- Đặt cánh tay đầu tiên trên đỉnh của bệ trên.
- Luồn tay quay qua cánh tay và sau đó là bệ trên.
- Đặt cánh tay thứ hai trên đỉnh của bệ dưới cùng.
- Luồn tay quay qua cánh tay thứ hai rồi đến bệ dưới cùng.
- Gắn con quay tay qua lỗ hình chữ nhật của con quay tay in 3D.
- Đầu kia của máy quay nằm trên đầu mô tơ servo.
- Thêm các miếng trên cùng, dưới cùng và mặt sau vào hộp.
Hộp được lắp ráp cuối cùng của bạn sẽ giống như hình thứ sáu. Bây giờ, bạn có thể lặp lại điều đó hai lần nữa!
Đến cuối bước này, bạn sẽ có sáu hộp với ba hộp mỗi hệ thống chuyển động lên / xuống và trái / phải.
Bước 3: Giữ cơ thể … BẰNG CÁCH NÀO?
Câu hỏi hay! Đó là khi những người giữ slinky in 3D đó xuất hiện. Hãy tải xuống tệp.stl đi kèm và in nó bằng máy in 3D. Đảm bảo in tổng cộng 6 ngăn chứa cho 6 hộp khác nhau.
Nếu bạn đã nhìn thấy bức ảnh của người nắm giữ lóng lánh ở trên, điều bất ngờ đã bị hủy hoại - đó chính là màu sắc của Sine-ese Dragon của chúng ta!
Bước 4: Nhưng những chiếc hộp đó không đẹp…
Và tôi đồng ý! Đây là lý do tại sao chúng tôi sẽ sử dụng máy cắt laser để cắt một chiếc hộp hấp dẫn hơn nhiều để chứa tất cả những chiếc hộp đó và che giấu chúng.
Tải xuống các tệp Adobe Illustrator đó và cắt chúng ra bằng máy cắt laser. Thiết kế đám mây được vẽ bằng tay bởi một trong những người đóng góp. Hãy sửa đổi chúng bằng cách xóa chúng bên trong tệp illustrator và thêm thiết kế của riêng bạn khi bạn thấy phù hợp! Dưới đây là các bước được đề xuất để kết hợp mọi thứ lại với nhau.
- Ráp và dán tất cả ba phần từ tệp đầu tiên (ngoàiBoxFinal_1) lại với nhau.
- Chưa thêm phần từ tệp thứ hai (ngoàiBoxFinal_2).
- Đặt mảnh từ tệp thứ ba (ngoàiBoxFinal_3) xuống dưới cùng của hộp và nó sẽ đóng ở trên cùng. CHỈ dán keo ở đáy hộp.
- In innerBoxesPlatform hai lần. Dán hai miếng có lỗ hình chữ nhật lớn vào chúng với nhau. Sau đó, dán ba miếng còn lại lại với nhau. Cuối cùng, dán nó vào bộ dán khác có lỗ trên chúng.
- Đặt bệ ở dưới cùng của hộp lớn.
- Chèn tất cả 6 hộp nhỏ hơn vào các vị trí tương ứng của chúng trên nền tảng.
- Bây giờ, đặt mảnh từ tệp thứ hai (ngoàiBoxFinal_2) lên trên cùng của hộp và dán xung quanh cạnh. Các lỗ trên mảnh trên cùng phải thẳng hàng với các lỗ trên các hộp nhỏ hơn. Nếu không, hãy sắp xếp lại các hộp nhỏ hơn của bạn. Hoàn toàn không thêm keo vào các hộp nhỏ hơn.
- Nếu bạn đang sử dụng breadboard có một miếng dính ở dưới cùng, hãy đặt miếng này gần tâm của miếng dưới cùng ở một nơi mà khi bạn đóng hộp, breadboard cùng với các Photon sẽ biến mất. Có các khe nhỏ trên miếng đáy giúp bạn kết nối với các Photon từ bên ngoài dễ dàng hơn.
Bước 5: Đồ chơi Slinky ?? Ôi trời
Cơ thể của con rồng:
1. Kết hợp ba slinkies với nhau bằng cách sử dụng keo nóng hoặc băng dính.
2. Đo chiều dài và đường kính của các đường kính và cắt một mảnh vải trang trí.
3. Mang hai đầu vải và may chúng lại với nhau.
4. Khi bạn đã may xong, hãy trượt các miếng vải mỏng vào trong như một chiếc tất.
5. May các đầu của đường gấp khúc vào vải đã may.
Bước 6: In Rồng của bạn
Các bộ phận in 3D của rồng:
1. Các phần được lấy từ
2. Chúng tôi chỉ sử dụng đầu, chân và mắt.
3. Sau khi in 3D chi tiết, hãy làm mịn nó bằng giấy nhám và axeton.
4. Sơn các bộ phận theo cách bạn muốn để trang trí nó.
Bước 7: Đã đến lúc nâng tầm con rồng của bạn với NeoPixels
Phân khúc ánh sáng:
1. Bạn có thể chỉ cần sử dụng một sợi neopixel để tạo ra ánh sáng nếu bạn muốn. (Chúng tôi đã hết các sợi dây).
2. Chúng tôi đã sử dụng 20 đèn neopixel và kết nối chúng bằng dây. Những sợi dây này được hàn vào chúng và kết nối với photon bằng cách sử dụng dây màu đỏ để nó phù hợp với chủ đề của con rồng.
3. Bạn cũng có thể may đèn neopixel của mình trên một mảnh vải dài, nhưng chúng tôi đã không sử dụng chúng vì chúng tôi có một miếng vải mỏng được làm từ kim loại.
Lắp ráp các bộ phận: Cố định đoạn sáng bên trong thân rồng bằng chỉ hoặc dây. Đảm bảo rằng bạn có thể kết nối đèn với photon bên trong hộp đế. Dùng keo gắn đầu, chân và đuôi vào thân. Khi chúng đã ở đúng vị trí, hãy cố định phần thân vào các giá đỡ lấp lánh mà chúng tôi đã in trước đó. Bây giờ cơ thể đã sẵn sàng để được lập trình.
Bước 8: Thời gian lập trình
Vì chúng ta sẽ sử dụng hai Hạt photon để hoạt động với sáu động cơ servo riêng biệt (một Photon chỉ có thể hoạt động với bốn), chúng ta sẽ viết hai mã riêng biệt nhưng tương tự nhau để được chiếu trên vi điều khiển.
Bây giờ, đối với bộ vi điều khiển đầu tiên…
Trong tệp Arduino (.ino), hãy bao gồm các thư viện sau và định nghĩa:
#include "neopixel.h"
#include "ArduinoJson.h"
#define PIXEL_PIN D4
#define PIXEL_COUNT 18
Tiếp theo, khai báo các biến sau:
Dải 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; // phải nằm trong khoảng từ 0 đến 180 (tính bằng độ) int positionUpDown_2 = 180; // phải nằm trong khoảng từ 0 đến 180 (theo độ) int leftRight_2 = 1; // 0 = left, 1 = right int upDown_2 = 1; // 0 = lên, 1 = xuống 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 (12) + 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_S_IZE (2) + JSON_OBJECT_OB_SIZE (3) + JSON_OBJECT_OB_SIZE * JSON_OBJECT_OB_SIZE (5) + 76 * JSON_OBJECT_SIZE (8) + 12490; Chuỗi thời tiếtArray [3]; nhiệt độ floatArray [3]; độ ẩm floatArray [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3]; Chuỗi allData5DaysForecast;
Nhấp vào đây để tìm hiểu cách thiết lập webhook. Khi bạn hoàn tất, hãy thêm các khai báo và hàm sau đây và thực hiện các thay đổi thích hợp nếu cần:
void getWeather5DayForecast () {Particle.publish ("get_weather5DayForecast"); allData5DaysForecast = ""; } Timer timerWeatherForecast (60000, getWeather5DayForecast); void getCurrentWeather () {Particle.publish ("get_currentWeather"); } Timer timerWeatherCurrent (60000, getCurrentWeather);
Các chức năng sau điều khiển các chuyển động lên / xuống và trái / phải của rồng:
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); }
Để có thể thay đổi các chuyển động trong một khoảng thời gian, bộ hẹn giờ được tạo.
Timer timerLeftRight1 (100, changeLeftRight1);
Timer timerLeftRight2 (100, changeLeftRight2); Timer timerUpDown1 (10, changeUpDown1); Timer timerUpDown2 (10, changeUpDown2);
Chức năng thiết lập cuối cùng được thêm vào tiếp theo. Đảm bảo thực hiện các thay đổi thích hợp đối với các dòng mã liên quan đến webhook.
void setup () {// khởi động bộ hẹn giờ thời tiết timerWeatherForecast.start (); timerWeatherCurrent.start (); // Neopixels dải.begin (); // Đặt khởi tạo như pinMode và bắt đầu các hàm tại đây. // Thiết lập Micro Servo servoLeftRight_1.attach (D1); servoUpDown_1.attach (D0); servoLeftRight_2.attach (D3); servoUpDown_2.attach (D2); servoLeftRight_1.write (positionLeftRight_1); // khởi tạo vị trí servo servoUpDown_1.write (positionUpDown_1); // khởi tạo vị trí servo servoLeftRight_2.write (positionLeftRight_2); // khởi tạo vị trí servo servoUpDown_2.write (positionUpDown_2); // khởi tạo vị trí servo timerLeftRight1.start (); timerLeftRight2.start (); timerUpDown1.start (); timerUpDown2.start (); // Mở bảng điều khiển Serial.begin (9600); chậm trễ (2000); Serial.println ("Xin chào!"); // Đăng ký get_weather5DayForecast và get_currentWeather webhooks Particle.subscribe ("hook-response / get_weather5DayForecast", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response / get_currentWeather / 0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }
Một chức năng vòng lặp không được sử dụng cho dự án này. Chúng ta không thể quên các chức năng xử lý dữ liệu nhận được từ webhooks!
void gotWeather5DayForecast (const char * event, const char * data) {allData5DaysForecast + = data; // lưu tất cả dữ liệu vào một chuỗi. int allData5DaysForecastLen = allData5DaysForecast.length (); bộ đệm char [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (bộ đệm, allData5DaysForecastLen + 1); // tạo vùng đệm cho chuỗi int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (đệmLength); JsonObject & root = jsonBufferWeather.parseObject (bộ đệm); // Kiểm tra xem quá trình phân tích cú pháp có thành công hay không. if (! root.success ()) {//Serial.println(" Lập bảng dự báo thời tiết 5 ngày… ERROR! "); trở lại; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; float nhiệt độ = main ["temp"]; int ẩm = main ["độ ẩm"]; JsonObject & weather = currentObject ["thời tiết"] [0]; const char * weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (nhiệt độ); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; setColor (weatherInfo, i); nhiệt độ = tempFah; MoistArray = độ ẩm; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = dấu thời gian; i ++; } else {ngắt; }}}
void gotCurrentWeatherData (const char * event, const char * data) {DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (dữ liệu); // Kiểm tra xem quá trình phân tích cú pháp có thành công hay không. if (! root.success ()) {//Serial.println(" Phân tích thời tiết hiện tại… ERROR! "); trở lại; } JsonObject & weather = root ["weather"] [0]; const char * weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["độ ẩm"]; float wind_speed = root ["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] = weather_main; nhiệt độ [0] = tempFah; Moisturiser [0] = main_humidity; windSpeedArray [0] = wind_speed; timestampArray [0] = dấu thời gian; }
Bên dưới, bạn có thể tìm thấy các chức năng bổ sung kiểm soát việc cập nhật vị trí của động cơ servo, chuyển đổi nhiệt độ từ Kelvin sang Fahrenheit và cài đặt màu sắc của đèn LED.
int updateUpDown (float temp) {// Ánh xạ mức độ với phạm vi [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("cấp độ servo mới:"); Serial.println (servoMaxDegree); trả về servoMaxDegree; }
int updateleftRight (float windSpeed) {
// Ánh xạ tốc độ gió tới phạm vi [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("giá trị gia tăng servo mới:"); Serial.println (servoIncrement); trả về servoIncrement; }
int convertToFahrenheit (float tempKel) {
int tempFah = tempKel * 9.0 / 5.0 - 459.67; trả về 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 {return; } if (weatherDesc == "Clear") {// màu vàng for (int j = ledIndex; j <ledIndex + 6; j ++) {dải.setPixelColor (j, dải. Color (253, 219, 62)); // dải màu vàng.show (); chậm trễ (20); }} else if (weatherDesc == "Clouds") {// màu xám for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (223, 229, 237)); // màu xám dải.show (); chậm trễ (20); }} else if (weatherDesc == "Snow") {// màu trắng for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (255, 225, 225)); // dải trắng.show (); chậm trễ (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 (); chậm trễ (20); }} else {// red for (int j = ledIndex; j <ledIndex + 6; j ++) {strip.setPixelColor (j, strip. Color (254, 11, 5)); // red strip.show (); chậm trễ (20); }}}
Khi bạn đã thêm mọi thứ vào tệp Arduino của mình, hãy biên dịch nó. Nếu không có lỗi, hãy tiếp tục và flash mã cho Photon đầu tiên. Bước tiếp theo sẽ cung cấp cho bạn mã tương tự sẽ được hiển thị trên Photon thứ hai.
Bước 9: Tiếp tục lập trình
Bởi vì mã của Photon thứ hai gần giống với mã của Photon thứ nhất, toàn bộ mã được sao chép và dán bên dưới:
#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) + JSIZON_OBJECT_SIZE (6) + JSIZON_OBJECT_SIZE (12) + JSIZON_OBJECT_SIZE
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_S_IZE (2) + JSON_OBJECT_OB_SIZE (3) + JSON_OBJECT_OB_SIZE * JSON_OBJECT_OB_SIZE (5) + 76 * JSON_OBJECT_SIZE (8) + 12490;
Chuỗi thời tiếtArray [3];
float nhiệt độArray [3]; độ ẩm floatArray [3]; float windSpeedArray [3]; String timestampArray [3]; int upDownMaxDegree [3]; int leftRightSpeed [3];
Chuỗi allData5DaysForecast;
void getWeather5DayForecast ()
{Particle.publish ("get_weather5DayForecast2"); allData5DaysForecast = ""; }
Hẹn giờ hẹn giờWeatherForecast (60000, getWeather5DayForecast); // 10, 800, 000 ms = 3 ngày
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 () {
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);
void setup () {
// khởi động bộ hẹn giờ thời tiết timerWeatherForecast.start (); timerWeatherCurrent.start (); // Đặt khởi tạo như pinMode và bắt đầu các hàm tại đây. // Thiết lập Micro Servo servoLeftRight_3.attach (D1); servoUpDown_3.attach (D0);
servoLeftRight_3.write (positionLeftRight_3); // khởi tạo vị trí servo
servoUpDown_3.write (positionUpDown_3); // khởi tạo vị trí servo
timerLeftRight3.start ();
timerUpDown3.start (); // Mở bảng điều khiển Serial.begin (9600); chậm trễ (2000); Serial.println ("Xin chào!"); // Đăng ký get_weather5DayForecast và get_currentWeather webhooks Particle.subscribe ("hook-response / get_weather5DayForecast2", gotWeather5DayForecast, MY_DEVICES); Particle.subscribe ("hook-response / get_currentWeather2 / 0", gotCurrentWeatherData, MY_DEVICES); getCurrentWeather (); getWeather5DayForecast (); }
void gotWeather5DayForecast (const char * event, const char * data)
{allData5DaysForecast + = data; // lưu tất cả dữ liệu vào một chuỗi. int allData5DaysForecastLen = allData5DaysForecast.length (); bộ đệm char [allData5DaysForecastLen + 1]; allData5DaysForecast.toCharArray (bộ đệm, allData5DaysForecastLen + 1); // tạo vùng đệm cho chuỗi int bufferLength = sizeof (buffer); DynamicJsonBuffer jsonBufferWeather (đệmLength); JsonObject & root = jsonBufferWeather.parseObject (bộ đệm); //Serial.println(allData5DaysForecast); // Kiểm tra xem quá trình phân tích cú pháp có thành công hay không. if (! root.success ()) {//Serial.println(" Lập bảng dự báo thời tiết 5 ngày… ERROR! "); trở lại; } int i = 1; JsonArray & list = root ["list"]; for (JsonObject & currentObject: list) {if (i <3) {JsonObject & main = currentObject ["main"]; float nhiệt độ = main ["temp"]; int ẩm = main ["độ ẩm"]; JsonObject & weather = currentObject ["thời tiết"] [0]; const char * weatherInfo = weather ["main"]; float windSpeed = currentObject ["wind"] ["speed"]; const char * timestamp = currentObject ["dt_txt"]; int tempFah = convertToFahrenheit (nhiệt độ); int servoMaxDegree = updateUpDown (tempFah); upDownMaxDegree = servoMaxDegree; int servoIncrement = updateleftRight (windSpeed); leftRightSpeed = servoIncrement; nhiệt độ = tempFah; MoistArray = độ ẩm; weatherArray = weatherInfo; windSpeedArray = windSpeed; timestampArray = dấu thời gian; i ++; } else {ngắt; }}}
void gotCurrentWeatherData (const char * event, const char * data)
{DynamicJsonBuffer jsonBufferWeather (bufferSizeCurrent); JsonObject & root = jsonBufferWeather.parseObject (dữ liệu); //Serial.println(data); // Kiểm tra xem quá trình phân tích cú pháp có thành công hay không. if (! root.success ()) {//Serial.println(" Phân tích thời tiết hiện tại… ERROR! "); trở lại; } JsonObject & weather = root ["weather"] [0]; const char * weather_main = weather ["main"]; JsonObject & main = root ["main"]; float main_temp = main ["temp"]; int main_humidity = main ["độ ẩm"]; float wind_speed = root ["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] = weather_main; nhiệt độ [0] = tempFah; Moisturiser [0] = main_humidity; windSpeedArray [0] = wind_speed; timestampArray [0] = dấu thời gian; }
int updateUpDown (float temp) {
// Ánh xạ mức độ đến phạm vi [0, 180] float servoMaxDegree = temp * 45/31 + (990/31); Serial.print ("cấp độ servo mới:"); Serial.println (servoMaxDegree); trả về servoMaxDegree; }
int updateleftRight (float windSpeed) {
// Ánh xạ tốc độ gió tới phạm vi [1, 100] float servoIncrement = windSpeed * 99/26 + 1; Serial.print ("giá trị gia tăng servo mới:"); Serial.println (servoIncrement); trả về servoIncrement; }
int convertToFahrenheit (float tempKel) {
int tempFah = tempKel * 9.0 / 5.0 - 459.67; trả về tempFah; }
Bạn làm được rồi! Bạn đã làm được điều đó thông qua phần lập trình của dự án! Bây giờ, hãy đảm bảo tạo tất cả hệ thống dây điện và kết nối từ động cơ servo và neopixel tới bảng mạch và bộ vi điều khiển. Đầu còn lại nên được kết nối với thân của con rồng.
Bước 10: Thưởng thức Rồng của bạn
Xin chúc mừng! Bạn đã xây dựng một con Rồng Sine-ese từ đầu! Bây giờ tất cả những gì bạn phải làm là ngồi lại và thưởng thức màn hình xung quanh của bạn!
LƯU Ý: Dự án này được xây dựng như một phần của khóa học của Joan Bempong và Soundarya Muthuvel. Trang khóa học có thể được tìm thấy ở đây.
Đề xuất:
Máy ảnh hồng ngoại hình ảnh nhiệt tự làm: 3 bước (có hình ảnh)
Máy ảnh hồng ngoại hình ảnh nhiệt tự làm: Xin chào! Tôi luôn tìm kiếm các Dự án mới cho các bài học vật lý của mình. Hai năm trước, tôi đã xem một báo cáo về cảm biến nhiệt MLX90614 từ Melexis. Loại tốt nhất chỉ với 5 ° FOV (trường nhìn) sẽ phù hợp với máy ảnh nhiệt tự chế
Tự làm cảm biến hình ảnh và máy ảnh kỹ thuật số: 14 bước (có hình ảnh)
Tự làm cảm biến hình ảnh và máy ảnh kỹ thuật số: Có rất nhiều hướng dẫn trực tuyến về cách xây dựng máy ảnh phim của riêng bạn, nhưng tôi không nghĩ rằng có bất kỳ hướng dẫn nào về việc xây dựng cảm biến hình ảnh của riêng bạn! Cảm biến hình ảnh có sẵn từ rất nhiều công ty trực tuyến và việc sử dụng chúng sẽ giúp thiết kế
Hình ảnh - Máy ảnh Raspberry Pi in 3D.: 14 bước (có Hình ảnh)
Hình ảnh - Máy ảnh Raspberry Pi 3D được in: Cách đây trở lại vào đầu năm 2014, tôi đã xuất bản một máy ảnh có thể hướng dẫn được gọi là SnapPiCam. Máy ảnh được thiết kế để đáp ứng với Adafruit PiTFT mới được phát hành. Đã hơn một năm trôi qua và với bước đột phá gần đây của tôi vào in 3D, tôi nghĩ rằng n
Ánh sáng video thân mật / Ánh sáng chụp ảnh cầm tay: 7 bước (với hình ảnh)
Ánh sáng video thân mật / Ánh sáng chụp ảnh cầm tay: Tôi biết bạn đang nghĩ gì. Bằng cách " thân mật, " Ý tôi là chiếu sáng cận cảnh trong các tình huống ánh sáng khó - không nhất thiết dành cho " các tình huống thân mật. &Quot; (Tuy nhiên, nó cũng có thể được sử dụng cho việc đó …) Là một nhà quay phim thành phố New York - hoặc
Cách sử dụng Dragon Rider 500 với AVR Dragon của bạn: 10 bước
Cách sử dụng Dragon Rider 500 với AVR Dragon của bạn: Tài liệu hướng dẫn này là một khóa học về cách sử dụng một số tính năng của Dragon Rider 500 từ Ecros Technologies. Xin lưu ý rằng có một Hướng dẫn sử dụng rất chi tiết trên trang web của Ecros. The Dragon Rider là một bảng giao diện