Официальный сайт компании Arduino по адресу arduino.cc
Таймер на DS1307
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Втр, 19/02/2013 - 12:58
Всем доброе время суток)) не могу понять почаму не отрабатывает таймер ?
#include <WProgram.h> #include <Wire.h> #include <DS1307.h> #define timePIN 13 void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { int Hour = RTC.get(DS1307_HR,true); int Minute = RTC.get(DS1307_MIN,true); int Second = RTC.get(DS1307_SEC,false); int FullMinutes = Hour * 60 + Minute; boolean Day = (FullMinutes >= 8 * 60 + 52 & FullMinutes <= 9 * 60 + 20); digitalWrite(timePIN, (Day) ? HIGH:LOW); delay(1000); Serial.print(Hour); Serial.print(":"); Serial.print(Minute); Serial.print(":"); Serial.println(Second); delay(1000); } void SetTime() { if (Serial.read() == 't') { int h = (Serial.read() - '0') * 10 + (Serial.read() - '0'); Serial.read(); int m = (Serial.read() - '0') * 10 + (Serial.read() - '0'); RTC.stop(); RTC.set(DS1307_SEC,0); RTC.set(DS1307_MIN,m); RTC.set(DS1307_HR,h); RTC.start(); } Serial.flush(); }
причем если в строке bolean время срабатывания на 2х значное число (например 14, 18,и т.д ) то работает хорошо. может кто поможет ?
Максим у вас этот код работает ? я к тому что у меня он так же не захотел работать
Я обычно пишу сложные выражения в скобках, поскольку это более читабельно и меньше шансов ошибиться с приоритетом выполнения операций. Например,
У меня это уже просто привычка.
boolean Day = (FullMinutes >= 10 * 60 + 52 & FullMinutes <= 19 * 60 + 20);
при такой постановки времени, таймер работает
Kisoft ни как код не хочет работать правельно (((
Вы почему то упорно пишите так:
хотя максим уже Вам подсказал, что нужно писать так:
& - это бинарная операция И
&& - это логическая операция И
"a && b" - на выходе false только если одно из чисел (или оба) равно нулю, а "a & b" - например 0x11 & 0x10 = 0x01, т.е. true
сори скопипастил и не заметил, пишу как Максим посоветовал и все те же камни (
Ок, тогда хотя бы что в Serial выводится?
Теоретически в Вашем скетче всё еорректно, однако библиотека RTC мне не знакома, поэтому, думаю, в этом и проблема.
Я посмотрел туториал здесь: http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit посмотрите, там отличий много, хотя, возможно, это другая либа.
UPD: Вполне возможно, что эта строка:
должна быть такой:
Serial monitor выводит часы:минуты:секунды правельные показания
насколько я понял в строчкe
int Minute = RTC.get(DS1307_MIN,true);
true перестает игнорировать значения Minute
В инете я видел именно то, что написал, первый вызов с true, остальные с false. Насколько я понял, true заставляет часы обновить внутренние данные, а false - читать зафиксированные данные
блин (( и все же если делать "врямя" однозначное число (9 или 5,6) то не срабатывает (( ну что за хрень то ?
А как проявляется это "не работает" ?
Присоединяюсь к вопросу. Плюс, первое, что приходит в голову, вывести в сериал кроме времени:
1. FullMinutes
2. Константы, с которыми сравниваете
3. Признак сравнения
И уже на этом материале смотреть, что именно не изменяется в нужное время.
Кроме того, если уж совсем непонятно, тупо сравнивать отдельно часы и минуты, без сбора их в FullMinutes, хотя это уже из области фантастики.
В общем дело не в том, что у вас таймер не срабатывает, а в том что когда вы проверяете работоспособность таймера вы устанавливаете время. Так? И вы вводите в сериал строку t7 59 или t7 4, так? Это не правильно, нужно вводить t07 59 или t07 04. Угадал?
убрал полностью установку времени (void SetTime()) вродебы заработал ))
опять грабли ))) не ставится время через сериал монитор, по поводу таймера мне подсказали что начало интервала должно быть меньше его конца
Так естественно начало должно быть меньше конца... вы же выше показали как числа подставляете.
Что бы больше не гадать почему не работает покажите именно код, который не работает, а не код, который работает с описанием изменений, с которыми не работает.
код который не работает
И прочитайте описание Serial.flush() - она не очищает фуфер.
Ожидает окончания передачи исходящих данных (до версии Arduino 1.0 функция очищала буфер последовательного соединения). -работаю arduino 0.22
может кто поможет уже рабочим кодом ?
Я так понимаю вы моей помощью не довольны, что ж, тогда разбирайтесь сами.
Зачем мне насильно вам втюхивать свою помощь.
И вы все по прежнему упорно используете эту масло-маслянную конструкцию не имея малейшего понятия как она работает:
Максим дело в том что я не программист и знаю выше пересказанное с примеров в интернете, не хотел вас задеть ...сори
к пину 10 ардуины подключена релюшака (реле рабочая, 1,5V) заггружаю, ваще опубликованный код, что бы пин 10 включался в 8:30 и выключался в 16:40 с выводом инфо о времени через сириал монитор, так вот в задоный промежуток времени (когда он должен включатся) на пине 10. 0V (т.е. ардуино не дает сигнал на пин 10) на сериал монитор время отправляется нормаьно
В общем, что я вам рекомендую сделать - скачать Arduino IDE 1.0 или выше, если ваша библиотека не заведется, то скачайте отсюда, затем залейте этот скейтч и подробно опишите что делаете и что происходит.
То есть залили, запустили сериал, каждую секунду должна появляться строка с FullMinutes и со временем, вводите в сериал-монитор строку t08:29, время должно измениться на 08:29:00 и ждете пока загорится светодиод на 13 выводе, загорелся, вводите в сериал-монитор строку t16:39 и ждете пока потухнет светодиод. Если не загорелся то выкладываете (копируете из сериал-монитора) сюда то что у вас в сериал-мониторе.
Максим спс! только работает наоборот ! в указанный диапозон свветодиод выключается (разобрался)
если позволите еще один вопрос ) а как сделать так чтобы считовалось состояние timePIN допусти если timePIN включен, то включался пин 9 к примеру
Можно поднять тему? ))
Элементарный вопрос: Как вытянуть сигнал с задержкой на 1сек один раз в минуту, но чтоб ровно. Потребность есть ( хотелось часы завести Стрела) Там реверсным 24 надо маятник кртутить, раз в минуту. Тема есть в гугле. Но мотелось бы без делай, там парень описывает что подбирать надо. А если например есть гтовый RTC модуль, может с него вытягивать сигнал раз в минуту, давать задержку на этот сигнал, потом на другой порт так же. И по очереди тикать одним то другим портом с секундной задержкой.
Возможно все просто, но с часами опять же- первый раз, делал конечно но там не требовалось точности.
если вроде ж модули задержки. тупо даешь сигнал а на модуле задержка 1с и все сразу за раз.
не понял, в смысле реле времени?
не понял, в смысле реле времени?
https://ru.aliexpress.com/item/NE555-Timer-Switch-Adjustable-Module-Time...
Да не, не то. Городить придётся много. Решил нано взять и 4канала реле. Вот и спросил как из библиотеки вытянуть по минутный сигнал. Задержку через милис то сделаю а вот независимо тикать поминутно, пока что сложновато.
Ребята, помогите с поминуткой, а?
пробую билиотеку iarduino_RTC.h
в ней все хорошо описанно но как вытягивать сигналы, не ясно. Время то есть, работает, но мне не важны часы года а только поминутный сигнал(((
Так понимаю что нужно создать old_min и new_min и сравнивать, как только new_min не равна old_min то digitalread xx/ вот это и будет четкий поминутный сигнал?
условие как-то так должно звучать
если б = 60 то б =1 (или 59мин и 0 минут)
считываем минуты
если a больше б, тогда включаем пин, ждем сколько надо, выключаем пин, б=a.
а можно так
считываем минуты
если a не равно б, тогда включаем пин, ждем сколько надо, выключаем пин, б=a.
не используйте левые библиотеки и все.
смотри нормальную библиотеку тайм от поляка там есть будильники.
ставишь минуту с остальными пустыми полями и вуаля будет тебе каждую миниму давать сигнал без всяких програмнных извращений
Ну это скетч который выше трудноват для моего понимания.
Да и как то скрутил как знал по-своему, как говорится на что мозгов хватило, вот:
проверил, тикает! вот только еще одна дилема вылезла, получаетсяя если неугадать полярность при включении - часы не будут ходить сразу а перещелкнут спустя одну минуту. Но это ерунда)))
17 строка, не слишком ли точно?
17 строка, не слишком ли точно?
if
(millis()%1000==0)
// если прошла 1 секунда
если чесно, я сам не понимаю эту строчку, взято из другого скетча (почему 1000%) а не 100...
Если знаете - подскажите подалуйста!
Ее можно использовать например в данном примере?
А с ней вот так:
Это верно?
Если знаете - подскажите подалуйста!
Оператор %
Это верно?
Это - в перлы!
Это верно?
Это - в перлы!
я правильно понимаю, это условие никогда не выполнится?
А Вы всерьез считаете, что остаток от деления на 100 может при каких то условиях быть равным 2000?
А Вы всерьез считаете, что остаток от деления на 100 может при каких то условиях быть равным 2000?
один раз в пятьдесят с лишним дней должно быть, когда там миллис обнуляется, и не учитываю начало условия (digitalRead(enter) == LOW), пина enter я не заметил среди определенных выше.
Про "обнуление миллис" ходят просто кошмарные слухи: оказывается, в момент обнуления сразу перестают выполняться ве арифметические операции, и отсаток от деления на 100 может стать равным 2000.
PS. Должен сообщить Вам крайне печальную новость: millis обновляется чаще, чем Вы думали.
PPS. Я тоже не заметил - там процитирована всего одна строка, так что ничего "выше" нет в принципе.
PS. Должен сообщить Вам крайне печальную новость: millis обновляется чаще, чем Вы думали.
PPS. Я тоже не заметил - там процитирована всего одна строка, так что ничего "выше" нет в принципе.
я и не думал ничего про миллис - просто процетировал http://arduino.ru/Reference/Millis, чаще, так чаще я так на долго его не использую, да и тут полно примеров защиты от его переполнения.
я и не думал ничего про миллис - просто процетировал http://arduino.ru/Reference/Millis
Вы не процитировали, Вы переврали.
Согласитесь, "приблизительно через 50 дней", "один раз в пятьдесят с лишним дней" и "примерно через 49,71027 дней" - это разные вещи.
Вы не процитировали, Вы переврали.
Согласитесь, "приблизительно через 50 дней", "один раз в пятьдесят с лишним дней" и "примерно через 49,71027 дней" - это разные вещи.
Да ладно придираться то, старый я ужо, память подводит и 50 плюс несколько(1,2,3,5) дней, не так и далеко от 50 - 1 (вернее минус где-то примерно 0,3)