По условию if

rss-999@mail.ru
Offline
Зарегистрирован: 02.06.2021

Доброго времени суток.
Хочу по модулю времени и датчику температуры управлять пином, использую такое условие:

if (watch.Hours>=0 && watch.Hours<=5 || watch.Hours>=9 && watch.Hours<=24 && ds.getTempC(sensor1) < 70 && peregrev1 == true)

смысл такой - работать с 9 утра до 5 утра, не превышая температуру на датчике. Меня смущает наличие двух операндов, лог. ИЛИ и лог.И
Будут ли они работать
или как оптимизировать этот код
благодарю заранее

Гриша
Offline
Зарегистрирован: 27.04.2014

rss-999@mail.ru пишет:

Доброго времени суток.
Хочу по модулю времени и датчику температуры управлять пином, использую такое условие:

if (watch.Hours>=0 && watch.Hours<=5 || watch.Hours>=9 && watch.Hours<=24 && ds.getTempC(sensor1) < 70 && peregrev1 == true)

смысл такой - работать с 9 утра до 5 утра, не превышая температуру на датчике. Меня смущает наличие двух операндов, лог. ИЛИ и лог.И
Будут ли они работать
или как оптимизировать этот код
благодарю заранее

1) будут, именно это условие написано правильно. Это не касается иных ошибок или логического не соответствия желаемого с описанным.

2) что именно нужно оптимизировать?
3) немного громоздко, но лучше сперва создать переменные, а потом эти переменные сравнивать

rkit
Offline
Зарегистрирован: 23.11.2016

Меньше нуля часов не бывает. Как и больше 24. Даже 24 не бывает, а больше 24 и подавно.

rss-999@mail.ru
Offline
Зарегистрирован: 02.06.2021

Верно, не подумал

rss-999@mail.ru
Offline
Зарегистрирован: 02.06.2021

Подумал что этот код можно сделать лучше
 

Гриша
Offline
Зарегистрирован: 27.04.2014

rss-999@mail.ru пишет:

if (watch.Hours>=0 && watch.Hours<=5 || watch.Hours>=9 && watch.Hours<=24 && ds.getTempC(sensor1) < 70 && peregrev1 == true)

с ds.getTempC(sensor1) могут возникнуть проблемы (не обязательно). избавьтесь от функции и используйте переменную в условии

rss-999@mail.ru
Offline
Зарегистрирован: 02.06.2021

Еще вопрос, для проверки на перегрев использую такое условие:
 if (ds.getTempC(sensor1) == 70){peregrev1 = false;}  if (ds.getTempC(sensor1) == 40) {peregrev1 = true;}

Но условие отрабатывает не верно, вот этот кусок кода (ds.getTempC(sensor1) < 70), проходит, не ждет пока температура упадет до 40

есть мысли?

Гриша
Offline
Зарегистрирован: 27.04.2014

rss-999@mail.ru пишет:

Еще вопрос, для проверки на перегрев использую такое условие:
 if (ds.getTempC(sensor1) == 70){peregrev1 = false;}  if (ds.getTempC(sensor1) == 40) {peregrev1 = true;}

Но условие отрабатывает не верно, вот этот кусок кода (ds.getTempC(sensor1) < 70), проходит, не ждет пока температура упадет до 40

есть мысли?

такие строгие условия (выделил) скорее всего не будут выполняться. опишите словами логику работы по этим условиям

rss-999@mail.ru
Offline
Зарегистрирован: 02.06.2021

 if (ds.getTempC(sensor1) >= 70){peregrev1 = false;}  if (ds.getTempC(sensor1) <= 40) {peregrev1 = true;}
так сделал и заработало

вообще смыл такой был, если темп достигнет 70 градусов, отключить прибор и ждать пока не упадет до 40, потом включить

Гриша
Offline
Зарегистрирован: 27.04.2014

rss-999@mail.ru пишет:

 if (ds.getTempC(sensor1) >= 70){peregrev1 = false;}  if (ds.getTempC(sensor1) <= 40) {peregrev1 = true;}
так сделал и заработало

как то не могу переварить название переменной peregrev1... тут по логике слово нагрев подходит больше.

если <40C включаем нагрев

если >70C выключаем нагрев

называется гистерезис.

rss-999@mail.ru
Offline
Зарегистрирован: 02.06.2021

Загуглю гестерезис, спасибо

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Гриша пишет:

как то не могу переварить название переменной peregrev1... тут по логике слово нагрев подходит больше.

если <40C включаем нагрев

если >70C выключаем нагрев

Думаю тут просто true и false перепутаны.

если >70C "мотор" перегрелся, выключаем.

если < 40C "мотор" остыл, включаем.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

rss-999@mail.ru пишет:

if (watch.Hours>=0 && watch.Hours<=5 || watch.Hours>=9 && watch.Hours<=24 && ds.getTempC(sensor1) < 70 && peregrev1 == true)

смысл такой - работать с 9 утра до 5 утра, не превышая температуру на датчике.

В данном условии ночью результат не зависит от температуры. Это так и задумано? Если нет, пользуйтесь скобками. 

rss-999@mail.ru
Offline
Зарегистрирован: 02.06.2021

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

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Смотрите что будет в час ночи при температуре 71 градус.

const uint8_t pinLed = 13;

void setup() {
	pinMode(pinLed, 1); digitalWrite(pinLed, 0);
	uint8_t hour = 1; // час
	uint8_t tempC = 71; // температура
	bool peregrev1 = false;

	if (tempC >= 70) peregrev1 = true; // проверяем на перегрев

	if (hour >= 0 && hour <= 5 || hour >= 9 && hour <= 24 && tempC < 70 && peregrev1 == false) {
		digitalWrite(pinLed,1); // зажигаем светодиод, если выражение true
	}
}

void loop() {}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я без скобок логику условия вообще не понимаю....

Green
Offline
Зарегистрирован: 01.10.2015

Это ваш плюс или "их" минус?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Это факт )))

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

С таким условием с 0 до 5 часов всегда будет true, с 6 до 8 всегда false, с 9 до 23 будет зависеть от температуры и флага. Вроде, так.

Как вариант можно и без скобок, но будет не оптимально.

Green
Offline
Зарегистрирован: 01.10.2015

AndreyD пишет:
Как вариант можно и без скобок, но будет не оптимально.


А GCC допускает && и || без скобок? Никаких предупреждений?

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Green пишет:

А GCC допускает && и || без скобок? Никаких предупреждений?

Я неправильно выразился, без дополнительных скобок записать выражение, которое хочет ТС. В моём понимании чего он хочет.

Green
Offline
Зарегистрирован: 01.10.2015

А вот в понимании компилятора:

 warning: suggest parentheses around '&&' within '||' [-Wparentheses]
 
   if (hour >= 0 && hour <= 5 || hour >= 9 && hour <= 24 && tempC < 70 && peregrev1 == false) {
 
       ~~~~~~~~~~^~~~~~~~~~~~
AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Согласен, был не прав.

Но можно ещё и по нескольким if-ам раскидать.