DS3231 Arduino IDE1.0

viva_viva2004
Offline
Зарегистрирован: 07.10.2013
Добрый вечер. У меня такой вопрос.
Получил я модуль часов на микросхеме DS3231.
Подключил модуль к Arduino Mega 2560 и подсоединил модуль 16*2 OLED display, все по интерфейсу I2C.
Среда разработки Arduino IDE 1.05.
Часики ходят, в монитор порта время выводится, на дисплей тоже.
Время до 15:59:59 показываеся правильно, а следующий отчет уже отображается как 10:00:00.
Когда время начинает идти правильно, я не знаю, так как все находится на рабочем месте.
Когда утром прихожу на работу, время показывается правильно.
Я так понимаю что дело в файле библиотеке, но не могу разобратся, что в ней не так (или все так?).
И еще, точность хода часов не соответствует заявленным характеристикам на микросхему DS3231.
Библиотеку часов взял отсюда: http://soiling-detector.googlecode.com/files/DS3231updated.zip
Извиняюсь, что ссылка так отображается, не пойму почему, но она рабочая.
Вот мой скетч:
#include "Wire.h"
#include "DS3231.h"
#include "OLedI2C.h"

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

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  LCD.init();
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW); // выключаем светодиод на выводе 13
}
 
void loop()
{
  printTimeToSerial(); // выводим полученное время в Serial
  printTimeToLCD(); // выводи время на экран
}
 
// Выводит текущие время в Serial
void printTimeToSerial()
{
  Clock.getTime(year, month, date, DoW, hour, minute, second);
  Clock.getTemperature();
  byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете
   
  if(second!=prevSecond) // что-то делаем только если секунды поменялись
 {
    Serial.print(hour); // часы
    Serial.print(":"); // разделитель
    Serial.print(minute); // минуты
    Serial.print(":"); // разделитель
    Serial.print(second); // секунды
    
    Serial.print("  Temp=");
    Serial.print(Clock.getTemperature(), 2); // выводим температуру
   
  if (Clock.oscillatorCheck())
     {  Serial.print("  O+"); }
        else { Serial.print("  O-"); }
    Serial.println();
    
    prevSecond=second; // запомнили когда мы "отчитались"
 }
}

// Выводит текущие время на OLED
void printTimeToLCD()
{
  byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе
     
  if(second!=prevSecond) // что-то делаем только если секунды поменялись
 {
  LCD.sendString (":",2,0);
  LCD.sendString (":",5,0);
  if(hour<10)
    {  LCD.sendString("0",0,0); // ноль, если нужен
       LCD.sendFloat (hour,1,0,1,0);  } // выводим один знак, смещаем  на один
       else {  LCD.sendFloat (hour,2,0,0,0);  }
  if(minute<10)
    {  LCD.sendString("0",3,0); // ноль, если нужен
       LCD.sendFloat (minute,1,0,4,0);  } // выводим один знак, смещаем  на один
       else {  LCD.sendFloat (minute,2,0,3,0);  }
  if(second<10)
    {  LCD.sendString("0",6,0); // ноль, если нужен 
       LCD.sendFloat (second,1,0,7,0);  } // выводим один знак, смещаем  на один
       else {  LCD.sendFloat (second,2,0,6,0);  }
  
  LCD.sendFloat (Clock.getTemperature(),5,2,11,0); //выводим температуру
  
  LCD.sendString ("/",2,1);
  LCD.sendString ("/",5,1);
  if(date<10)
    {  LCD.sendString("0",0,1); // ноль, если нужен
       LCD.sendFloat (date,1,0,1,1);  } // выводим один знак, смещаем  на один
       else {  LCD.sendFloat (date,2,0,0,1);  }
  if(month<10)
     {  LCD.sendString("0",3,1); // ноль, если нужен
        LCD.sendFloat (month,1,0,4,1);  } // выводим один знак, смещаем  на один
        else {   LCD.sendFloat (month,2,0,3,1);  }
  if (Century)
     {  LCD.sendString("21",6,1); // выводим 21--, что долго не понадобится
        LCD.sendFloat(year,2,0,8,1); }
        else {  LCD.sendString("20",6,1);  // выводим 20--
                LCD.sendFloat (year,2,0,8,1); }
  
  prevSecond=second; // запомнили когда мы "отчитались"
 } 
}

 

Nodit
Offline
Зарегистрирован: 15.01.2014

Прошу прощения, а как часы к плате подключались? А то у меня из 6 - 2 разъема не задействованы и непонятно, надо ли дополнительно сопротивления вешать подтягивающие.

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

А кто вам мешает установить нужное время для отладки?

Вообще у вас какая-то слишком мудреная процедура вывода - возможно ошибка кроется там. Могу для примера дать библиотеку для DS1307 с классом DateTime -  в который я добавил функцию форматирования времени, которая работает

http://yadi.sk/d/M8Wa1HMyLSLQJ

char* DateTime_format(char* ret){
		for(int i=0;i<strlen(ret)-1;i++){
		if(ret[i] == 'h'){
			ret[i] = '0'+hh/10;
			ret[i+1] = '0'+hh%10;
		}
		if(ret[i] == 'm'){
			ret[i] = '0'+mm/10;
			ret[i+1] = '0'+mm%10;
		}
		if(ret[i] == 's'){
			ret[i] = '0'+ss/10;
			ret[i+1] = '0'+ss%10;
		}
		if(ret[i] == 'D'){
			ret[i] = '0'+d/10;
			ret[i+1] = '0'+d%10;
		}
		if(ret[i] == 'M'){
			ret[i] = '0'+m/10;
			ret[i+1] = '0'+m%10;
		}
	    if(ret[i] == 'Y'&& ret[i+2] == 'Y'){
			ret[i] = '2';
			ret[i+1] = '0';
			ret[i+2] = '0'+yOff/10;
			ret[i+3] = '0'+yOff%10;
		}else
		if(ret[i] == 'Y'&& ret[i+1] == 'Y'){
			ret[i] = '0'+yOff/10;
			ret[i+1] = '0'+yOff%10;
		}

	}
	return ret;
}

Испульзуется так:

#define FORMAT "hh:mm:ss DD-MM-YYYY\0"
char buf[20];
uint8_t yOff, m, d, hh, mm, ss;
yOff = 14;
m = 3;
d = 30;
hh = 0;
mm = 40;
ss = 59;
strncpy(buf,FORMAT,20);
LCD.sendstring(DateTime_format(buf),0,0);

Функция меняет буквы на цифры - проверок минимум поэтому может глючить, результат будет такой:

00:40:59 30-03-2014

witamin
Offline
Зарегистрирован: 05.04.2013

Пардон за некро, но в друг пригодится кому то.

таже фигня была

посмотрел на тестовой проге тоже криво выводит в обычном виде 

а по запросу 

lcd.print(Clock.getHour(h12, PM), DEC);

выводит нормально 

andrey14
Offline
Зарегистрирован: 19.04.2015

Ошибка в библиотеке. Исправлена 3 года назад. Читать у автора библиотеки http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html?showComment=1...

MacSim
Offline
Зарегистрирован: 28.11.2012

что-то не пойму. скачал

http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html?showComment=1337603109648#c7780580331778742164

пробую примеры. не идет. ругается, что функции не объявлены в классе.

что в arduino ide тип byte не поддерживается?

менять на int?

 

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

а что мешает найти нормальную библиотеку через IDE  manage libraries?

MacSim
Offline
Зарегистрирован: 28.11.2012

Valera19701 пишет:

а что мешает найти нормальную библиотеку через IDE  manage libraries?

сейчас погуглю что это . не сталкивался. спасибо.

понял причину ide 1.5.0.

MacSim
Offline
Зарегистрирован: 28.11.2012

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

Захотел посмотреть Sodaq_DS3231.h внутри... и не нашел его в папке библиотек.

проверил еще раз примеры видит, компилирует.

Подскажите куда ее мог положить IDE  manage libraries? сейчас сам хохотать уже начну...

Ура нашел не там где ожидал. Он положил ее мою папку пользователей виндовс.