How to make кес 1307 turn on relay every 2 hours

I have connected:

  • Arduino Nano
  • RTC 1307 (i2c)
  • AM2320 (i2c) humidity Temp sensor
  • RTC 1307
  • 4 relay modules

Now:
How to make relay turn on every 2 hours?

/*
 * On start-up the autoprobe feature is used to search the I2C bus to
 * find the first available real-time clock. The sketch indicates
 * which clock type (if any) has been found. If the clock is an
 * MCP7941x device the current calibration setting is printed.
 *
 * The clock can be set by writing the current unixtime (i.e., seconds
 * since 1970-01-01 00:00:00Z) prefixed by the character 'T' to
 * Serial. The string must be terminated by a NULL character, line
 * feed, or carriage return. E.g., "T1343779200" sets the clock to
 * 2012-08-01 00:00:00Z".
 *
 */

#include <Wire.h>
#include <RTCx.h>        // Библиотека часов реального времени 1307
#include <AM2320.h>      // Библиотека датчика AM2320 по шине i2c
AM2320 sensor;            // Обьявляем sensor

void setup(void)
{

   pinMode(6, OUTPUT);  // Пин реле увлажнителя
   pinMode(5, OUTPUT);  // Пин реле обогревателя
   pinMode(4, OUTPUT);  // Пин реле вентилятора
   pinMode(3, OUTPUT);  // Пин реле управляемого таймером- свет
   Serial.begin(9600);
   Wire.begin();
   sensor.begin();
   

  // Автопоиск устройства на шине i2c.
  if (rtc.autoprobe()) {
    // Кажется нашли часы на шине i2c.
    Serial.print("Нашли часы реального времени ");
    Serial.print(rtc.getDeviceName());
    Serial.print(" по адресу 0x");
    Serial.println(rtc.getAddress(), HEX);
    Serial.println("--------Начинаем работать");
  }
  else {
    // Если ничё не найдено на i2c так и напишем что не найдено.
    Serial.println("No RTCx found, невозможно работать с часами");
    while (1)
      ;
  }
  // Enable the battery backup. Ато случается на DS1307
  
  rtc.enableBatteryBackup();
 
  rtc.startClock(); // Убедимся что oscillator запущен

  rtc.setSQW(RTCx::freq4096Hz);
}


const uint8_t bufLen = 30;
char buffer[bufLen + 1] = {'\0'};
uint8_t bufPos = 0;
unsigned long last = 0;
void loop(void)
{

sensor.measure(); 
float h = sensor.getHumidity();  float t = sensor.getTemperature();

    
  
if (t>24) digitalWrite(5, HIGH);      // Включаем реле обогревателя / он находитя в NO

else digitalWrite(5, LOW);           // Выключаем реле обогревателя если температура достигнута

if (h>80) digitalWrite(6, HIGH);      // Включаем реле туманогенератора / он находитя в NO

else digitalWrite(6, LOW);           // Выключаем реле туманогенератора. Влажность достигнута


Serial.print("Температура:  °C  ");
    Serial.println(t);
    Serial.print("Влажность:     %  ");
    Serial.println(h);
   delay(1000);


  struct RTCx::tm tm;
  if (millis() - last > 2000) {
    last = millis();
    rtc.readClock(tm);
   Serial.print("Дата и время:    ");
    RTCx::printIsotime(Serial, tm).println();
//  RTCx::time_t t = RTCx::mktime(&tm);    // Закомментировал- не знаю для чего строка
    

//    Serial.print("unixtime = ");
//    Serial.println(t);
    Serial.println("--------=====----------------------");
     delay(3000);
  }

 
         }

Нашли часы реального времени DS1307 по адресу 0x68 --------Начинаем работать Температура: °C 24.50 Влажность: % 43.00 Температура: °C 24.50 Влажность: % 43.00 Дата и время: 2018-06-10T15:11:21 --------=====--------------------- Температура: °C 24.40 Влажность: % 43.00 Дата и время: 2018-06-10T15:11:25 --------=====--------------------- Температура: °C 24.40 Влажность: % 43.10 Дата и время: 2018-06-10T15:11:29 --------=====--------------------- Температура: °C 24.40 Влажность: % 43.10 Дата и время: 2018-06-10T15:11:33 --------=====---------------------

/*

  • On start-up the autoprobe feature is used to search the I2C bus to
  • find the first available real-time clock. The sketch indicates
  • which clock type (if any) has been found. If the clock is an
  • MCP7941x device the current calibration setting is printed.
  • The clock can be set by writing the current unixtime (i.e., seconds
  • since 1970-01-01 00:00:00Z) prefixed by the character ‘T’ to
  • Serial. The string must be terminated by a NULL character, line
  • feed, or carriage return. E.g., “T1343779200” sets the clock to
  • 2012-08-01 00:00:00Z".

*/

#include <Wire.h>
#include <RTClib.h> // Библиотека часов реального времени 1307
#define PWM_MIN 0 //Если необходим ток покоя на LED - изменить эту константу
#define PWM_MAX 20 //Если необходимо ограничить максимальную яркость - уменьшить значение
#define PWM_PIN 7
#define rele1 3
#define ReleChn1 8//Пин порта, где будет ШИМ
//#define Rele1 3
//#define Rele2 4
#define ReleObogrev 5
#define ReleTuman 6
#define mn 60UL //Дополнительные константы для удобства
#define hr 3600UL //Отражают соответствующие количества секунд
#define d 86400UL

#include <AM2320.h> // Библиотека датчика AM2320 по шине i2c
AM2320 sensor; // Обьявляем sensor

//------------------------------------------------------------------
class time{
public:
time(unsigned char h=0, unsigned char m=0, unsigned char s=0){
set_time(h, m, s);
}
time& operator = (time &t){hour = t.hour; min = t.min; sec = t.sec; seconds = t.seconds; return this;}
boolean operator ==(time &t){return seconds==t.get_time();}
boolean operator !=(time &t){return !(this==t);}
boolean operator > (time &t){return seconds>t.get_time();}
boolean operator < (time &t){return seconds<t.get_time();}
boolean operator >=(time &t){return seconds>=t.get_time();}
boolean operator <=(time &t){return seconds<=t.get_time();}
void set_time(unsigned char h, unsigned char m, unsigned char s){
hour=h; min=m; sec=s;
seconds=(unsigned long)h
1440 + (unsigned long)m
60 + s;
}
unsigned long get_time(){return seconds;};
void print() {Serial.print(hour); Serial.print(’:’);Serial.print(min); Serial.print(’:’);Serial.println(sec);}
private:
unsigned char hour;
unsigned char min;
unsigned char sec;
unsigned long seconds;
};
//------------------------------------------------------------------
class Rele{
public:
Rele(unsigned char pin){
pin_num = pin;
pinMode(pin_num, OUTPUT);
digitalWrite(pin_num, 1);
state=0;
}
void operator =(boolean val) {digitalWrite(pin_num, !val); state=val;}
operator boolean() {return state;}
private:
unsigned char pin_num;
boolean state;
};
//------------------------------------------------------------------

RTC_DS1307 RTC;

time cur_time;
time Rele1_on(07, 00, 00); // Время включения 1-ого реле
time Rele1_off(22, 00, 00); // Время отключения 1-ого реле
Rele Rele1(ReleChn1); // Реле 1

char daysOfTheWeek[7][12] = {“Воскр”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”};

void setup(void)
{
Wire.begin(); //Инициируем I2C интерфейс
RTC.begin(); //Инициирум RTC модуль
analogWrite(PWM_PIN, PWM_MIN); //Пишем в порт минимальное значение
Serial.begin(9600); //Запускаем сом-порт
delay(3000); //Ожидаем открытия консоли

if (! RTC.begin()) {
Serial.println(“Couldn’t find RTC”);
while (1);
}

// following line sets the RTC to the date & time this sketch was compiled
// RTC.adjust(DateTime(F(DATE), F(TIME)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2018, 6, 11, 15, 15, 15)); // для установки времени ввести сюда время и расскоментировать

pinMode(ReleTuman, OUTPUT); // Пин реле увлажнителя
pinMode(ReleObogrev, OUTPUT); // Пин реле обогревателя
// pinMode(Rele2, OUTPUT); // Пин реле вентилятора
pinMode(Rele1, OUTPUT); // Пин реле управляемого таймером- свет
Serial.begin(9600);
Wire.begin();
sensor.begin();

}

void loop(void){

// Здесь мы будем считывать с датчика AM2320 температуру и влажность
// и контролировать 2 пина- 5и6
// Влажность и температура регулируются здесь этими 2мя релюхами

sensor.measure();
float h = sensor.getHumidity(); float t = sensor.getTemperature();
if (t>24) digitalWrite(5, HIGH); // Включаем реле обогревателя / он находитя в NO
else digitalWrite(5, LOW); // Выключаем реле обогревателя если температура достигнута
if (h>80) digitalWrite(6, HIGH); // Включаем реле туманогенератора / он находитя в NO
else digitalWrite(6, LOW); // Выключаем реле туманогенератора. Влажность достигнута
Serial.print("Температура: °C ");
Serial.println(t);
Serial.print("Влажность: % ");
Serial.println(h);
delay(1000);

// Тут мы окончили опрос датчика и выставили нужные значения ВКЛ и ВЫКЛ на 5и6 пины.
//
// Переходим к часам реального времени

long pwm;
DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла
long Day_time = myTime.unixtime() % 86400; //сохраняем в переменную - время в формате UNIX

DateTime now = RTC.now();

Serial.print(now.day(), DEC);
Serial.print(’.’);
Serial.print(now.month(), DEC);
Serial.print(’.’);
Serial.print(now.year(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(’:’);
Serial.print(now.minute(), DEC);
Serial.print(’:’);
Serial.print(now.second(), DEC);
Serial.println();
delay(1000);

static bool state;
static unsigned long time;
if((millis() - time) > (state ? 10000 : 20000)) // первое число отображает время одного положения в мск, второе число отображает длительность второго состояния реле
{
state = !state;
digitalWrite(Rele1, state);
time = millis();
}

cur_time.set_time(myTime.hour(), myTime.minute(), myTime.second()); // Устанавливаем часы, минут, секунды в cur_tim
//------------КАНАЛ 1 (Контроль температуры по времени) -------
// sensor.getTemperature();

Rele1 = (cur_time>=Rele1_on) && (cur_time<Rele1_off); // Состояние реле 1 = нахождение текущего времени в диапазоне от relay_1_on до relay_1_off и в диапазоне заданных температур
}//------------Конец ЦИКЛА-----------------------------

Have you considered using a DS3231 which has two separate alarms that can generate interrupts?

Don