Здравствуйте. Хочу добавить часы реального времени. Прочитал, что можно использовать микросхему DS1307+. Нашёл её распиновку, но "+" для подключения батарейки есть (V Bat), а минуса нет... Получается, GND (земля или минус), будет общим контактом, как для GND с платы Arduino, так и для минуса батарейки?
Datasheet http://datasheets.maximintegrated.com/en/ds/DS1307.pdf По-моему проще купить китайскую платку на DS3231
Подключил микросхему таким образом: И написал код: Код (C++): #include <Wire.h> // #include "DS1307.h" // DS1307 clock;//define a object of DS1307 class // char c, l, t; // String timeData; // boolean needSet, click; // byte hour, minute, // second, day, month, halfYear; // int year; char getInt( // String buf, int startIndex) { // return int(buf[startIndex] - '0') * 10 + int(buf[startIndex + 1]) - '0'; } void setup() { // pinMode(12, INPUT); // pinMode(13, INPUT); // Serial.begin(9600); // click = false; // Serial.println("Need set time?"); // while (!click) { // click = digitalRead(13); // if (click) needSet = true; else click = digitalRead(12); } // timeData = ""; // Serial.println(needSet); // if (needSet) { // Serial.println("Input hh:mm:ss dd/mm/yyyy:"); // clock.begin(); // l = 0; // while (l < 19) { // while (Serial.available() > 0) { // c = Serial.read(); // if (c != '\n') // timeData += c; // l++; } } // Serial.println(timeData); // hour = getInt(timeData, 0); // minute = getInt(timeData, 3); // second = getInt(timeData, 6); // day = getInt(timeData, 9); // month = getInt(timeData, 12); // halfYear = getInt(timeData, 15); // year = halfYear * 100; // halfYear = getInt(timeData, 17); // year += halfYear; // clock.fillByHMS(hour, minute, second); // clock.fillByYMD(year, month, day); //clock.fillDayOfWeek(SAT); //Saturday // clock.setTime();//write time to the RTC chip } } void loop() { // clock.getTime(); // t = clock.second; // if (t != l) printTime(); } /*Function: Display time on the serial monitor*/ void printTime() { // l = t; // Serial.print(clock.hour, DEC); // Serial.print(":"); // Serial.print(clock.minute, DEC); // Serial.print(":"); // Serial.print(clock.second, DEC); // Serial.print(" "); // Serial.print(clock.dayOfMonth, DEC); // Serial.print("/"); // Serial.print(clock.month, DEC); // Serial.print("/"); // Serial.print(clock.year + 2000, DEC); // Serial.println(" "); } Так же, добавил две кнопки на 12-ый и 13-ый цифровые пины. Далее открываю монитор порта, нажимаю кнопку, связанную 13-ым пином, устанавливаю дату (21:30:56 12/07/2016), часы вроде работают. Потом закрываю монитор, и открываю его опять, нажимаю кнопку, связанную 12-ым пином, чтобы пропустить установку, и ничего Подскажите, в чём я ошибся?
Эх: Код (C++): // if (needSet) { // Serial.println("Input hh:mm:ss dd/mm/yyyy:"); // clock.begin(); а для счастья надо: Код (C++): // clock.begin(); // if (needSet) { // Serial.println("Input hh:mm:ss dd/mm/yyyy:");
Код исправил, но часики медленно тикают... Они без кварца так работают? Спойлер: Код Код (C++): #include <Wire.h> // #include "DS1307.h" // DS1307 clock;//define a object of DS1307 class // char c, l, t; // String timeData; // boolean needSet, click; // byte hour, minute, // second, day, month, halfYear; // int year; char getInt( // String buf, int startIndex) { // return int(buf[startIndex] - '0') * 10 + int(buf[startIndex + 1]) - '0'; } void setup() { // pinMode(12, INPUT); // pinMode(13, INPUT); // Serial.begin(9600); // click = false; // Serial.println("Need set time?"); // while (!click) { // click = digitalRead(13); // if (click) needSet = true; else click = digitalRead(12); } // timeData = ""; // Serial.println(needSet); // clock.begin(); // if (needSet) { // Serial.println("Input hh:mm:ss dd/mm/yyyy:"); // l = 0; // while (l < 19) { // while (Serial.available() > 0) { // c = Serial.read(); // if (c != '\n') // timeData += c; // l++; } } // Serial.println(timeData); // hour = getInt(timeData, 0); // minute = getInt(timeData, 3); // second = getInt(timeData, 6); // day = getInt(timeData, 9); // month = getInt(timeData, 12); // halfYear = getInt(timeData, 15); // year = halfYear * 100; // halfYear = getInt(timeData, 17); // year += halfYear; // clock.fillByHMS(hour, minute, second); // clock.fillByYMD(year, month, day); //clock.fillDayOfWeek(SAT); //Saturday // clock.setTime();//write time to the RTC chip } // l = 100; } void loop() { // clock.getTime(); // t = clock.second; // if (t != l) printTime(); } /*Function: Display time on the serial monitor*/ void printTime() { // l = t; // Serial.print(clock.hour, DEC); // Serial.print(":"); // Serial.print(clock.minute, DEC); // Serial.print(":"); // Serial.print(clock.second, DEC); // Serial.print(" "); // Serial.print(clock.dayOfMonth, DEC); // Serial.print("/"); // Serial.print(clock.month, DEC); // Serial.print("/"); // Serial.print(clock.year + 2000, DEC); // Serial.println(" "); }
Radius, а что им мешает работать без кварца? Насколько помню, в интегральных схемах (микроконтроллерах) есть свой кварц. Понятно, что импульсы будут с другой частоты, так как использовать только его не достаточно...
Вы посмотрите DataSheet на эту микросхему (DS1307), там однозначно написано, что к выводам 1 и 2 должен быть подключен кварцевый резонатор с частотой 32,768 кГц и нагрузочной емкостью 12,5 пФ, либо на вывод 1 нужно подать внешнюю частоту 32,768 кГц.Только в этом случае часы будут работать правильно.