Не работает опреатор OR ||

Humpa

✩✩✩✩✩✩✩
6 Авг 2023
25
0
Помогите! е могу понять, почему не работает оператор ИЛИ а данном коде:

if ( h < hum || t < temp) hStatus = LOW;
else hStatus = HIGH;
digitalWrite(hPIN, hStatus);

Менял || на OR, скобки ставил по разному...не работает. Оставляешь в скобках одно неравенство, всё работает...как через ИЛИ делаешь...не работает...второй день пытаюсь сделать, не могу разобраться.
 

Сотнег

★★★★★★★
15 Янв 2020
4,407
1,509
@Humpa,
проблема не в ||, а в вашем недопонимании происходящего.

В приведённом коде всё хорошо. Но его мало, чтобы помочь. Скорее всего, ещё и логи понадобятся и ваши рассуждения про то, как должно работать...
 
  • Лойс +1
Реакции: Humpa

Humpa

✩✩✩✩✩✩✩
6 Авг 2023
25
0
@Сотнег, должно работать так, чтобы при истине одного неравенства h < hum или t < temp , выполнялось условие hStatus = LOW . Когда в скобках одно неравенство, например ( h < hum ) , всё работает. Реле щёлкает, всё ОК. Как только загоняю в скобки два неравенства через || или OR...всё...if не работает. Я вторую неделю Ардуиню...зелень страшная. Второй день не могу разобраться...помогите Пожалуйста!
 

Вложения

Сотнег

★★★★★★★
15 Янв 2020
4,407
1,509
@Humpa,
наверное, должно быть
if ( h < hum || t < temp1) hStatus = LOW;

Вы попробуйте в проблемном месте начать выводить значения каждой из переменных в лог (в serial).
И h и t и hum и temp и hStatus...
 
  • Лойс +1
Реакции: Humpa

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
И да, не стесняйтесь после if-else обрамлять в блоки, даже если используется один оператор. Так меньше шанс получить ошибку.
C++:
if ( h < hum || t < temp)
{
    hStatus = LOW;
}
else
{
    hStatus = HIGH;
}
 
  • Лойс +1
Реакции: Humpa

Boroda22

★✩✩✩✩✩✩
23 Фев 2022
251
42
Если первое условие истинно, то второе не имеет смысла проверять.
 
  • Лойс +1
Реакции: Humpa

Humpa

✩✩✩✩✩✩✩
6 Авг 2023
25
0
Спасибо за ваши ответы...но ничего не помогло. Вывожу в последовательный переменные, всё пишет правильно, статус правильно...а всё равно не работает с ||.
if (h < hum ) так работает. Меняет 0 на 1
if (t < temp1) так работает. Меняет 0 на 1
if ( h < hum || t < temp1) не работает. Не меняет ничего.
if ((h < hum) || (t < temp)) не работает. Не меняет ничего.
Что-то уже и мыслей нет никаких...
Фигурные скобки ставил, как в ваших примерах.
 

Humpa

✩✩✩✩✩✩✩
6 Авг 2023
25
0
@Сотнег, я упростил код. Срабатывает, когда два условия выполняются.
C++:
#define hPIN 14 // Пин управления влажностью
int hStatus = LOW; // определяем переменную, отвечающую за состоянеие увлажнителя HIGH=выкл, LOW=вкл
int hum = 70; // Желаемая влажность (изменить на нужную)
int temp1 = 30; // Желаемая влажность (изменить на нужную)

#include <Adafruit_AHTX0.h>  // Подключаем библиотеку Adafruit_AHTX0
Adafruit_AHTX0 aht;          // Создаём объект для работы с библиотекой

void setup() {
  Serial.begin(115200);  // Инициируем работу с монитором последовательного порта на скорости 115200 бод

  pinMode(hPIN, OUTPUT); // Определяем пин для управления температурой как Вывод
  digitalWrite(hPIN, hStatus); // Притягиваем пин к начальному статусу (Выкл)

aht.begin();
}

void loop() {
  sensors_event_t humidity, temp;            // Создаём объект для работы с библиотекой
  aht.getEvent(&humidity, &temp);            // Считваем показания
 
int h = humidity.relative_humidity; // Считываем влажность
int t = temp.temperature; // Считываем влажность
 
if ( ( t < temp1 ) || ( h < hum) ) {hStatus = LOW;}
else {hStatus = HIGH;} // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
digitalWrite(hPIN, hStatus);

Serial.println(hStatus);
Serial.println(h);
Serial.println(t);
Serial.println(hum);
Serial.println(temp1);
delay(1500);  // Пауза
}
Вот лог, когда не срабатывает...два условия не выполняются
20:52:33.454 -> 0

20:52:33.454 -> 48

20:52:33.454 -> 25

20:52:33.454 -> 70

20:52:33.454 -> 30

Вот лог когда срабатыает
20:56:01.681 -> 1

20:56:01.681 -> 71

20:56:01.681 -> 33

20:56:01.681 -> 70

20:56:01.681 -> 30

Что ещё нужно? Напишите я пришлю. Может в синтаксисе где ошибка? Почему он || выполняет, как && ?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Вот лог, когда не срабатывает...два условия не выполняются
20:52:33.454 -> 0

20:52:33.454 -> 48

20:52:33.454 -> 25

20:52:33.454 -> 70

20:52:33.454 -> 30

Вот лог когда срабатыает
20:56:01.681 -> 1

20:56:01.681 -> 71

20:56:01.681 -> 33

20:56:01.681 -> 70

20:56:01.681 -> 30
У вас все срабатывает согласно написанной вами логике. Если условие срабатывает, то ставится hStatus = LOW; т.е. hStatus равна 0
 
  • Лойс +1
Реакции: Humpa

Сотнег

★★★★★★★
15 Янв 2020
4,407
1,509
@Humpa,
C-like:
if ( ( t < temp1 ) || ( h < hum) ) {hStatus = LOW;}
else {hStatus = HIGH;}

C-like:
if ( ( 25 < 30 ) || ( 48 < 70) ) {hStatus = LOW;}
else {hStatus = HIGH;}
Serial.println(hStatus); // 20:52:33.454 -> 0
C-like:
if ( ( 33 < 30 ) || ( 71 < 70) ) {hStatus = LOW;}
else {hStatus = HIGH;}
Serial.println(hStatus); // 20:56:01.681 -> 1
Как и ожидалось...
 

Humpa

✩✩✩✩✩✩✩
6 Авг 2023
25
0
@Сотнег, мне нужно, чтобы 1 была, даже если одно из двух неравенство выполнялось.
 

Humpa

✩✩✩✩✩✩✩
6 Авг 2023
25
0
@Сотнег, я понял...в чём дело. Мне надо было знаки неравенства поменять, чтобы работало как мне надо! Огромное всем спасибо! Вы так хотели мне Дурню помочь! =)
if ((h > hum) or (t > temp1)) hStatus = HIGH;
else hStatus = LOW;
Вот так работает теперь! =)))