DS1302 + arduino

TODD
Offline
Зарегистрирован: 21.04.2014

Избитая наверное тема, но все же.

Получаем вывод с часов, отправляем в "консоль".. И получаем следующее:

Нечетные секунды - нормальное время, четные секунды - нули.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Сам писал с выводом в консоль и такого не наблюдал - значит у вас программа не правильно написана.

TODD
Offline
Зарегистрирован: 21.04.2014
#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());
}

такая вот сейчас залита.

Nike_com
Offline
Зарегистрирован: 20.02.2015

У меня такой глюк был, я долго не мог разобраться что за ерунда. Убрал +5в от модуля все заработало нормально, но где-то читал сто землю модуля и ардуинки надо соединить через резистор 10к.

Sonic-x
Offline
Зарегистрирован: 21.02.2015

да да через резистор и все работает!!!

Nike_com
Offline
Зарегистрирован: 20.02.2015

Народ, я вот разбираюсь с подобным модулем, но чет ни как не могу понять как можно настраивать время кнопками, может кто код накидает, я адаптирую, или ткнет где это можно посмотреть. буду очень благодарен.

Собираю домашнюю "метеостанцию" с модулем DS1302 на борту, датчиком давления BM180, термометром DS18B20, ну и все это отображается на дисплее 1602 с подсветкой. А сердцем всего этого везобразия будет Arduino NANO. отчет о проделанной работе с кодами обещаю, как только добъюсь рабочего варианта.

Marlen S
Offline
Зарегистрирован: 13.01.2015

История стара как пыль :) Зачем мучатся?) Вот 

#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);
  }
}