返回

一学就会!利用STM32和OLED显示屏制作指针式电子钟

后端

制作指针式电子钟:让你的时间焕发生机

背景

时间是生活中必不可少的元素,指针式时钟以其经典的魅力和可靠的计时而深受喜爱。如今,随着科技的发展,将指针式时钟与现代电子技术相结合,创造出令人惊叹的指针式电子钟。本文将深入探讨如何利用 STM32 微控制器和 OLED 显示屏制作这样一个独特的电子钟,让你的时间焕发生机。

硬件准备

踏上制作之旅的第一步是准备好必要的硬件组件:

  • STM32 微控制器开发板: 作为电子钟的大脑,它将负责处理时间和控制显示。
  • OLED 显示屏: 它将作为钟面的画布,显示指针和时间信息。
  • 按钮(2个): 用于设置和调整时间。
  • 电阻器(10kΩ,4个): 用于保护电路和限制电流。
  • 电容器(10μF,1个): 用于稳定电路。
  • 电池(3.7V 锂电池): 为电子钟供电。
  • 面包板和导线: 用于连接所有组件。

软件工具

除了硬件之外,还需要以下软件工具:

  • Arduino IDE: 一个集成的开发环境,用于编写和上传代码。
  • STM32duino 库: 一个专为 STM32 微控制器设计的扩展库。
  • OLED 库: 一个专门用于控制 OLED 显示屏的库。

电路连接

电路连接是电子钟制作的关键步骤。按照以下步骤小心地连接所有组件:

  1. 将 OLED 显示屏的 SDA 引脚连接到微控制器的 A4 引脚。
  2. 将 OLED 显示屏的 SCL 引脚连接到微控制器的 A5 引脚。
  3. 将两个按钮的引脚连接到微控制器的 A0 和 A1 引脚。
  4. 在按钮和微控制器之间放置 10kΩ 电阻器。
  5. 将电容器连接到电池的正极和负极。
  6. 将电池连接到电路中。

代码编写

有了硬件和软件工具,现在是时候编写代码了。以下是制作指针式电子钟的关键代码示例:

// 导入必要的库
#include <Arduino.h>
#include <STM32duino.h>
#include <OLED.h>

// 定义 OLED 显示屏的引脚
#define OLED_SDA A4
#define OLED_SCL A5

// 创建 OLED 显示屏对象
OLED display(OLED_SDA, OLED_SCL);

// 定义按钮的引脚
#define BUTTON_UP A0
#define BUTTON_DOWN A1

// 创建按钮对象
PushButton buttonUp(BUTTON_UP);
PushButton buttonDown(BUTTON_DOWN);

// 定义指针变量
int hour = 12;
int minute = 0;
int second = 0;

// 定义显存数组
uint8_t displayBuffer[128 * 64 / 8];

// 设置 OLED 显示屏
void setup() {
  // 初始化 OLED 显示屏
  display.begin();

  // 清除显存数组
  memset(displayBuffer, 0, sizeof(displayBuffer));

  // 设置显示屏的对比度
  display.setContrast(255);

  // 设置显示屏的亮度
  display.setBrightness(255);
}

// 循环
void loop() {
  // 读取按钮的状态
  bool buttonUpPressed = buttonUp.isPressed();
  bool buttonDownPressed = buttonDown.isPressed();

  // 更新时间
  if (buttonUpPressed) {
    hour++;
    if (hour > 12) {
      hour = 1;
    }
  } else if (buttonDownPressed) {
    hour--;
    if (hour < 1) {
      hour = 12;
    }
  }

  // 绘制时针
  drawHourHand();

  // 绘制分针
  drawMinuteHand();

  // 绘制秒针
  drawSecondHand();

  // 将显存数组刷新到 OLED 显示屏上
  display.refresh(displayBuffer);

  // 延迟 1 秒
  delay(1000);
}

// 绘制时针
void drawHourHand() {
  // 计算时针的角度
  float hourAngle = (hour * 30) + (minute / 2);

  // 计算时针的终点坐标
  int hourX = 64 + (sin(radians(hourAngle)) * 30);
  int hourY = 32 + (cos(radians(hourAngle)) * 30);

  // 在显存数组中绘制时针
  drawLine(64, 32, hourX, hourY, WHITE);
}

// 绘制分针
void drawMinuteHand() {
  // 计算分针的角度
  float minuteAngle = (minute * 6);

  // 计算分针的终点坐标
  int minuteX = 64 + (sin(radians(minuteAngle)) * 40);
  int minuteY = 32 + (cos(radians(minuteAngle)) * 40);

  // 在显存数组中绘制分针
  drawLine(64, 32, minuteX, minuteY, WHITE);
}

// 绘制秒针
void drawSecondHand() {
  // 计算秒针的角度
  float secondAngle = (second * 6);

  // 计算秒针的终点坐标
  int secondX = 64 + (sin(radians(secondAngle)) * 50);
  int secondY = 32 + (cos(radians(secondAngle)) * 50);

  // 在显存数组中绘制秒针
  drawLine(64, 32, secondX, secondY, WHITE);
}

// 在显存数组中绘制一条线
void drawLine(int x0, int y0, int x1, int y1, uint8_t color) {
  int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
  int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
  int err = dx - dy;

  while (x0 != x1 || y0 != y1) {
    displayBuffer[x0 + (y0 / 8) * 128] |= (1 << (y0 % 8));

    int e2 = 2 * err;
    if (e2 > -dy) {
      err -= dy;
      x0 += sx;
    }
    if (e2 < dx) {
      err += dx;
      y0 += sy;
    }
  }
}

上传代码

用 Arduino IDE 编写好代码后,就可以上传到 STM32 微控制器开发板了:

  1. 将微控制器开发板连接到计算机。
  2. 在 Arduino IDE 中打开代码文件。
  3. 选择正确的开发板和端口。
  4. 单击“上传”按钮。

测试电子钟

代码上传成功后,就可以测试电子钟了:

  1. 给电子钟供电。
  2. 按下按钮设置时间。
  3. 观察电子钟是否正常显示时间。

如果一切顺利,你已经成功制作了一个功能齐全的指针式电子钟!

常见问题解答

1. 如何调整电子钟的时间?

答:按下按钮即可调整时间。向上按钮增加时间,向下按钮减少时间。

2. 电子钟的电池能用多久?

答:电池续航时间取决于电池容量和电子钟的使用频率。使用大容量电池或减少显示屏亮度可以延长电池续航时间。

3. 如果电子钟无法显示时间,该怎么办?

答:首先检查代码是否正确上传,电路连接是否牢固。如果仍然无法解决,请尝试更换 OLED 显示屏或微控制器。

4. 如何更改电子钟的显示模式?

答:代码中提供了绘制指针的函数。你可以修改这些函数来创建不同的显示模式,例如数字时钟或模拟时钟。

5. 电子钟可以防水吗?

答:否,除非采取额外的防防水措施,否则电子钟不防水。