Is the timer of an arduino accurate enough to build a clock or do I need a RTC? I have some problems with the precision of my clock. I use a TFT display to show the date and the time, it works just fine but the clock is running too slow. has anyone a solution? I'm going to use this in a project, the code is not complete yet but I have to get this part right first. Here is my code:
#include <Adafruit_GFX.h> #include <MCUFRIEND_kbv.h> // bibliotheek voor het communiceren met het diplay #include "DHT.h" #include <stdio.h> MCUFRIEND_kbv tft; // maak een display aan DHT dht; #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif #define BLACK 0x0000 /* 0, 0, 0 */ #define WHITE 0xFFFF /* 255, 255, 255 */ uint8_t hh, mm, ss; int date_month, date_day, date_year; String date_month_string, date_day_string, date_year_string; unsigned long time_val, old_time_val, old_time_val_1; int text_size = 3; int time_cursor_x = 10; int time_cursor_y = 110; uint8_t conv2d(const char* p) { uint8_t v = 0; if ('0' <= *p && *p <= '9') v = *p - '0'; return 10 * v + *++p - '0'; } void setup() { // put your setup code here, to run once: Serial.begin(9600); // begin de seriële monitor while (!Serial) ; // wacht tot deze is opgestard String date_string = __DATE__; tft.reset(); // reset het tft display tft.begin(0x7783); // begin de communicatie met het display met adres 0x7783 tft.setRotation(1); // roteer het display zodat het in landscape modus staat tft.fillScreen(BLACK); hh = conv2d(__TIME__); mm = conv2d(__TIME__ + 3); ss = conv2d(__TIME__ + 6); date_month_string = date_string.substring(0, 3); date_day_string = date_string.substring(4, 6); date_year_string = date_string.substring(7, 11); date_year = date_year_string.toInt(); date_day = date_day_string.toInt(); date_month = month_string_to_int(date_month_string); OCR0A = 0xAF; TIMSK0 |= _BV(OCIE0A); } void loop() { // put your main code here, to run repeatedly: text_size = 3; time_cursor_x = 10; time_cursor_y = 110; } SIGNAL(TIMER0_COMPA_vect){ time_val = millis(); if ((time_val - old_time_val) >= 1000) { if (++ss > 59) { ss = 0; mm++; if (mm > 59) { mm = 0; hh++; if (hh > 23) { hh = 0; date_day++; if (date_day == 31 && (date_month == 1 || date_month == 3 || date_month == 5 || date_month == 7 || date_month == 8 || date_month == 10 || date_month == 12)) { date_day = 0; date_month++; if (date_month > 11) { date_month = 1; date_year++; } } if (date_day == 30 && (date_month == 4 || date_month == 6 || date_month == 9 || date_month == 11)) { date_day = 0; date_month++; } if (date_day == 28 && date_month == 2 && (date_year % 4) != 0) { date_day = 0; date_month++; } if (date_day == 29 && date_month == 2 && (date_year % 4) == 0) { date_day = 0; date_month++; } } } } tft.setTextColor(WHITE); tft.setTextSize(text_size); char buf[8]; char buf_2[12]; sprintf(buf_2, "%02i/%02i/%04i", date_day, date_month, date_year); sprintf(buf, "%02d:%02d:%02d", hh, mm, ss); tft.setCursor(time_cursor_x, time_cursor_y); tft.fillRect(time_cursor_x, time_cursor_y, 50 * text_size, 7 * text_size , BLACK); tft.print(buf); tft.setCursor(time_cursor_x, time_cursor_y + 8 * text_size); tft.fillRect(time_cursor_x, time_cursor_y + 8 * text_size, 60 * text_size, 7 * text_size , BLACK); tft.print(buf_2); Serial.println("tijd weergegeven"); old_time_val = time_val; } } int month_string_to_int(String date_month_string) { if (date_month_string == "Jan")return 1; if (date_month_string == "Feb")return 2; if (date_month_string == "Mar") return 3; if (date_month_string == "Apr") return 4; if (date_month_string == "May") return 5; if (date_month_string == "Jun") return 6; if (date_month_string == "Jul") return 7; if (date_month_string == "Aug") return 8; if (date_month_string == "Sep") return 9; if (date_month_string == "Oct") return 10; if (date_month_string == "Nov") return 11; if (date_month_string == "Dec") return 12; }