手工制作智能天气小屋教程,结合传统艺术与现代科技

星舰日志 美术作品 9
手工制作智能天气小屋教程,结合传统艺术与现代科技-第1张图片-趣作屋

天气小屋是一种民间手工艺品,外形像德国或阿尔卑斯风格的小木屋,用来显示天气状况。一个典型的天气小屋有两个并排的门洞,左边站着一位女孩或女性,右边是一个男孩或男性。晴天干燥时,女性会从小屋里出来;下雨时,男性(通常拿着伞)则会现身。据资料记载,这种小屋早在18世纪就被当作家庭装饰使用了。它融合了艺术、手工和科学创意。为了复刻这个装置,我将传统艺术与现代电子技术和网络技术结合在一起。我们通过调用开放天气API获取湿度数据,再控制舵机实现人物的进出动作。传统的天气小屋是利用头发来感应空气湿度变化的,如果你感兴趣可以去查查德国天气小屋的相关资料。

所需用品

手工制作智能天气小屋教程,结合传统艺术与现代科技-第2张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第3张图片-趣作屋

Seeed Xiao ESP32S3

OLED显示屏

SG90舵机

3毫米泡沫板

胶水

电烙铁

等等……

步骤1:制作房屋模型

手工制作智能天气小屋教程,结合传统艺术与现代科技-第4张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第5张图片-趣作屋
使用3毫米泡沫板制作房屋模型。先剪出正面部分,包括两个窗户,然后裁剪侧面和背面,并将它们粘合起来。这一步完全取决于你的创意和设计。

步骤2:粘贴纸张

手工制作智能天气小屋教程,结合传统艺术与现代科技-第6张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第7张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第8张图片-趣作屋

为了让泡沫板看起来像木头材质,我贴了一层仿木纹贴纸。屋顶我想有点光泽感,就用了黄色和红色进行装饰。

步骤3:安装舵机

手工制作智能天气小屋教程,结合传统艺术与现代科技-第9张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第10张图片-趣作屋

把SG90舵机准确地安装在中心位置。

步骤4:安装角色和屋顶

手工制作智能天气小屋教程,结合传统艺术与现代科技-第11张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第12张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第13张图片-趣作屋

我下载并打印了一个小女孩和一个打伞小男孩的图片,还打印了一张砖墙图案贴在屋子下半部分,让整个小屋更有质感。

步骤5:电路连接

手工制作智能天气小屋教程,结合传统艺术与现代科技-第14张图片-趣作屋

舵机和OLED显示屏按照电路图连接好:

OLED 连接 Xiao ESP32S3

  1. SCL 接 SCL(D5)
  2. SDA 接 SDA(D4)
  3. GND 接 GND
  4. VCC 接 5V

舵机 连接 Xiao ESP32S3

  1. VCC 接 5V
  2. GND 接 GND
  3. 信号线 接 D10


步骤6:接口设置

手工制作智能天气小屋教程,结合传统艺术与现代科技-第15张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第16张图片-趣作屋

为了获取湿度信息,我们使用的是开放天气预报API。在相关网站上设置你所在位置的经纬度后,就可以获取到访问API的地址,复制下来备用。

步骤7:编写代码

#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ArduinoJson.h>
#include <ESP32Servo.h>
#include <time.h> // For time functions

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const char* ssid = " "; //wifi-name
const char* password = " ";//wifi-passwd

const char* apiURL = " "; //Enter api access url here.

Servo weatherServo;
const int servoPin = 13;

const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 19800; // +5:30 IST
const int daylightOffset_sec = 0;

void setup() {
Serial.begin(115200);

if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for (;;) ;
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);

weatherServo.attach(servoPin);
delay(1500);
weatherServo.write(90); // Neutral position
delay(1500);

WiFi.begin(ssid, password);
display.setCursor(0, 0);
display.println("Connecting WiFi...");
display.display();

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

display.clearDisplay();
display.setCursor(0, 0);
display.println("WiFi Connected!");
display.display();

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Waiting for NTP time sync...");
time_t now = time(nullptr);
while (now < 8 * 3600 * 2) {
delay(500);
Serial.print(".");
now = time(nullptr);
}
Serial.println("\nTime synchronized!");
}

void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(apiURL);
int httpCode = http.GET();

if (httpCode > 0) {
String payload = http.getString();
Serial.println(payload);

DynamicJsonDocument doc(4096);
DeserializationError error = deserializeJson(doc, payload);

if (!error) {
time_t now = time(nullptr);
struct tm* timeinfo = localtime(&now);
int currentHour = timeinfo->tm_hour;

JsonArray tempArray = doc["hourly"]["temperature_2m"].as<JsonArray>();
JsonArray humidityArray = doc["hourly"]["relative_humidity_2m"].as<JsonArray>();

if (currentHour < tempArray.size() && currentHour < humidityArray.size()) {
float temperature = tempArray[currentHour];
float humidity = humidityArray[currentHour];

display.clearDisplay();

// Temperature
display.setTextSize(1);
display.setCursor(0,5);
display.println("Temp.");
display.setCursor(0, 30);
display.setTextSize(2);
display.print(temperature, 1);
display.setCursor(50, 37.5);
display.setTextSize(1);
display.println("C");
//Humidity
display.setTextSize(1);
display.setCursor(70, 5);
display.println("Humidity");
display.setCursor(70, 30);
display.setTextSize(2);
display.print(humidity,1);
display.setCursor(120, 35);
display.setTextSize(1);
display.println("%");

display.setTextSize(1);
display.setCursor(50, 55);

if (humidity >= 60) {
display.print("Rainy");
delay(1500);
weatherServo.write(180);
delay(1500);
} else {
delay(1500);
display.print("Sunny");
delay(1500);
}

display.display();
} else {
Serial.println("Hour out of range");
displayError("Hour out of range");
}
} else {
Serial.println("JSON Parsing Error");
displayError("JSON Error");
}
} else {
Serial.println("HTTP Request Failed");
displayError("HTTP Error");
}
http.end();
} else {
Serial.println("WiFi Disconnected");
displayError("WiFi Lost");
reconnectWiFi();
}

delay(60000);
}

void displayError(const char* msg) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 20);
display.println(msg);
display.display();
delay(2000);
}

void reconnectWiFi() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Attempting to reconnect WiFi...");
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("WiFi");
display.println("Recon...");
display.display();

WiFi.reconnect();

int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 10) {
delay(1000);
attempts++;
Serial.print(".");
}

if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi Reconnected!");
display.clearDisplay();
display.setCursor(0, 0);
display.println("WiFi OK!");
display.display();
} else {
Serial.println("\nWiFi Reconnection Failed");
display.clearDisplay();
display.setCursor(0, 0);
display.println("WiFi");
display.println("Failed!");
display.display();
delay(2000);
ESP.restart();
}
}
}

upload the code to xiao esp32s3 using any like arduino ide. Here you have to replace the api access url with with your url and netwok name password. you can also set the servo angle as your desired value.

步骤8:测试运行

手工制作智能天气小屋教程,结合传统艺术与现代科技-第17张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第18张图片-趣作屋
手工制作智能天气小屋教程,结合传统艺术与现代科技-第19张图片-趣作屋

现在你可以看到Wi-Fi已经连接成功,温度和湿度信息也显示在OLED屏幕上。

步骤9:最终成果

手工制作智能天气小屋教程,结合传统艺术与现代科技-第20张图片-趣作屋

这就是最终完成的天气小屋的样子。下雨时男性角色会走出来,晴天则是女性角色出现。你也可以使用DHT11传感器来做这个项目,这样就不需要联网也能运行。这个项目可以说是一个真正的STE(A)M实践作品,因为它融合了科学、技术、工程、艺术和数学等多个方面。让我感触最深的一点是,在现代社会中,我们追求极简风格,很多设计都变得简单直接,但老式的设计其实也有它的美感和创意。也许我们可以将两者结合起来,做出更有趣的东西。

标签: DIY家居 创意DIY 电子创意

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

请先 登录 再评论,若不是会员请先 注册