Не срабатывает условие

В принцепи всё довольно просто. Arduino в зависимости от времени включает фонарь с вентилятором.
Когда тестирую на секундах, например с 1 по 30 выключить, с 31 по 60 включить. Всё прекрасно работает.
Но когда я перехожу на часы Arduino будто зависает.
Когда наступает время выключения, лампа не выключается. Отключаю всё от питания, влючаю, лампа не выключина как и должна. Аналогичная ситуация происходит и с включением.
По логам время оприделяется и условия отрабатывают правильно.
В электротехнике не очень силён, может резистор какой добавить…

Использую:
Arduino UNO R3 (ATMega328/CH340G)
Релейный модуль 2 канала
Модул часов реального времени (RTS) DS1307
Силовое реле

Скетч:

  if( millis()%1000==0 ){//Если прошла 1 секунда.
    // Управление светом и охлаждением лампы (Включение на 14 часов (с 6 до 20))
    if(watch.Hours>=6 && watch.Hours<=19){// Если время в промежутке от 6 утра до 20
      pinMode(lightPin, OUTPUT);
      pinMode(lightFanPin, OUTPUT);
      Serial.println("light:on");
    } else {
      Serial.println("light:off");
      pinMode(lightPin, INPUT);
      pinMode(lightFanPin, INPUT);
    }
  }
}```

Это не скетч

unixtime используй для задания интервалов времени и проблем с часами не будет. Не используй равно для проверки интервала , используй больше меньше.

Целиком нужно?

#include <iarduino_RTC.h>
iarduino_RTC watch(RTC_DS1307);

int lightPin = 12; // Освещение
int lightFanPin = 11; // Охлаждение лампы освещения

void setup(){
     delay(300);
     Serial.begin(9600);
     watch.begin(&Wire);
}
void loop(){  
  if( millis()%1000==0 ){//Если прошла 1 секунда.
    // Управление светом и охлаждением лампы (Включение на 14 часов (с 6 до 20))
    if(watch.Hours>=6 && watch.Hours<=19){// Если время в промежутке от 6 утра до 20
      pinMode(lightPin, OUTPUT);
      pinMode(lightFanPin, OUTPUT);
      Serial.println("light:on");
    } else {
      Serial.println("light:off");
      pinMode(lightPin, INPUT);
      pinMode(lightFanPin, INPUT);
    }
  }
}

скажите в какой строке вы получаете текущее время от RTC?

в 3 строке
На сколько я понял watch.begin(&Wire); открывает соединения с часами.
И уже в условии я получаю текущее время if(watch.Hours>=6 && watch.Hours<=19)

пятница…

плохо поняли
строка под номером 3 пустая!

не получает значение.

//	
//	Для работы с модулями, в библиотеке реализованы 5 функции:
//	    инициировать модуль  begin();
//	    указать время        settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]);
//	    получить время       gettime("строка с параметрами");
//		мигать времем        blinktime(0-не_мигать / 1-мигают_сек / 2-мигают_мин / 3-мигают_час / 4-мигают_дни / 5-мигают_мес / 6-мигает_год / 7-мигают_дни_недели / 8-мигает_полдень)
//	    разгрузить шину      period (минуты);
//	
//	Функция begin():
//	    функция инициирует модуль: проверяет регистры модуля, запускает генератор модуля и т.д.
//	
//	Функция settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]):
//	    записывает время в модуль
//	    год указывается без учёта века, в формате 0-99
//	    часы указываются в 24-часовом формате, от 0 до 23
//	    день недели указывается в виде числа от 0-воскресенье до 6-суббота
//	    если предыдущий параметр надо оставить без изменений, то можно указать отрицательное или заведомо большее значение
//	    пример: settime(-1, 10); установит 10 минут, а секунды, часы и дату, оставит без изменений
//	    пример: settime(0, 5, 13); установит 13 часов, 5 минут, 0 секунд, а дату оставит без изменений
//	    пример: settime(-1, -1, -1, 1, 10, 15); установит дату 01.10.2015 , а время и день недели оставит без изменений
//	
//	Функция gettime("строка с параметрами"):
//	    функция получает и выводит строку заменяя описанные ниже символы на текущее время
//	    пример: gettime("d-m-Y, H:i:s, D"); ответит строкой "01-10-2015, 14:00:05, Thu"
//	    пример: gettime("s");               ответит строкой "05"
//	    указанные символы идентичны символам для функции date() в PHP
//	s   секунды                       от      00    до       59  (два знака)
//	i   минуты                        от      00    до       59  (два знака)
//	h   часы в 12-часовом формате     от      01    до       12  (два знака)
//	H   часы в 24-часовом формате     от      00    до       23  (два знака)
//	d   день месяца                   от      01    до       31  (два знака)
//	w   день недели                   от       0    до        6  (один знак: 0-воскресенье, 6-суббота)
//	D   день недели наименование      от     Mon    до      Sun  (три знака: Mon Tue Wed Thu Fri Sat Sun)
//	m   месяц                         от      01    до       12  (два знака)
//	M   месяц наименование            от     Jan    до      Dec  (три знака: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
//	Y   год                           от    2000    до     2099  (четыре знака)
//	y   год                           от      00    до       99  (два знака)
//	a   полдень                               am   или       pm  (два знака, в нижнем регистре)
//	A   полдень                               AM   или       PM  (два знака, в верхнем регистре)
//	    строка не должна превышать 50 символов
//	

а может таблетку какую съесть…

2 лайка

и да

это не функция включения/выключения пинов, вам просто повезло что это работает (если работает вообще)
и на схеме у вас нет соединения общего провода и земель ардуино и RTC
короче ФАРШ отменный)

и еще)
твердотелое реле указанное на схеме управляется переменным напряжением
image

у меня большие сомнения что это вообще как то работает

1 лайк

тему унес в песочницу

1 лайк

За сегодня уже второй товарищ, которому лень примеры от библиотеки поглядеть, описание почитать. Опять же примеры из IDE почему не глянуть, чтобы такие чудеса про pinMode не писать? Жуть…

скорее всего у ТС не такое, он просто картинку похожую в сети нашел

расскажи это @andriano :laughing:

ну вообще что-то в этом есть…

pinMode(OUTPUT) выдает на пин низкий уровень, а pinMode(INPUT) - переводит пин в Z-state. Если пин реле управляется низким уровнем и притянут к VCC- может и сработать

А проблема у вас или у нас?

Да это понятно! Только он ведь потом везде так и будет “включать” :slight_smile:

блин, больно сильно прессанули, как думаете, оклемается, придет?

ты ему главную ошибку подсказал, так что может и сам справится