创客项目秀|基于XIAO ESP32C3 的 Cyber Clock

Cyber Clock,一款带湿度温度计的物联网OLED座钟   

图片

今天小编给大家带来的是来自国外的Maker Gokux 的Cyber Clock的项目。该项目由3D打印和开源硬件制作,可以在桌面上当作一个时钟摆件。Gokux 作为一名技术爱好者,喜欢了解新技术和发明。这就是为什么其是特斯拉的忠实粉丝,尤其是Cybertruck。它的设计很酷,很有未来感。Gokux 一直想3D打印一个Cybertruck的小型模型,然后把它放在自己的办公桌上。从这个小想法开始,并在此基础上进行构建。最后,结果是这样的

,时长00:28

图片

“The Cyber Clock”,一款可充电电池供电的 1.51 英寸透明 OLED 时钟,具有准确的互联网时间和日期。它还可以通过板载传感器测量您的室温和湿度。它还可以显示电池百分比,并带有完全3D打印的Cybertruck车身。它具有可滚动的轮子,也可以通过拧紧螺丝来锁定轮子,这样它就不会意外地从桌子上掉下来!另外,我想提一下,我从Flipper Zero UI 中汲取了灵感来设计这款表盘。通过这些指导,我们将学习如何自己构建一个并根据您的时区进行定制。因此,让我们开始制作 Cyber Clock 吧。          

材料清单

图片

元件列表

  • Seeed Studio XIAO ESP32C3

  • DHT11 温湿度传感器

  • 1.51英寸透明OLED您将获得JST电缆,显示器和驱动板作为套件滑动开关

  • 500mAh 3.7V电池(与600mAh电池相同)

  • 30AWG线

  • 6 * CSK内六角 M3 x 10mm 螺丝

  • B-7000 多用途胶水强力胶

  • Kapton 胶带 10mm

  • 3 * 10k电阻器(您可以使用SMD型或通孔电阻器,我使用SMD 0805电阻器作为分压器,10k通孔用于拉起DHT11信号)

工具

  • 内六角扳手烙铁套件接线钳胶枪二手3D打印机

  • Anycubic Kobra 2 Neo

  • 3D打印耗材

  • Numakers PLA+ 漆黑 Numakers PLA+ 纯白

  • Numakers PLA+ 浅灰色

步骤1、在Fusion 360 中建模

图片

我使用 Fusion 360 来规划和设计我的项目。我在设计这个项目时考虑了两件事:易于组装和 3D 打印。为了实现这一点,我将项目主体分成了多个部分。通过导入精确的电子元件模型,我可以预先确定它们在机身上的位置。这确保了在我构建原型之前,一切都可以配合并协同工作,从而节省了大量时间和精力。下面提供了所有设计文件。

步骤2、3D打印

将所有模型导出到。STL 文件,我使用我的 Anycubic 打印机 3D 打印它们。在这个项目中,我使用了三种不同颜色的PLA灯丝:黑色、灰色和白色。你可以找到。步骤 1 中的 STL 文件。打印时,顶部主体需要一些支撑材料。

图片

          

步骤3、XIAO ESP32C3 烧录代码

图片

我总是喜欢在组装之前将代码上传到微控制器。我正在使用Arduino IDE刷新代码。按照以下教程为 Seeed Studio XIAO ESP32C3 设置 IDE,并了解有关此板的更多信息确保将所有必需的库安装到 Arduino IDE 中

DHT11的库

如何安装库教程视频链接

如何设置您的wifi密码

我们需要一个内部连接来从 NTP 服务器获取时间数据。因此,我们需要将此时钟连接到您的WiFi网络。您可以在 46,47 行上输入您的 WiFi 凭据

const char* ssid     = "ssid";const char* password = "password"; 如何设置时区

时区是使用 GMT 偏移量(以秒为单位)配置的。我的 GMT 偏移量是 GMT +5:30,现在我们需要将其转换为秒,即 19800 秒。只需谷歌一下即可轻松转换

图片

您可以在代码的第 65 行中以秒为单位输入您的 GMT 偏移量

NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800, 0);

完整代码

#include <WiFi.h>#include <SPI.h>#include <NTPClient.h>#include <WiFiUdp.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#include <DHT.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels#define SCREEN_HEIGHT 64 // OLED display height, in pixels#define ANALOG_PIN D1      // Analog pin connected to the voltage divider#define ADC_MAX 4095      // 12-bit ADC#define REF_VOLTAGE 2.8   // Reference voltage of ADC (3.3V for Xiao ESP32C3)// WiFi credentialsconst char* ssid     = "ssid";//your ssidconst char* password = "password";//your wifi password// OLED display SPI pins#define OLED_MOSI    D10#define OLED_CLK     D8#define OLED_DC      D4#define OLED_CS      D7#define OLED_RESET   D5Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);#define DHTPIN D0#define DHTTYPE    DHT11DHT dht(DHTPIN, DHTTYPE);// NTP client to get timeWiFiUDP ntpUDP;NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800, 0);//bit ui bitmapstatic const unsigned char PROGMEM image_paint_1_bits[] = {0x60,0xf0,0x90,0x90,0x90,0x90,0xf0};static const unsigned char PROGMEM image_paint_0_bits[] = {0x7e,0x3f,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0x7e,0xc1,0x3e,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x7c,0x83,0xd5, float readBatteryVoltage() {  int analogValue = analogRead(ANALOG_PIN);  float voltage = (analogValue / (float)ADC_MAX) * REF_VOLTAGE;  // Voltage divider scaling  voltage = voltage * (10.5 + 10) / 10.0; // (R1 + R2) / R2  return voltage;}// Function to calculate battery percentage float calculateBatteryPercentage(float voltage) {  float percentage;  // Assuming a linear relationship between voltage and percentage  if (voltage >= 4.2) {    percentage = 100.0;  } else if (voltage <= 2.5) {    percentage = 0.0;  } else {    percentage = (voltage - 2.5) / (4.2 - 2.5) * 100.0;  }  return percentage;}void setup() {  // Start serial communication  Serial.begin(115200);  dht.begin();  analogReadResolution(12); // Set ADC resolution to 12-bit  // Initialize OLED display  if(!display.begin(SSD1306_SWITCHCAPVCC)) {    Serial.println(F("SSD1306 allocation failed"));    for(;;); // Don't proceed, loop forever;  }  //display.display();  // Connect to Wi-Fi  WiFi.begin(ssid, password);  while (WiFi.status() != WL_CONNECTED) {    delay(1000);    Serial.println("Connecting to WiFi...");  }  Serial.println("Connected to WiFi");  // Initialize time client  timeClient.begin(); }void loop() {    // Update time from NTP server  timeClient.update();  unsigned long epochTime = timeClient.getEpochTime();  struct tm *ptm = gmtime ((time_t *)&epochTime);  int monthDay = ptm->tm_mday;  int currentMonth = ptm->tm_mon+1;  int currentYear = ptm->tm_year+1900;  int currentHour = ptm->tm_hour;  int currentMinute = ptm->tm_min;   int currentSecond = ptm->tm_sec; float batteryVoltage = readBatteryVoltage();  float batteryPercentage = calculateBatteryPercentage(batteryVoltage);  // Get temperature and humidity float t = dht.readTemperature();  float h = dht.readHumidity();  // Convert time to 12-hour format  String period = "AM";  if (currentHour >= 12) {    period = "PM";    if (currentHour > 12) {      currentHour -= 12;    }  } else if (currentHour == 0) {    currentHour = 12;   }  // Display data on OLED   display.clearDisplay();  display.setTextColor(SSD1306_WHITE);  // Display time  display.setCursor(19,6);  display.setTextSize(3);  if (currentHour < 10) display.print('0');  display.print(currentHour);  display.print(':');  if (currentMinute < 10) display.print('0');  display.print(currentMinute);  display.setTextSize(1);  display.setCursor(108, 39);  display.print(period);  // Display date  display.setCursor(36, 39);  if (monthDay < 10) display.print('0');  display.print(monthDay);  display.print('/');  if (currentMonth < 10) display.print('0');  display.print(currentMonth);  display.print('/');  display.print(currentYear);  // Display temperature  display.setCursor(79, 53);  display.print(t);  display.print("C");   // Display humidity  display.setCursor(22, 53);  display.print(h);  display.print("%");  display.drawBitmap(0, 0, image_paint_0_bits, 128, 64, 1);  display.setCursor(14, 39);  display.print(batteryPercentage,0);  display.drawBitmap(8, 39, image_paint_1_bits, 4, 7, 1);   display.display();  // Delay before the next update  delay(1000);}
 

步骤4、接线示意图

图片

好像接线有点复杂吧?但只需遵循电线连接的颜色和端点上的标签即可。此外,驱动板和原理图上使用的线材颜色是相同的,所以拿起你的工具,让我们开始构建吧

XIAO ESP32C3 支持锂电池充放电管理。这意味着 BMS 是内置的。因此,不需要外部BMS。您可以通过 USB 端口为电池充电          

步骤5、组装和接线

我们可以先在 Xiao 的背面创建一个分压器解题步骤 5.1

首先,我们需要在 Xiao 电池端接下放一些 Kapton 胶带

图片

解题步骤 5.2

将 10k SMD 电阻焊接到两个电池输入端。然后,使用小规格线将电阻器的另一端连接到 D1 引脚以测量电池电压。

图片

解题步骤 5.3

将电池的正极端子连接到电源开关的一个端子,并将开关的另一个端子连接到 Xiao 的 BAT+。此外,将电池的负极端子直接连接到 Xiao 的 BAT-。此外,将所有电线放在底架中,确保所有电线的长度都合适

图片

解题步骤 5.4

用胶水粘住电池、小和电源开关。我已经为组件设计了插槽以适应。确保将 xiao 下方的电线穿过缝隙。

图片

解题步骤 5.5 将 DHT11 的端子切割成适当的长度。在 DTH10 的 VCC 和 DATA 线之间焊接一个 11k 电阻器。此外,将 3 根电线焊接到 VCC、GND 和 DATA,长度可以到达 Xiao 引脚。我在这里使用通孔 10k 电阻器

图片

图片

解题步骤 5.6

将 DHT11 倒置放入小窗口中。现在,使用我们的 B-11 多用途胶水粘合 DHT7000。(我们在这里不使用热胶,因为热量可能会损坏传感器。

图片

解题步骤 5.7

将 DHT11 传感器线焊接到 Xiao 中,我还用 Kapton 胶带进行了一些线材管理。现在我们已经完成了下架的大部分工作,让我们继续上半身

图片

解题步骤 5.8

在此步骤中要非常小心,因为我们将OLED屏幕安装到主体中。处理显示器时不要施加太大的压力,因为它很容易损坏。我们将使用 B-7000 多用途胶水将显示器连接到 3D 打印上。确保显示器的方向正确。

图片

使用驱动板测试显示器时,请务必检查柔性电缆的方向。

图片

在框架的内角、底部和左右角涂上胶水。不要使用过多的胶水,它会从边缘溢出

图片

现在小心地将显示器放入框架中,并确保方向正确。

图片

让胶水干燥 20 分钟。

图片

解题步骤 5.9

将汽车内部放在主体内,并用强力胶粘合

图片

图片

解题步骤 5.10

将OLED驱动板粘在车身背面,连接助焊剂电缆

图片

解题步骤 5.11

现在将灯条推入前面的小缝隙中 3D 打印。如果需要,可以粘上它

图片

解题步骤 5.12

将 Xiao esp32 天线粘在机身内

图片

解题步骤 5.13

连接 JST 连接器并将显示驱动器线切割成适当的长度,然后将它们焊接到 Xiao.还要连接天线端口。

图片

图片

图片

解题步骤 5.14

将上半身放入底架并用两个 M3 螺钉拧紧。

图片

图片

解题步骤 5.15

使用 m3 螺钉将所有四个车轮拧入前后轴向。如果您的车轮需要旋转,请不要拧紧螺丝。如果您需要锁定车轮,只需拧紧螺丝即可

图片

图片

解题步骤 5.16

接下来,使用一些强力胶,我们将在底架下方粘合前后轴向

图片

图片

解题步骤 5.17

这将是建造的最后一步,将两个屋顶组件粘合在主体顶部

图片

图片

是的,项目的组装已经完成现在使用背面的滑动开关打开时钟电源。您也可以通过Xiao USB为电池充电

图片

等待几秒钟。它将通电。时间将自动更新。如果没有,请检查您输入的 WiFi 密码和 SSID 是否正确

图片

步骤6、故障排除

车轮不能自由旋转:检查车轮螺钉是否不太紧。此外,车轮的孔需要比螺钉大。尝试在3D打印后清除轮孔

时间不更新:在启动过程中,系统最初可能会显示不正确的时间,例如 1971 年,但它会迅速更新到正确的时间。如果它不起作用,这将是网络问题,还要检查您在编程过程中输入的Wi-Fi密码和SSID 电池不充电:电池只能在电源开关打开时充电。通过Xiao内部的BMS管理的电池

关于传感器数据:如果电池电量低于 20%,传感器可能无法提供数据tage 低,因此请为电池充电

关于Cyber Clock 的其他想法

图片

Gokux相信这个项目非常适合汽车爱好者。您可以轻松构建并赠送给热爱汽车的朋友和家人。它是任何办公桌设置的绝佳补充,从黄昏提供梦幻般的视角。这个项目确实是独一无二的,他认为市场上没有类似的东西。如果您需要其他车型,请告诉Gokux,这个项目有很大的潜力。

---end---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值