zcllom 发表于 2023-6-16 16:42:14

询问大家一个关于时间点范围,时刻区间的算法代码

本帖最后由 zcllom 于 2023-6-16 17:13 编辑

用单片机做了一个关于闹钟提醒的程序,用了stc的内部实时时钟,配合外部32.768晶振,时间点很准,一天大约设置8个闹钟,到点提醒很好做。
但现在需要在时间点区间范围之内都能提醒。比如设置8个闹钟(都是随机的),
例如:8:10,10:20,12:35,13:00,15:10,22:10,23:00,00:05,   要求在它们每个时间点范围的正负15分钟都有效,比如15:10,在14:55~15:25 都能触发;   而00:05,在23:50~00:20都有效触发。
这个有什么简略实现方法?

lb0857 发表于 2023-6-16 16:56:27

GPT给你五秒钟来一个{:biggrin:}

要实现在时间点区间范围内都能提醒的功能,你可以按照以下步骤进行操作:

1. 首先,获取当前的时间和日期,以便与设置的闹钟进行比较。

2. 对于每个闹钟时间点,计算出其正负15分钟的时间范围。例如,对于闹钟时间点15:10,时间范围为14:55~15:25。

3. 检查当前时间是否在任何一个闹钟的时间范围内。如果是,则触发提醒。

4. 为了确保程序能够持续运行并及时检查时间,你可以使用一个循环来不断检查当前时间,并与闹钟时间进行比较。

下面是一个示例代码,使用C语言编写,基于STC单片机:

```c
#include <reg52.h>

// 定义闹钟时间点数组
unsigned char alarmTimes = {
    {8, 10},
    {10, 20},
    {12, 35},
    {13, 0},
    {15, 10},
    {22, 10},
    {23, 0},
    {0, 5}
};

// 定义闹钟时间范围偏移量(正负15分钟)
unsigned char alarmOffset = 15;

// 获取当前时间和日期
void getCurrentTime(unsigned char *hour, unsigned char *minute) {
    // 使用STC内部实时时钟获取当前时间和日期
    // 将当前小时和分钟存储到hour和minute变量中
}

// 检查当前时间是否在闹钟时间范围内
bit isTimeInRange(unsigned char alarmHour, unsigned char alarmMinute, unsigned char currentHour, unsigned char currentMinute) {
    // 计算闹钟时间范围的起始时间和结束时间
    unsigned char startHour = alarmHour;
    unsigned char startMinute = alarmMinute - alarmOffset;
    unsigned char endHour = alarmHour;
    unsigned char endMinute = alarmMinute + alarmOffset;

    // 处理时间范围跨越小时的情况
    if (startMinute < 0) {
      startHour -= 1;
      startMinute += 60;
    }
    if (endMinute >= 60) {
      endHour += 1;
      endMinute -= 60;
    }

    // 检查当前时间是否在时间范围内
    if ((currentHour > startHour || (currentHour == startHour && currentMinute >= startMinute)) &&
      (currentHour < endHour || (currentHour == endHour && currentMinute <= endMinute))) {
      return 1; // 在时间范围内
    } else {
      return 0; // 不在时间范围内
    }
}

void main() {
    unsigned char currentHour, currentMinute;
    unsigned char i;

    while (1) {
      // 获取当前时间
      getCurrentTime(&currentHour, &currentMinute);

      // 检查每个闹钟时间是否在范围内
      for (i = 0; i < 8; i++) {
            if (isTimeInRange(alarmTimes, alarmTimes, currentHour, currentMinute)) {
                // 触发提醒
                // 在这里执行你的提醒操作,例如发出蜂鸣声或显示提醒信息
            }
      }
    }
}
```

请注意,以上代码只是一个示例,你需要根据自己的具体需求进行适当的修改和调整。例如,你可能需要根据你的硬件平台和编程语言的要求进行相应的更改。

lb0857 发表于 2023-6-16 16:56:55

不期望百分百但是思路发现是对的

zcllom 发表于 2023-6-16 17:05:40

lb0857 发表于 2023-6-16 16:56
GPT给你五秒钟来一个
(引用自2楼)

拥有GPT是件幸福的事{:biggrin:}

lb0857 发表于 2023-6-16 17:06:04

zcllom 发表于 2023-6-16 17:05
拥有GPT是件幸福的事
(引用自4楼)

验证起来结果也反馈一下

wxws 发表于 2023-6-16 17:12:05

gpt居然主动 生成基于stc ? 还是指定的

zcllom 发表于 2023-6-16 17:12:05

lb0857 发表于 2023-6-16 17:06
验证起来结果也反馈一下
(引用自5楼)

我先仔细看看它给出的代码。
最关键的是 零点左右的时刻 比如 00:05,它在转钟前是23点多。

zcllom 发表于 2023-6-16 17:25:53

本帖最后由 zcllom 于 2023-6-16 17:27 编辑

lb0857 发表于 2023-6-16 17:06
验证起来结果也反馈一下
(引用自5楼)

    // 处理时间范围跨越小时的情况
    if (startMinute < 0) {
      startHour -= 1;
      startMinute += 60;
    }
    if (endMinute >= 60) {
      endHour += 1;
      endMinute -= 60;
    }

这里的处理不妥当,假如时钟在零点附近,会出现0-1的小时时间,或者会出现23+1的小时时间
只考虑了跨小时,而没有考虑跨天。

xy3dg12 发表于 2023-6-16 17:29:57

简单直接粗暴的方法,把时间换算成一个秒的计数器,这样就省了跨小时跨天的计算。

d__xin 发表于 2023-6-16 17:30:18

把时间转成时间戳,直接计算就行了

Doding 发表于 2023-6-16 17:33:41

用时间戳,按秒加减计算,不用考虑跨小时或跨天问题。

yyts 发表于 2023-6-17 18:35:14

把一天的时间转成秒数,你就好算了

2avr 发表于 2023-6-21 22:06:33

   unsigned char startMinute = alarmMinute - alarmOffset;
    unsigned char endHour = alarmHour;
    unsigned char endMinute = alarmMinute + alarmOffset;   
都是unsigned char。不可能有负数的吧。

t3486784401 发表于 2023-6-21 22:18:56

2avr 发表于 2023-6-21 22:06
unsigned char startMinute = alarmMinute - alarmOffset;
    unsigned char endHour = alarmHour;
    ...
(引用自13楼)

是的,肉眼可见的 bug.
页: [1]
查看完整版本: 询问大家一个关于时间点范围,时刻区间的算法代码