登录/注册

用stm32设计一个电子闹钟

用stm32设计一个电子闹钟

更多

设计一个基于STM32的电子闹钟,以下是详细步骤和代码框架:


硬件设计

  1. 核心组件

    • STM32F103C8T6(或其他带RTC的型号)
    • OLED显示屏(SSD1306,I2C接口)
    • 蜂鸣器(无源)
    • 按键x4(设置、加、减、确认)
    • DS3231高精度RTC模块(可选,提高精度)
  2. 连接方式

    • OLED:SCL→PB6, SDA→PB7
    • 蜂鸣器:PB8
    • 按键:设置→PA0, 加→PA1, 减→PA2, 确认→PA3
    • DS3231(若使用):SCL→PB10, SDA→PB11

软件设计(基于HAL库)

1. 初始化配置

#include "stm32f1xx_hal.h"
#include "ssd1306.h"

// 定义按键
#define SET_BTN_PIN GPIO_PIN_0
#define UP_BTN_PIN GPIO_PIN_1
#define DOWN_BTN_PIN GPIO_PIN_2
#define OK_BTN_PIN GPIO_PIN_3
#define BTN_PORT GPIOA

// 蜂鸣器控制
#define BUZZER_PIN GPIO_PIN_8
#define BUZZER_PORT GPIOB

// 状态枚举
typedef enum {
  CLOCK_DISPLAY,
  SET_HOUR,
  SET_MINUTE,
  SET_ALARM_HOUR,
  SET_ALARM_MINUTE
} Mode;

2. RTC配置

void RTC_Init(void) {
  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};

  // 启用RTC时钟
  __HAL_RCC_RTC_ENABLE();

  // 初始化时间(示例:2023-10-01 12:00:00)
  sTime.Hours = 12;
  sTime.Minutes = 0;
  sTime.Seconds = 0;
  HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);

  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  sDate.Month = RTC_MONTH_OCTOBER;
  sDate.Date = 1;
  sDate.Year = 23;
  HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}

3. 主循环逻辑

int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  SSD1306_Init();
  RTC_Init();

  Mode currentMode = CLOCK_DISPLAY;
  uint8_t alarmHour = 7, alarmMinute = 30;
  uint8_t alarmEnabled = 0;

  while (1) {
    RTC_TimeTypeDef currentTime;
    HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BIN);

    // 检查闹钟触发
    if (alarmEnabled && currentTime.Hours == alarmHour && currentTime.Minutes == alarmMinute) {
      HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_SET); // 蜂鸣器响
      HAL_Delay(500);
      HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET);
    }

    // 按键扫描
    if (HAL_GPIO_ReadPin(BTN_PORT, SET_BTN_PIN) == GPIO_PIN_RESET) {
      HAL_Delay(50); // 消抖
      currentMode = (currentMode + 1) % 5; // 循环切换模式
    }

    // 根据模式更新显示
    switch(currentMode) {
      case CLOCK_DISPLAY:
        displayClock(currentTime); // 显示当前时间
        break;
      case SET_HOUR:
        adjustTime(&currentTime.Hours); // 调整小时
        break;
      // 其他模式类似...
    }
    HAL_Delay(100);
  }
}

4. OLED显示函数

void displayClock(RTC_TimeTypeDef time) {
  char buffer[20];
  sprintf(buffer, "Time: %02d:%02d:%02d", time.Hours, time.Minutes, time.Seconds);
  SSD1306_GotoXY(0, 0);
  SSD1306_Puts(buffer, &Font_7x10, SSD1306_COLOR_WHITE);
  SSD1306_UpdateScreen();
}

5. 按键调整函数

void adjustTime(uint8_t *value) {
  if (HAL_GPIO_ReadPin(UP_BTN_PIN)) {
    (*value)++;
    if (*value > 23) *value = 0;
  }
  if (HAL_GPIO_ReadPin(DOWN_BTN_PIN)) {
    (*value)--;
    if (*value < 0) *value = 23;
  }
  if (HAL_GPIO_ReadPin(OK_BTN_PIN)) {
    // 保存到RTC
    HAL_RTC_SetTime(&hrtc, &updatedTime, RTC_FORMAT_BIN);
  }
}

关键功能

  1. 时间显示:实时显示时/分/秒。
  2. 闹钟设置:独立存储闹钟时间,支持开关。
  3. 按键交互
    • 设置键:切换调整模式(时、分、闹钟时、闹钟分)
    • 加减键:调整数值
    • 确认键:保存设置
  4. 闹钟触发:时间匹配时蜂鸣器鸣响0.5秒。

优化建议

  1. 低功耗设计
    • 空闲时进入STOP模式,通过RTC闹钟中断唤醒。
  2. 增加功能
    • 多组闹钟
    • 温度显示(DS3231自带)
    • 电池备份(VBAT引脚接纽扣电池)
  3. 错误处理
    • 添加RTC初始化失败检测
    • 按键长按加速调整

注意:实际开发需在CubeMX中配置RTC时钟源(LSE)、I2C引脚,并生成初始化代码。完整工程需包含SSD1306驱动库。

觉醒时刻:电子闹钟功耗大探索 | 老陆测功耗08

氛围的显眼包……为避免这尴尬的场景,是时候深入了解下电子闹钟的功耗与续航性能。叮铃铃~正片来啦今天我们一起来看看

2024-07-09 08:04:45

如何使用运动检测传感器创建闹钟

我使用运动检测传感器创建了一个闹钟,这样您就不能只是按下贪睡按钮并重新入睡。

2022-07-21 17:31:44

STM32来DIY示波器

下周一开始,一套硬禾学堂精心制作的大课就要正式上线播出了 - 用STM32

2022-07-12 09:53:46

创建Arduino UNO闹钟

电子发烧友网站提供《创建一个Arduino UNO闹钟.zip》资料免费

资料下载 杨海清 2022-12-27 10:35:29

基于DS3231实时时钟模块的stm32简易闹钟

stm32简易闹钟设计、制作一个简易的

资料下载 佚名 2021-12-24 19:31:41

STM32CubeMX | 基于STM32使用HAL库驱动RTC时钟及闹钟功能

STM32使用HAL库驱动RTC时钟及闹钟功能目录STM32使用HAL库驱动RTC时钟及

资料下载 王强 2021-12-06 09:21:15

STM32CubeMX | 40 - 实时时钟RTC的使用(日历和闹钟

STM32CubeMX | 40 - 实时时钟RTC的使用(日历和闹钟)

资料下载 李娜 2021-11-23 18:06:59

电子闹钟源码文件下载

电子闹钟源码文件下载

资料下载 苏车把 2021-05-17 09:53:49

如何利用DS3231设计简易的闹钟

stm32简易闹钟设计、制作一个简易的

2022-02-21 06:05:55

如何实现stm32的每隔定时间RTC闹钟响铃次?

如何实现stm32的每隔一定时间RTC闹钟响铃一次?

2022-02-07 09:04:18

STM32L4待机模式闹钟唤醒方法

STM32L4待机模式闹钟唤醒方法在很多低功耗应用中都会用到待机模式,而在使用待机模式的同时一定要用

2022-01-13 07:27:23

STM32F103上的RTC闹钟中断功能以及闹钟中断唤醒STM32的待机模式

RTC代表的是实时时钟的意思。因为它提供的时钟基准比较准确所以用处还是很多的。本文章主要讲解基于STM32F103上的RTC闹钟中断功能以及用

2021-08-13 07:29:06

款简易电子闹钟相关资料分享

简易电子闹钟的电路如图所示,电路由电子延迟开关与振荡器等两大部分组成。

2021-04-26 07:14:33

浅谈STM32_RTC闹钟

STM32_RTC闹钟

2020-04-08 11:14:22

请问怎么HAL库的RTC设置闹钟设置2天3小时4分5秒的闹钟中断?

怎样用HAL库的RTC设置闹钟设置一个2天3小时4分5秒的

2019-06-10 08:39:39
7天热门专题 换一换
相关标签