Как добавить калибровку контроллера влажности с помощью датчика UNO и 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
@kwhunter, 👍0
Обсуждение1 ответ
Лучший ответ:
Чтобы получить лучшую калибровку, вам нужно больше точек калибровки. В приведенном ниже примере я использую 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
- Некорректное чтение с DHT22 (на плате Nano)
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Питание светодиодной ленты - Сколько ампер?
- Arduino nano как клавиатура HID
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
Вам нужно больше точек данных для эффективной калибровки. В настоящее время вы понятия не имеете, является ли ошибка линейной, абсолютной или чем-то еще., @StarCat
@StarCat, спасибо, я знаю об этом и работаю над этим., @kwhunter