DS3231 Arduino IDE1.0
- Войдите на сайт для отправки комментариев
Сб, 25/01/2014 - 21:48
Добрый вечер. У меня такой вопрос. Получил я модуль часов на микросхеме 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; // запомнили когда мы "отчитались" } }
Прошу прощения, а как часы к плате подключались? А то у меня из 6 - 2 разъема не задействованы и непонятно, надо ли дополнительно сопротивления вешать подтягивающие.
А кто вам мешает установить нужное время для отладки?
Вообще у вас какая-то слишком мудреная процедура вывода - возможно ошибка кроется там. Могу для примера дать библиотеку для DS1307 с классом DateTime - в который я добавил функцию форматирования времени, которая работает
http://yadi.sk/d/M8Wa1HMyLSLQJ
Испульзуется так:
Функция меняет буквы на цифры - проверок минимум поэтому может глючить, результат будет такой:
00:40:59 30-03-2014
Пардон за некро, но в друг пригодится кому то.
таже фигня была
посмотрел на тестовой проге тоже криво выводит в обычном виде
а по запросу
lcd.print(Clock.getHour(h12, PM), DEC);
выводит нормально
Ошибка в библиотеке. Исправлена 3 года назад. Читать у автора библиотеки http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html?showComment=1...
что-то не пойму. скачал
http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html?showComment=1337603109648#c7780580331778742164
пробую примеры. не идет. ругается, что функции не объявлены в классе.
что в arduino ide тип byte не поддерживается?
менять на int?
а что мешает найти нормальную библиотеку через IDE manage libraries?
а что мешает найти нормальную библиотеку через IDE manage libraries?
сейчас погуглю что это . не сталкивался. спасибо.
понял причину ide 1.5.0.
скачал последнюю версию. установил, поставил библиотеку. посмотрел экземплы. все открывает, компилирует.
Захотел посмотреть Sodaq_DS3231.h внутри... и не нашел его в папке библиотек.
проверил еще раз примеры видит, компилирует.
Подскажите куда ее мог положить IDE manage libraries? сейчас сам хохотать уже начну...
Ура нашел не там где ожидал. Он положил ее мою папку пользователей виндовс.