Если операторы не работают должным образом на ESP32

У меня тут несколько загадочная ситуация с моим экспериментом. Я просто измеряю влажность почвы с помощью емкостного датчика и считываю через аналоговый вывод nodemcu. После этого я делю состояние почвы на влажное, среднее или сухое. Я хочу использовать для этого простые операторы if-else. Но по какой-то причине они работают не так, как задумано. Только сначала, если выполняется, условие выполняется, когда не должно ...

        const int SOIL_MOISTURE_DATA_NOT_FOUND = 0;
  const int SOIL_TOO_WET = 1;
  const int SOIL_MID_LEVEL_MOISTURE = 2;
  const int SOIL_TOO_DRY = 3;

  

Когда я использую инструкции else if, она выполняет только первую инструкцию и возвращает ..

        int soilStatus = SOIL_MOISTURE_DATA_NOT_FOUND;

  int rawHumiditySensorValue = analogRead(A0);

  Serial.print("Moisture value : ");
  Serial.println(rawHumiditySensorValue);
  
  if( 500 < rawHumiditySensorValue <= 750 )
  {
    Serial.println("SOIL_TOO_WET");
    soilStatus = SOIL_TOO_WET;
  }
  else if( 750 < rawHumiditySensorValue <= 820 )
  {
    soilStatus = SOIL_MID_LEVEL_MOISTURE;
    Serial.println("SOIL_MID_LEVEL_MOISTURE");
  }
  else if( 820 < rawHumiditySensorValue <= 920 )
  {
    soilStatus = SOIL_TOO_DRY;
  }
   // Invalid reading / no reading cases:
  else if( rawHumiditySensorValue < 500 || rawHumiditySensorValue > 1000 )
  {
    soilStatus = SOIL_MOISTURE_DATA_NOT_FOUND;
  }
    
  Serial.print("Soil Status :");
  Serial.println(soilStatus);

Выход из последовательного монитора:

Я удалил if else, все операторы if выполняются независимо от значения переменной

        int soilStatus = SOIL_MOISTURE_DATA_NOT_FOUND;

  int rawHumiditySensorValue = analogRead(A0); //readAnalogDataFromHydroSensor(pinID);

  Serial.print("Moisture value : ");
  Serial.println(rawHumiditySensorValue);
  
  if( 500 < rawHumiditySensorValue <= 750 )
  {
    Serial.println("SOIL_TOO_WET");
    soilStatus = SOIL_TOO_WET;
  }
  if( 750 < rawHumiditySensorValue <= 820 )
  {
    soilStatus = SOIL_MID_LEVEL_MOISTURE;
    Serial.println("SOIL_MID_LEVEL_MOISTURE");
  }
  if( 820 < rawHumiditySensorValue <= 920 )
  {
    soilStatus = SOIL_TOO_DRY;
  }
  // Invalid reading / no reading cases:
  if( rawHumiditySensorValue < 500 || rawHumiditySensorValue > 1000 )
  {
    soilStatus = SOIL_MOISTURE_DATA_NOT_FOUND;
  }
    
  Serial.print("Soil Status :");
  Serial.println(soilStatus);

На мониторе последовательного порта я получаю следующий результат:

Что мне здесь не хватает? Я проверил тип данных всех локальных варов, для всех установлено значение int.

1 ответ

Решение

Операторы отношения - это бинарные операторы с ассоциативностью слева направо. Результат 0 или 1.

Выражение 500 < rawHumiditySensorValue <= 750 эквивалентно (500 < rawHumiditySensorValue) <= 750. Поскольку результат (500 < rawHumiditySensorValue) будет 0 или 1, и поскольку оба этих значения меньше или равны 750, результатом всего выражения будет 1.

Вы, наверное, хотели 500 < rawHumiditySensorValue && rawHumiditySensorValue <= 750.


Вы можете упростить использование реляционных операторов в своем коде, используя else if:

        // Invalid reading / no reading cases:
  if( rawHumiditySensorValue < 500 || rawHumiditySensorValue > 1000 )
  {
    soilStatus = SOIL_MOISTURE_DATA_NOT_FOUND;
  }
  else if( rawHumiditySensorValue <= 750 )
  {
    soilStatus = SOIL_TOO_WET;
  }
  else if( rawHumiditySensorValue <= 820 )
  {
    soilStatus = SOIL_MID_LEVEL_MOISTURE;
  }
  else if( rawHumiditySensorValue <= 920 )
  {
    soilStatus = SOIL_TOO_DRY;
  }
  else
  {
    soilStatus = SOIL_FAR_TOO_DRY; /* Original code did not handle this case! */
  }
Другие вопросы по тегам