воскресенье, 5 июня 2016 г.

Начинаем работать с часами реального времени


С одной стороны вроде как все и не так сложно. Но с другой есть один момент (такая маленькая хитрость, к которой мы еще вернемся) который нужно будет  учесть при установки точной даты и времени. Это придеться сделать пока в ручную, после чего сразу же закомментировать пару строчек в скетче….

Начнем пожалуй с подключения ЧРВ (часы реального времени) к ардуино. Это как раз несложно. У меня оказался модуль DS1302 и вот как нужно будет подключить выводы:  GND-GND, VCC-+5V, RST-10, CLK-13, DAT-12. При этом указанные пины (10,12,13) в скетче можно всегда заменить на другие.  Итак, модуль ЧРВ мы подключили…

Теперь шаг второй – это скетч. Скетч простой, и первым делом нужно будет в нем вручную изменить (поставить или снять //) в зависимости от модуля чипа. Выбирайте тот модуль который у вас и закомментируйте строчку с ненужным модулем, и раскоментируйте с вашим. Для информации: я использую модуль DS1302.

А вот теперь нам нужно установить точное время. Для начала обратим внимание (это важно!) на следующие две строки в программном коде:
  time.settime(35,10,20);// 35 сек, 10 мин, 20 час, дату оставить без изменений
  time.settime(-1,-1,-1,31,12,15);    // 31, декабря, 2015 года, время и день недели оставить без изменений}

Вот здесь и нужно сначала установить точную дату и время. Причем сделать это нужно заранее перед самой компиляцией. Так же обратите что компиляция и запись скетча в МК тоже займет некоторое время что тоже желательно учесть. Скажем у меня это занимает порядка 20 секунд. Все что мне нужно сделать : синхронизировать время на компьютере, установить время и за 20 секунд  начать компиляцию. После компиляции обязательно (не забудьте это важно!) закомментируйте эти две строчки. Вот и все. Можете пользоваться. Да и еще чуть не забыл: библиотеку RTC.h можно загрузить с Яндекс диска. 

#include <RTC.h>
RTC    time;
void setup() {
    delay(300);
    Serial.begin(9600);
//    инициализация модуля RTC
    // time.begin(RTC_DS3231);// на базе чипа DS3231модуль подключается к аппаратным выводам I2C
  //  time.begin(RTC_DS1307);// на базе чипа DS1307модуль подключается к аппаратным выводам I2C
    time.begin(RTC_DS1302,10,13,12);    // на базе чипа DS1302, вывод RST, вывод CLK, вывод DATдоступны любые выводы
//    запись даты и времени
// time.settime(0,51,21,27,10,15,2);    // 0  сек, 17 мин, 15 час, 1, октября, 2015 года, четверг
  time.settime(35,10,20);// 35 сек, 10 мин, 20 час, дату оставить без изменений
  time.settime(-1,-1,-1,31,12,15);    // 31, декабря, 2015 года, время и день недели оставить без изменений
}
void loop(){
    if(millis()%1000==0){ // если прошла 1 секунда
      Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
      delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    }

1 комментарий:

  1. Здравствуйте, Алексей. Это хорошо что вы поставили часы, потому что теперь на них можно теперь сделать различные задержки для всего чего угодно: обновление экрана, опрос кнопок (например через 10мс выполнять опрос кнопок). Вообще лучше сделать таймерную службу: то есть в главном цикле вы не выполняете никаких действий, только расставляете условия через сколько времени например обновить экран, считать показания с датчика, опросить клавиатуру. Все эти действия выполняете функциями, которые будут вызываться из void loop() по условиям времени. Допустим, прошло 10мс - опросили кнопку, прошло еще 10мс (в сумме 20мс), опросили кнопку и опросили датчик итп...прошло 200мс - опросили кнопку, датчик и обновили показания на экране.

    ОтветитьУдалить