返回
一学就会!利用STM32和OLED显示屏制作指针式电子钟
后端
2023-11-19 02:48:41
制作指针式电子钟:让你的时间焕发生机
背景
时间是生活中必不可少的元素,指针式时钟以其经典的魅力和可靠的计时而深受喜爱。如今,随着科技的发展,将指针式时钟与现代电子技术相结合,创造出令人惊叹的指针式电子钟。本文将深入探讨如何利用 STM32 微控制器和 OLED 显示屏制作这样一个独特的电子钟,让你的时间焕发生机。
硬件准备
踏上制作之旅的第一步是准备好必要的硬件组件:
- STM32 微控制器开发板: 作为电子钟的大脑,它将负责处理时间和控制显示。
- OLED 显示屏: 它将作为钟面的画布,显示指针和时间信息。
- 按钮(2个): 用于设置和调整时间。
- 电阻器(10kΩ,4个): 用于保护电路和限制电流。
- 电容器(10μF,1个): 用于稳定电路。
- 电池(3.7V 锂电池): 为电子钟供电。
- 面包板和导线: 用于连接所有组件。
软件工具
除了硬件之外,还需要以下软件工具:
- Arduino IDE: 一个集成的开发环境,用于编写和上传代码。
- STM32duino 库: 一个专为 STM32 微控制器设计的扩展库。
- OLED 库: 一个专门用于控制 OLED 显示屏的库。
电路连接
电路连接是电子钟制作的关键步骤。按照以下步骤小心地连接所有组件:
- 将 OLED 显示屏的 SDA 引脚连接到微控制器的 A4 引脚。
- 将 OLED 显示屏的 SCL 引脚连接到微控制器的 A5 引脚。
- 将两个按钮的引脚连接到微控制器的 A0 和 A1 引脚。
- 在按钮和微控制器之间放置 10kΩ 电阻器。
- 将电容器连接到电池的正极和负极。
- 将电池连接到电路中。
代码编写
有了硬件和软件工具,现在是时候编写代码了。以下是制作指针式电子钟的关键代码示例:
// 导入必要的库
#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 微控制器开发板了:
- 将微控制器开发板连接到计算机。
- 在 Arduino IDE 中打开代码文件。
- 选择正确的开发板和端口。
- 单击“上传”按钮。
测试电子钟
代码上传成功后,就可以测试电子钟了:
- 给电子钟供电。
- 按下按钮设置时间。
- 观察电子钟是否正常显示时间。
如果一切顺利,你已经成功制作了一个功能齐全的指针式电子钟!
常见问题解答
1. 如何调整电子钟的时间?
答:按下按钮即可调整时间。向上按钮增加时间,向下按钮减少时间。
2. 电子钟的电池能用多久?
答:电池续航时间取决于电池容量和电子钟的使用频率。使用大容量电池或减少显示屏亮度可以延长电池续航时间。
3. 如果电子钟无法显示时间,该怎么办?
答:首先检查代码是否正确上传,电路连接是否牢固。如果仍然无法解决,请尝试更换 OLED 显示屏或微控制器。
4. 如何更改电子钟的显示模式?
答:代码中提供了绘制指针的函数。你可以修改这些函数来创建不同的显示模式,例如数字时钟或模拟时钟。
5. 电子钟可以防水吗?
答:否,除非采取额外的防防水措施,否则电子钟不防水。