Ардуино Часы

Гость

Схема:

схема

Код: 

       

/*******************************************
    Code by Egor Pyzhyk
    My GitHub: http://github.com/egor77711
    E-mail: terminator77711.work@gmail.com
    Site: http://egp.ucoz.com
 *******************************************/

/* Libraries:
             https://github.com/adafruit/Adafruit_SSD1306           -- for diaplay
             https://github.com/adafruit/Adafruit-GFX-Library       -- for diaplay
             http://www.rinkydinkelectronics.com/library.php?id=73  -- for RTC
*/

// SCHEME: http://i.imgur.com/KjdjGGa.png

//-----------DISPLAY------------------//
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 1
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16

//--------RTC---------//
#include <DS3231.h>
DS3231  rtc(SDA, SCL);

void setup()
{
  rtc.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  /*
    rtc.setDOW(WEDNESDAY);      // set Day-of-Week to SUNDAY
    rtc.setTime(17, 47, 0);     // set the time to 17:47:00 (24hr format)
    rtc.setDate(4, 6, 2016);    // set the date to April 4th, 2016
  */
}

void loop()
{
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(5, 5);
  display.println(rtc.getTimeStr()); // print time
  display.setTextSize(1);
  display.setCursor(0, 23);
  display.print(rtc.getDateStr()); // print date
  display.print(" ");
  display.print(rtc.getDOWStr()); // print day of week
  display.display();
  delay(1000);
}

Библтотеки:

                      https://github.com/adafruit/Adafruit_SSD1306           -- для дисплея

                      https://github.com/adafruit/Adafruit-GFX-Library       -- для дисплея

                      http://www.rinkydinkelectronics.com/library.php?id=73  -- для часов
 
Скачать код:

Фотки:

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, чёт нестрого! А где запрос времени из интернета или с радио? Где функции будильника и таймера? Не-е-е, я так не играю :(

А если серьёзно, то они у Вас показывают время с точностью +/- секунда, т.к. Вы обновляете их раз в секунду когда попало. Правильнее было бы установить прервание на каждую минуту. Тогда они (RTC) точно в момент перехода минуты кладут в LOW пин SQW (так-то он HIGH всё время, при настроенном прерывании). Пин SQW надо соединить с пином ардуины на который можно назначить attachInterrupt по FALLING и в этом прерывании как раз и обновлять показания часов.

Сразу две выгоды: 1) часы обновляются точно на границе минуты и 2) Вы это делаете (обновляете) в шестьдесят раз реже, чем при Вашем подходе, т.е. больше ресурсов процессора остаётся для других дел.

Добавление: виноват, только сейчас заметил, что Вы и секунды показываете. Ну, тогда всё тоже самое, только часы настроить, чтобы они выдавали прерывание на SQW при переходе секунды. А то сейчас Вы обновляете когда придётся.

 

releyshic
Offline
Зарегистрирован: 20.11.2015

Евген ты перегибеаешь палку, у меня на TFT  Adafrut часы, так и там я просто в начале цикла обновляю структуру с РТЦ, а потом просто делаю проверку if(t.min_old != t.min){выводим новое время} и всё работает без нареканий, тут так и подавно никаких отклонений не будет. это как надо извращаться с контроллером чтоб он не успел хотяб за 0,2 сек (меньше глазом и не заметишь) итерацию пройти ? ))

2 на кой часами прерывания ммудрить? это как раз совсем не "срочная" задача

НУ понятно что у него совсем по деревянному сделано в лоб )) взял контроллер за 300р превратил в беспантовые часы ))