没有rtc项目错误的Ardunio闹钟

时间:2018-08-18 00:45:46

标签: c arduino-uno

我目前在没有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);
}

1 个答案:

答案 0 :(得分:0)

我认为在代码中抛出所有这些延迟不是一个好策略。如果要使用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的范围有限,您可能需要使用 long 变量。您还需要注意更改时间时的时间间隔。如果您减少时间,则需要注意pramaters[0]不会变成负数。如果确实如此,则需要添加3600 * 24 * 1000 msecs使其前一天跳起来(3600 * 24是一天中的秒数)。我希望您理解这不是解决问题的方法,而是使用一些简单代码结构的替代方法。