помогите с программой

shakhatov
Offline
Зарегистрирован: 24.12.2014

Помогите написать программу для автоматического школьного звонка. Имеется плата arduino nano и часы реального времени на ds1307. Нужно чтобы в определенное время включал реле на 2 сек.

vov4ik
Offline
Зарегистрирован: 10.09.2013
#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.year()) == 2016) && ((_tRTC1.month()) == 3) && ((_tRTC1.day()) == 1) && ((_tRTC1.hour()) == 15) && ((_tRTC1.minute()) == 10) && ((_tRTC1.second()) == 20));}
    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, 2000)) _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));}
  }

в 2016 году первого марта в 15 часов 10 минут 20 секунд светодиод на на 13 пине загорится на 2 секунды

shakhatov
Offline
Зарегистрирован: 24.12.2014

как сделать чтобы светодиод загорался например в 18:50, 18:55, 19:00, 20:00 и т.д.

#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()) == 18) && ((_tRTC1.minute()) == 50) && ((_tRTC1.second()) == 40));}
    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));}
  }

 

vov4ik
Offline
Зарегистрирован: 10.09.2013
Всеголиш немного переписав код убрать год, месяц , час секунды оставив минуты
((_tRTC1.minute()) == 0)
а потом какая именно вас минута интересует 
((_tRTC1.minute()) == 0) || ((_tRTC1.minute()) == 5) || ((_tRTC1.minute()) == 10)
shakhatov
Offline
Зарегистрирован: 24.12.2014

Это я понял а как сделать несколько времен когда включается светодиод

shakhatov
Offline
Зарегистрирован: 24.12.2014
#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()) == 18) && ((_tRTC1.minute()) == 50) && ((_tRTC1.second()) == 40)) || 
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50);}

    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));}
  }

сделал вот так. Правильно?

shakhatov
Offline
Зарегистрирован: 24.12.2014
#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()) == 11) && ((_tRTC1.minute()) == 02) || 
((_tRTC1.hour()) == 11) && ((_tRTC1.minute()) == 03) ||
((_tRTC1.hour()) == 11) && ((_tRTC1.minute()) == 04) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50) ||
((_tRTC1.hour()) == 18) && ((_tRTC1.minute()) == 50));}

    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));}
  }

в 11:02 и 11:03 светодиод светился а потом нет