C语言 没有 rtc 项目错误的 Ardunio 闹钟



我目前正在一个没有和RTC的学校Ardunio闹钟项目工作。我的小时变量没有增加并且我的条件检查它有问题。

这段代码主要有效,我可以以小时和分钟为单位设置时间,但是当计时器达到 59 分钟时,小时不会增加 1。已发布的第二个代码是问题所在。任何提示/帮助将不胜感激。

#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>
#include <EEPROM.h>
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

const int numofMenus = 4;
int currentMenu = 0;
String menu[4][2] = {{"Set hour", "hr"}, {"Set minutes", "min"}, {"Set alarm", "o"}, {"Current Time", "ha"}};
int parameters[24];
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.noBlink();

}
void loop() {
inputAction();
if (currentMenu == 0)
{
printScreen();
}
if (currentMenu == 1)
{
printScreen();
}
if (currentMenu == 2)
{
printScreen();
}
if (currentMenu == 3)
{
int hr = parameters[0];
int mn = minute(parameters[1]);
int sec = second();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
if (parameters[1] >= 0 && parameters[1] <= 59 && sec < 59) {
parameters[0];
printtime(parameters[0]);
}
else if (parameters[1] == 59 && second() == 59) {
if (parameters[0]>=0 && parameters[0]<24){
parameters[0];
printtime(parameters[0]++);
//delay(1000);}
/*else if (parameters[0] == 24){
parameters[0]= 0;
printtime(parameters[0]);
}*/
}
}
lcd.print(":");
if (sec >= 0 && sec < 59) {
printtime(parameters[1]);
}
else if (sec == 59) {
parameters[1];
printtime(parameters[1]++);
delay(1000);
}
lcd.print(":");
printtime(sec);
/* if (sec == 60) {
mn+1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
printtime(hr);
lcd.print(":");
printtime(mn);
lcd.print(":");
printtime(sec);
}
if (mn == 60) {
hr+1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
printtime(hr);
lcd.print(":");
printtime(mn);
lcd.print(":");
printtime(sec);
}*/
delay (100);
}
}


void inputAction() {
uint8_t buttons = lcd.readButtons();
if (buttons & BUTTON_UP) {
if (currentMenu == 0) {
currentMenu = numofMenus - 1;
} else {
currentMenu--;
}
} else if (buttons & BUTTON_DOWN) {
if (currentMenu == numofMenus - 1) {
currentMenu = 0;
} else {
currentMenu++;
}
} else if (buttons & BUTTON_RIGHT) {
parameters[currentMenu]++;
} else if (buttons & BUTTON_LEFT) {
parameters[currentMenu]--;
}
}
void printScreen() {
lcd.clear();
lcd.print(menu[currentMenu][0]);
lcd.setCursor(0, 1);
lcd.print(parameters[currentMenu]);
lcd.print(" ");
lcd.print(menu[currentMenu][1]);
delay(100);
}
void printtime(int data) {
if (data >= 0 && data < 10) {
lcd.print('0');
}
lcd.print(data);
}

我认为在代码中抛出所有这些延迟不是一个好的策略。如果你想使用RTC,你需要注意这些延迟,因为它们会影响程序的功能。如果您没有正确考虑延迟,它们将累积为错误。100毫秒的错误将在几天内很容易error in seconds

我没有浏览您的代码,因为它很难理解。我建议你看看这个代码,它应该放在你的loop()函数中:

delay(100);
parameters = parameters + 100;    
long rtcSeconds = parameters / 1000;
int seconds = (int) (rtcSeconds % 60);  // Range 0 . 59  units: Secs
int minutes = (int)(((rtcSeconds - seconds) / 60) % 60);   // Range 0 . 59  units: Mins
int hours =   (int) (((rtcSeconds -  minutes*60 - seconds) / (3600)) % 24);   // Range 0 . 23 units: Hrs

我正在使用您的parameters[0]字段来跟踪系统中的时间,以毫秒为单位。如您所见,该字段每 100 毫秒增加一次。您可以使用模数(%(和除法运算的组合来恢复不同的时间值。现在,我知道你需要增加程序的时间。要做到这一点,很容易:

  • 如果要增加一秒,请执行以下操作:parameters[0] += 1000;
  • 如果要增加一分钟,请执行以下操作:parameters[0] += 1000 * 60;
  • 如果要增加一小时,请执行以下操作:parameters[0] += 1000 * 3600;

现在,您可能需要使用变量,因为 int 的范围有限。您还需要注意更改时间时的时间滚动。如果你正在减少时间,你需要注意pramaters[0]不会变成负面的。如果是这样,您需要添加3600 * 24 * 1000 msecs以强制它提前一天跳跃(3600 * 24以秒为单位跳跃一天(。我希望您了解这不是您问题的解决方案,而是使用更简单的代码结构的替代方法。

最新更新