пятница, 16 мая 2014 г.

Arduino. DS3231 - высокоточные часы реального времени

Иду дальше по плану. Высокоточные часы. Тут все было предельно просто - на странице интернет-магазина сразу имелась ссылка на библиотеки. Распаковал, установил файлы из папки DS3231_TEST, запустил скетч из примера... Замечательный девайс! Показывает время и температуру. А наличие батарейки позволяет таймеру работать и без подключения к компьютеру.

Вот упрощенный текст скетча
#include DS3231.h
#include Wire.h

DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte year, month, date, DoW, hour, minute, second;

void setup() {
// Start the I2C interface
Wire.begin();
Clock.setSecond(50);//Set the second
Clock.setMinute(59);//Set the minute
Clock.setHour(11); //Set the hour
Clock.setDoW(5); //Set the day of the week
Clock.setDate(31); //Set the date of the month
Clock.setMonth(5); //Set the month of the year
Clock.setYear(13); //Set the year (Last two digits of the year)
// Start the serial interface
Serial.begin(9600);
}

void loop() {
int second,minute,hour,date,month,year,temperature;
second=Clock.getSecond();
minute=Clock.getMinute();
hour=Clock.getHour(h12, PM);
date=Clock.getDate();
month=Clock.getMonth(Century);
year=Clock.getYear();
temperature=Clock.getTemperature();

Serial.print("20");
Serial.print(year,DEC);
Serial.print('-');
Serial.print(month,DEC);
Serial.print('-');
Serial.print(date,DEC);
Serial.print(' ');
Serial.print(hour,DEC);
Serial.print(':');
Serial.print(minute,DEC);
Serial.print(':');
Serial.print(second,DEC);
Serial.print('\n');
Serial.print("Temperature=");
Serial.print(temperature);
Serial.print('\n');
delay(1000);
}

И схема подключения. Аналогична схеме подключения LCD.

Следующий шаг - заставить работать два устройства I2C на одной паре проводов. Т.е. чтобы часы выводили данные на LCD, а не через виртуальный COM-порт в среду разработки. Как разберусь - напишу. ;)


14 комментариев:

  1. Как Вы считаете, чего туда память засунули?

    ОтветитьУдалить
    Ответы
    1. Просто место было, для работы часов внешняя память не нужна
      А часы зачёт, сам юзаю такие

      Удалить
  2. Как установить время на часах? Есть примеры скетчей?

    ОтветитьУдалить
    Ответы
    1. Функции Clock.set* позволяют устанавливать даты и время. Собственно, сам скетч можно посмотреть выше. :о)

      Удалить
    2. Как установить при старте есть много скетчей, а вот установка в процессе работы часов практически не представлена. Ну не писать же в микросхему данные после каждого нажатия на кнопочки?!

      Единственно представляется мне на время коррекции забыть об обновлении информации из микросхемы, установить часы как нужно, а потом все вместе записать в память.
      Нужно отслеживать нажатия, паузу между ними, да много чего, может даже в программе считать минуты с секундами, изредка поправляя показания из микросхемы...
      В общем вариантов масса, а готового скетча нема

      Удалить
  3. Спасибо! Наконец выставил время

    ОтветитьУдалить
  4. EEPROM на плате, как мне кажется, для записи в нее информации о термокалибровочной кривой DS3231. Типа таблицы из двух столбцов - температура и значение "Aging offset" из ячейки 0x10h памяти DS3231. Для "комнатных" применений, понятное дело, она не нужна, но если ваша Ардуинка решит прокатиться по морозу (до -40, если Даллас, т.е. Максим не врёт), то уже без таблички никак... 8-)

    ОтветитьУдалить
    Ответы
    1. У меня DS18B20 уже при -18 где-то тух и не отдавал ничего. :(

      Удалить
    2. Значит реализация 1-wire кривая, у этих датчиков времянки по шине очень сильно от температуры зависят. Но, на работе добивался их стабильной работы во всем заявленном диапазоне, -55 - 125, специально в климатической камере испытывали.

      Удалить
  5. кратко и доходчиво. Все получилось благодарю.

    ОтветитьУдалить
  6. "
    Следующий шаг - заставить работать два устройства I2C на одной паре проводов. Т.е. чтобы часы выводили данные на LCD, а не через виртуальный COM-порт в среду разработки.

    "
    Ответом на это предложение хочу сказать, что у модуля реального времени (в моем случае zs-042) есть 4 контакта I2C которые не имеют явных разъемов, но которые можно припаять. Схема подключения такова, от LCD I2C подключаются к I2C интерфейсу модуля часов, а от модуля часов от других контактов (которых 6 штук) к ардуине. Питание 5в на часах подключал и все нормально работало. И вся схема работает, на практике проверял.

    ОтветитьУдалить
    Ответы
    1. вот тут ссылка на картинку которая показывает то, что я описал. http://www.goodliffe.org.uk/arduino/pictures/i2c_devices.jpg

      Удалить
  7. Как посмотреть данные, которые были полученые через ds3231 ?

    ОтветитьУдалить
  8. Помогите пожалуйста, как сделать код, чтобы данные пересылаются в отдельный файл?

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