DS1302 + arduino
- Войдите на сайт для отправки комментариев
Ср, 23/04/2014 - 15:30
Избитая наверное тема, но все же.
Получаем вывод с часов, отправляем в "консоль".. И получаем следующее:
Нечетные секунды - нормальное время, четные секунды - нули.
Сам писал с выводом в консоль и такого не наблюдал - значит у вас программа не правильно написана.
#include <DS1302.h> int DS1302_RST = 2; int DS1302_IO = 3; int DS1302_SCLK = 4; DS1302 rtc(DS1302_RST, DS1302_IO, DS1302_SCLK); void setup() { rtc.halt(false); rtc.writeProtect(false); /* rtc.setDOW(SUNDAY); // Установка дня недели на ВТОРНИК rtc.setTime(16, 46, 0); // Установка времени 22:59:00 rtc.setDate(23, 4, 2014); // Установка даты 24 апреля 2012 //*/ Serial.begin(9600); Serial.println("reset"); } void loop() { Serial.println(rtc.getTimeStr()); }такая вот сейчас залита.
У меня такой глюк был, я долго не мог разобраться что за ерунда. Убрал +5в от модуля все заработало нормально, но где-то читал сто землю модуля и ардуинки надо соединить через резистор 10к.
да да через резистор и все работает!!!
Народ, я вот разбираюсь с подобным модулем, но чет ни как не могу понять как можно настраивать время кнопками, может кто код накидает, я адаптирую, или ткнет где это можно посмотреть. буду очень благодарен.
Собираю домашнюю "метеостанцию" с модулем DS1302 на борту, датчиком давления BM180, термометром DS18B20, ну и все это отображается на дисплее 1602 с подсветкой. А сердцем всего этого везобразия будет Arduino NANO. отчет о проделанной работе с кодами обещаю, как только добъюсь рабочего варианта.
История стара как пыль :) Зачем мучатся?) Вот
#include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour) // 0-99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.endTransmission(); } void getDateDs1307(byte *second, byte *minute, byte *hour) { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 3); *second = bcdToDec(Wire.read()); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read()); } void setup() { byte second, minute, hour; Wire.begin(); Serial.begin(9600); second = 45; minute = 3; hour = 7; setDateDs1307(second, minute, hour); } void loop() { byte second, minute, hour; getDateDs1307(&second, &minute, &hour); Serial.print(hour, DEC); Serial.print(":"); Serial.print(minute, DEC); Serial.print(":"); Serial.println(second, DEC); delay(1000); }используй это. Я столько голову ломал с этими часами ****, нашел этот код и библа не пригодилась) Все проблемы решил сразу :) Нашел код тут --->>
>http://arduino.ru/forum/programmirovanie/perevod-ds1307-biblioteki-v-v10
З.Ы. Вот часть кода, думаю тебе пригодится :) А если хочешь корректно отображать в порте то запили под порт и все)
void loop() { byte second, minute, hour; // индикация часов на LCD getDateDs1307(&second, &minute, &hour); lcd.setCursor(0, 0); if (hour < 10) { lcd.print ("0"); lcd.print (hour); } else { lcd.print (hour); } lcd.print(":"); if (minute < 10) { lcd.print ("0"); lcd.print (minute); } else { lcd.print (minute); } lcd.print(":"); if (second < 10) { lcd.print ("0"); lcd.print (second); } else { lcd.print (second); } }