таймер
- Войдите на сайт для отправки комментариев
Вс, 03/05/2015 - 06:23
#include <Wire.h> #include "RTClib.h" RTC_DS1307 _RTC1; // GND - земля VCC - +5B SDA - A-4 SCL- A-5 DateTime _tRTC1; bool _RTCAlO1 = 0; bool _trgrt1 = 0; bool _trgrt1I = 0; bool _tim1I = 0; bool _tim1O = 0; unsigned long _tim1P = 0UL; void setup() { Wire.begin(); _RTC1.begin(); pinMode(13, OUTPUT); } void loop() {_tRTC1 = _RTC1.now(); if (1) { _RTCAlO1 = ((_tRTC1.hour()) == 10) && ((_tRTC1.minute()) == 43) || ((_tRTC1.hour()) == 10) && ((_tRTC1.minute()) == 44) || ((_tRTC1.hour()) == 10) && ((_tRTC1.minute()) == 45) || ((_tRTC1.hour()) == 10) && ((_tRTC1.minute()) == 46) || ((_tRTC1.hour()) == 10) && ((_tRTC1.minute()) == 47);} else {_RTCAlO1 = 0;} if (_RTCAlO1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; if(_trgrt1) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 8000)) _tim1O = 0;}}} digitalWrite(13, _tim1O); } bool _isTimer(unsigned long startTime, unsigned long period ) {unsigned long currentTime;currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} }
не могу разобраться с таймером в 10:43 и в 10:44 светодиод 13 светился а в 10:45 10:46 и 10:47 не работает.
Что-то знакомое, как-то удивительно что не только одно условие срабатывает.
вообще тут надо понимать что вы его усложнили.
К примеру если 10 часов 46 минут в раскладе должно было
_RTCAlO1 = 1*0+1*0+1*0+1*0+1*1+1*0 вроде как должна быть 1 когда умножение выполняется первым (в логике такова понятия нет), но если считать последоватьно не обращая на првило матиматики то будет 0.
Сейчас расписанно _RTCAlO1 = 1*(0+0+0+1+0).
не могу разобраться с таймером в 10:43 и в 10:44 светодиод 13 светился а в 10:45 10:46 и 10:47 не работает.
Попробуйте вот так:
мне нужно что бы он в заданное время подавал сигнал на 2 сек
например в 14:30 в 14:35 в 15:30 16:45 17:30
не работает
Вот так чтобы было, не вижу чтобы на 2 секунды светодиод но D13 светил.
Так будет светить на 14:30 и 14:35
а как мне еще несколько точек веремени прописать
Это уже вопрос серьёзный. Сейчас подумал, что лучше и проще светодиод зажигать вот таким образом, брать секунды с 1307. По скетчу, диод будет светить в 14:30, 2 секунды.
здесь же попроше будет прописать несколько точек
Только я там ошибся, он будет 3 секунды светить, а не 2, нужно подправить 30 строчку:
if(((_tRTC1.second()))<=(1))
Да это я подправлю. Спасибо вам !
сделал вот так
second() >= 0 это прикольно.
Море bool переменных тоже забавно. Достаточно двух, одна - срабатывание по времени (любое условие) и то это может быть и не переменной. Вторая переменная - что сработало условие и нужно от момента срабатывания считать n секунд. Те тупой автомат, который срабатывает при условии и переходит в режим обратного отсчёта.
Для читабельности и простоты, вынесите все сравнения в отдельную функцию, будет меньше мусора.
я хотел так сделать не получилось
например в 14:30 в 14:35 в 15:30 16:45 17:30
Тут нужно понимать что для запуска таймера необходимо два условия, где роль играют три переменные
_RTCAlO1 = 0;
bool _trgrt1 = 0; bool _trgrt1I = 0;Когда _RTCAlO1 = 1 запускается
if
(_RTCAlO1) {
if
(_trgrt1I) { _trgrt1 = 0;}
else
{_trgrt1 = 1; _trgrt1I = 1;} }
else
{_trgrt1 = 0; _trgrt1I = 0;}; и действует один такт в программе сброс таймера производится если
_RTCAlO1 = 0Тут оптимально воспользоватся обманкой задать условия которые вам нужны если условие выполняется задать _RTCAlO1 = 1 если ни одно условие не выполняется тогда _RTCAlO1 = 0 при этом не использовать иначе (else) для этого подходит команда goto
Правда тут может появится другая проблема нельзя будет использовать минуты подрят, тоесть 14:44 14:45
если очень будет нужно можно будет сделать фокус опрашивать 13 пин и по его состоянию сбрасывать.
if (!digitalRead(13)) {_RTCAlO1 = 0;}
у меня почему то релюшку та прога не запускает
почему она не работает ?
Замучился смотреть на всё это, вы изначально взяли код который работал один раз в тысячу лет, где устанавливался год месяц день час минута и секунда отдельно включался независимый таймер.
В общем под ваши хотелки написал заново где добавил для выбора дополнительно контакты, если нужен будет только один контакт убирате int contato[] и снимаете с ифа.
Код не проверял, поскольку не оплачиваемо и лень собирать.