Как добавить калибровку контроллера влажности с помощью датчика UNO и DHT22?

arduino-nano dht22

Я использую установку, которая помогает контролировать влажность в корпусе, используемом для хранения чувствительного к влажности продукта. Моя исходная публикация находится здесь.

Я использую датчик температуры/влажности NANO и DHT22 для получения информации о фактическом состоянии в корпусе; Я также использую набор для калибровки относительной влажности 75%, чтобы проверить точность показаний влажности UNO, и я обнаружил, что значение на 9 процентных пунктов выше, чем значение калибровки набора. Прямо сейчас, пока я не найду решение для калибровки устройства, я установил свою уставку на 9 пунктов выше, чтобы компенсировать ошибку. Любые идеи о том, как решить эту проблему, будут высоко оценены.

На данный момент я могу считывать показания датчика DHT и отображать значение влажности на ЖК-дисплее следующим образом:

[...]
  int chk = DHT.read22(DHT22_PIN);
  lastcheck = millis();

  lcd.setCursor(0, 0);
  lcd.print("Humidity: ");
  lcd.setCursor(13, 0);
  lcd.print(DHT.humidity);
[...]

@Thomas_Weller, Я провожу тесты с вашей процедурой калибровки и другими изменениями кода; Я использую ваши произвольные значения только для целей тестирования; алгоритм компенсации работает, как показано ниже, однако на ЖК-дисплее отображается фактическое показание DHT22 без компенсации. Я тестирую с другим датчиком, выходной сигнал которого на 9% ниже фактического значения относительной влажности. Вот пример последовательного вывода:

DHT value: 58
Compensated to: 55
DHT value: 59
Compensated to: 56
DHT value: 60
Compensated to: 57
DHT value: 61
Compensated to: 58
DHT value: 62
Compensated to: 59
DHT value: 63
Compensated to: 60
DHT value: 64
Compensated to: 60


setpoint = 72
DHT read = 66.80%
displ + backlights off
humidifier ON, fan OFF
setpoint = 72
displ + backlights off
humidifier ON, fan OFF
setpoint = 72
displ + backlights off
humidifier ON, fan OFF
setpoint = 72
DHT read = 66.80%
displ + backlights off
humidifier ON, fan OFF
setpoint = 72
displ + backlights off
humidifier ON, fan OFF
setpoint = 72
displ + backlights off
humidifier ON, fan OFF

, 👍0

Обсуждение

Вам нужно больше точек данных для эффективной калибровки. В настоящее время вы понятия не имеете, является ли ошибка линейной, абсолютной или чем-то еще., @StarCat

@StarCat, спасибо, я знаю об этом и работаю над этим., @kwhunter


1 ответ


Лучший ответ:

5

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

Дано 8 пакетов для калибровки влажности на 20, 30, 40, 50, 60, 70, 75 и 80%.

int calvalues[] = {20, 30, 40, 50, 60, 70, 75, 80};

Вы должны взять несколько образцов с помощью датчика DHT и построить таблицу, используя средние значения:

int dhtvalues[] = {15, 28, 39, 51, 63, 75, 84, 89};

Как видите, DHT ниже реальных значений в нижнем диапазоне и выше реальных значений в верхнем диапазоне. Но может быть и наоборот.

Затем вы можете написать эту функцию:

#define COMPENSATION_POINTS 8

int compensate(int sensor_value)
{
  for(int index=1; index<COMPENSATION_POINTS; index++)
  {
    if (dhtvalues[index]>sensor_value)
    {
      int dhtLow = dhtvalues[index-1];
      int dhtHigh = dhtvalues[index];
      int calLow = calvalues[index-1];
      int calHigh = calvalues[index];

      return map(sensor_value, dhtLow, dhtHigh, calLow, calHigh);
    }
  }
}

который выполняет линейную интерполяцию для всех значений, находящихся где-то посередине.

Вот пример тестового кода, который проверяет значения в ожидаемом диапазоне.

void setup() {
  Serial.begin(9600);
  for(int hum=15; hum<=89; hum++)
  {
    Serial.print("DHT value: ");
    Serial.println(hum);
    Serial.print("Compensated to: ");
    Serial.println(compensate(hum));
  }
}

void loop() {
  delay(1000);
}

Вывод:

DHT value: 15
Compensated to: 20
DHT value: 16
Compensated to: 20
DHT value: 17
Compensated to: 21
DHT value: 18
Compensated to: 22
...
DHT value: 87
Compensated to: 78
DHT value: 88
Compensated to: 79
DHT value: 89
Compensated to: 79

Относится к вашему случаю:

[...]
  int chk = DHT.read22(DHT22_PIN);
  lastcheck = millis();

  lcd.setCursor(0, 0);
  lcd.print("Humidity: ");
  lcd.setCursor(13, 0);
  int compensated = compensate(DHT.humidity);   // <- новая строка
  lcd.print(compensated);                       // <- измененная строка
[...]
,

Хороший ответ (проголосовал). Как вы измеряли отклик датчика при 20, 30, 40, 50, 60, 70, 75, 80 относительной влажности? У вас есть установка с водой, содержащей различные соли для создания таких уровней влажности? И разве вы не должны также измерять отклик в диапазоне различных температур, поскольку ошибка, вероятно, зависит от температуры?, @Duncan C

@DuncanC: ты, наверное, прав. Это должна быть 2D-таблица., @Thomas Weller

@Thomas_Weller, я провел тесты, и мой первоначальный вопрос был отредактирован с учетом того, что я нашел; пожалуйста, прокомментируйте, спасибо., @kwhunter