DS3231 не срабатывает будильник
- Войдите на сайт для отправки комментариев
Добрый день! Никак не могу разобраться с будильником на данной микросхеме. Никак не хочет подниматься флаг. Выставляю 0x0D в 0x80, минуты и секунды. По идее не смотря на день должен при совпадении часов и минут подняться флаг A2F. Но этого почему то не происходит. Какие типовые ошибки? Код я весь вываливать не хочу, скажу лишь что немного дописал библиотеку отсюда http://lesson.iarduino.ru/page/podklyuchenie-rtc-chasy-realnogo-vremeni-...
А именно добавил свои переменные и несколько функций
//установка будильника void RTC::setalarm(int RTC_hours, int RTC_minutes){ RTC_func_WRITE_ALARM(RTC_hours,RTC_minutes); RTC_func_READ_ALARM(); } void RTC::getalarm(){ RTC_func_READ_ALARM(); } void RTC::RTC_func_READ_ALARM(){ alarm_h=RTC_func_READ_REG(0x0C);//часы alarm_m=RTC_func_READ_REG(0x0B);//минуты alarmflag=RTC_func_READ_REG(0x0F);//читаем регистр состояния alarm_d=RTC_func_READ_REG(0x0D);//читаем регистр даты } void RTC::RTC_func_WRITE_ALARM(int RTC_hours, int RTC_mintues){ if(RTC_hours<=24 && RTC_hours>=0){ RTC_func_WRITE_REG(0x0C,RTC_hours); } if(RTC_mintues<=60 && RTC_mintues>=0){ RTC_func_WRITE_REG(0x0B,RTC_mintues); } RTC_func_WRITE_REG(0x0D,0x80); //установка регистра даты }
И сам код скетча такой:
#include "RTC.h" RTC timeModule; void setup() { /* add setup code here */ timeModule.begin(RTC_DS3231); Serial.begin(9600); timeModule.setalarm(15,6); } void loop() { timeModule.gettime(); timeModule.getalarm(); Serial.print("Time: "); Serial.print(timeModule.gettime("H:i:s")); Serial.print(" Alarm: "); Serial.print(timeModule.alarm_h); Serial.print(":"); Serial.print(timeModule.alarm_m); Serial.print(":"); Serial.println(timeModule.alarm_s); Serial.print("Flag="); Serial.println(timeModule.alarmflag,BIN); Serial.print("Day:"); Serial.println(timeModule.alarm_d,BIN); delay(100); }
В результате флаг нифига не поднимается(:
Time: 15:05:59 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:00 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:00 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:00 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:00 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:00 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:00 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:00 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:00 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:01 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:01 Alarm: 15:6:0
Flag=1000
Day:10000000
Time: 15:06:01 Alarm: 15:6:0
Flag=1000
Day:10000000
Что это такое? А, ну да, ноль в конце таймера просто пробовал и с 1 и со вторым таймером, результат одинаков, alarm_s 0 по умолчанию.
Отвечу сам себе. Забыл про BCD. Всем спасибо.
Здравствуйте. Даже зарегистрировался, чтобы написать Вам:) Выложите, пожалуйста, сюда и подкорректированную библиотеку и скетч. Очень актуально.
И вопрос: А нельзя ли считать показания часов и при совпадении с заданным значением, подать питание на реле освещения? Имеется в виду без использования SQW.
UPDATE. Отвечу сам на свой вопрос: Можно при помощи:
Он нужен, чтобы разбудить спящую ардуину, чтобы та запустила код и включила реле.))))
я использую "остановку" иногда, но такого даже я не делаю... поразило кол-во знаков.
я использую "остановку" иногда, но такого даже я не делаю... поразило кол-во знаков.
Недавно начал программировать. Поэтому такие печальные скетчи. Сейчас занялся "многозадачностью". Тот кусок скетча лучше заменить на:
Простенько, час*60+минуты
Заметил две ошибки в своём последнем скетче. А именно if(8 <= time.Hours <= 22) не выключала в 22:00 светодиод. Исправил на if(8 <= time.Hours && time.Hours <= 21). Вот правильный вариант:
Простенько, час*60+минуты
Если вас не затруднит, можете дать ответ скетчем?
Простенько, час*60+минуты
Если вас не затруднит, можете дать ответ скетчем?
Так а в чем трудность? Bwn вполне разумно предложил не париться и все перевести в минуты (перевод величин изучают в четвертом классе общеобразовательной школы)
Я тут почти закончил проект программировать, и хочу написать о своих мыслях.
Во первых, выбранная бибилиотека, для работы с DS3231 не совсем подходит. Пришлось дописать несколько функций. В самом модуле есть 2 аппаратных будульника, которые могут по установке флагов дергать вывод, и тем самым, в определенные моменты будить дуину. Мне это было нафиг не надо, но вот сами будильники я испоьзовал.
Во вторых, самое главное, в моем случае, что я уже не стал переписывать это работе с переводом из BCD и обратно. В моем случае(динамическая индикация на 4 разряда) было бы куда выгоднее использовать сразу значения в BCD и получать значения простым смещением, чем выделать разряды для индикации делением на цело и остатком.
В третьих, в случае комментатора выше можно прописать очень экономичный код если первым будильником будут дуину и включать реле, а вторым будут и отключать. Что бы при исчезновении питания не получалось неправильное состояние перед входом в loop нужно написать провверку текущего времени и в соответсвии с этив включать или выключать реле. и засыпать до следующего пробуждения.
Дописанную библиотеку выкладывать не буду, потому что это порнография с точки зрения ее автора. Я думаю, если много кода уже не написано под эту либу, лучше взяь другую.