Ардуино Часы
- Войдите на сайт для отправки комментариев
Ср, 06/04/2016 - 18:45
Схема:

Код:
/*******************************************
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 -- для дисплея
Скачать код:
Фотки:


Ну, чёт нестрого! А где запрос времени из интернета или с радио? Где функции будильника и таймера? Не-е-е, я так не играю :(
А если серьёзно, то они у Вас показывают время с точностью +/- секунда, т.к. Вы обновляете их раз в секунду когда попало. Правильнее было бы установить прервание на каждую минуту. Тогда они (RTC) точно в момент перехода минуты кладут в LOW пин SQW (так-то он HIGH всё время, при настроенном прерывании). Пин SQW надо соединить с пином ардуины на который можно назначить attachInterrupt по FALLING и в этом прерывании как раз и обновлять показания часов.
Сразу две выгоды: 1) часы обновляются точно на границе минуты и 2) Вы это делаете (обновляете) в шестьдесят раз реже, чем при Вашем подходе, т.е. больше ресурсов процессора остаётся для других дел.
Добавление: виноват, только сейчас заметил, что Вы и секунды показываете. Ну, тогда всё тоже самое, только часы настроить, чтобы они выдавали прерывание на SQW при переходе секунды. А то сейчас Вы обновляете когда придётся.
Евген ты перегибеаешь палку, у меня на TFT Adafrut часы, так и там я просто в начале цикла обновляю структуру с РТЦ, а потом просто делаю проверку if(t.min_old != t.min){выводим новое время} и всё работает без нареканий, тут так и подавно никаких отклонений не будет. это как надо извращаться с контроллером чтоб он не успел хотяб за 0,2 сек (меньше глазом и не заметишь) итерацию пройти ? ))
2 на кой часами прерывания ммудрить? это как раз совсем не "срочная" задача
НУ понятно что у него совсем по деревянному сделано в лоб )) взял контроллер за 300р превратил в беспантовые часы ))