Ещё один шаг к строительству метеостанции
![]() |
DHT-22 |
Помнится, весной я уже писал про датчик DHT-11. Был тогда им немало разочарован, потому что оказалось, что не измеряет он температуру ниже 0 градусов по Цельсию, а метеостанция - это штука, строго говоря, уличная. В общем, пришлось заказывать DHT-22, и вот он наконец приехал. Так что на сегодня все дела с приёмником отложил, решил вернуться к своему старому проекту - метеостанции. Это был тот редкий случай, когда я оказался рад собственному разгильдяйству: проект так и остался собран на макетной плате, осталось только поменять датчик, немного видоизменить код и всё запустить. Горький опыт подключения DHT-11 принёс свои плоды, так что запуск прошёл относительно быстро, хоть и не сразу.
Итак, что же за зверь DHT-22
Я скажу прямо: немного расстроен и разочарован. Я рассчитывал, что удорожание будет нести и повышение точности измерений, однако, результаты с обоих оказались примерно одинаковыми, а шаг измерения составил 0,1 градуса против 0,01 у моего барометра BMP-180, о котором я тоже писал. Конечно, скажете вы: 0,1 градуса - это уже более чем достаточно. Ну и я скажу, что разочарован потому только немного :)
![]() |
Temp - показания с BMP-180; Temp2 - с DHT-22. Расходятся на 0,6 градуса, не хило так... |
Даташит на датчик можно глянуть вот тут: (У меня DHT-22 AM2302)
А если коротко из него самое главное:
Напряжение питания: 3,3 - 6 вольт. (Отлично, обойдёмся одной 18650!)
Измерение влажности: 0 - 100% (Погрешность: 2-5%)
Измерение температуры: -40°C – +80°C (Погрешность: < +/- 0,5°C, какие уж тут 0,01...)
Период чувствительности: 2 секунды.
После подключения просят 1 секунду не обращаться к датчику, подождав период нестабильности в работе, это я отражу в скрипте.
![]() |
Сравнение DHT-11 и DHT-22 |
Подключение к метеостанции
![]() |
Вот так оно пока что собрано. Резисторы к дисплею - все по 10 килоом, кроме вывода CE - туда 1 килоом. |
Проект только в начале сборки, так что ещё потребуется время, чтобы его завершить, но сейчас у меня есть датчик давления, температуры и влажности, всё это подключено к Ардуино и выводит информацию на дисплей от Nokia. Неплохо для начала. В принципе, уже можно подключать аккумулятор и вывешивать за окно, но так неинтересно. Я планирую записывать данные с датчиков на SD-карту и потом во время зарядки иметь возможность перекидывать информацию на компьютер для последующей обработки статистики. Как сделаю - напишу, а пока что скетч того, что получилось.
// Это программа метеостанции// Она измеряет температуру, влажность и давление// И выводит результат на дисплей Nokia5110
#include <Adafruit_GFX.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_PCD8544.h>
#include <SFE_BMP180.h>
#include <Wire.h>
#include <DHT.h>
#define DHTPIN 2 // Пин подключения датчика температуры и влажности
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE); // Указываем параметры работы датчика
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
SFE_BMP180 pressure;
long time_pass; // Переменная таймера
double T,P;
void setup() {
display.begin(); // Инициализация дисплея
display.setContrast(60); // Устанавливаем контраст
display.setTextColor(BLACK); // Устанавливаем цвет текста
display.setTextSize(1); // Устанавливаем размер текста
display.clearDisplay(); // Очищаем дисплей
display.display();
pressure.begin(); // Инициализация барометра
dht.begin(); // Инициализация термогигрометра
delay(1000); // Секунду ждём период запуска схемы
time_pass = millis();
}
void loop()
{
char status;
float h, t; // Переменные влажности и температуры
if ((millis() - time_pass) >= 2000)
{
h = dht.readHumidity(); //Читаем влажность
t = dht.readTemperature(); //Читаем температуру
if (isnan(h) || isnan(t)) // Если ошибка чтения сенсора
{
// Сюда можно добавить сообщение об ошибке Serial.println
return;
}
float hic = dht.computeHeatIndex(t, h, false);
status = pressure.startTemperature();
if (status != 0) // Если пришёл не 0
{
// Ждём пришедшее число миллисекунд
delay(status);
// Записываем значение температуры в T
// Функция вернёт 1, если чтение успешно, иначе 0
status = pressure.getTemperature(T);
if (status != 0) // если не 0 (то есть 1)
{
// Старт измерения давления
// Параметр в скобках от 0 до 3 (чем точнее результат, тем дольше ожидание)
// Если запрос выполнен успешно, возвращается число миллисекунд для ожидания
// При неудачном исполнении возвращается 0
status = pressure.startPressure(3);
if (status != 0) // если не 0
{
// Ожидаем вернувшееся число миллисекунд до завершения измерения
delay(status);
// Измеряем давление
// Значение сохраняем в P, заметим, что для измерения требуется только что полученное T
// Если температура стабильна, можно измерить её один раз и подставлять дальше, но я бы не стал так делать
// Функция тоже возвращает 1, если всё успешно, 0, если что-то пошло не так
status = pressure.getPressure(P,T);
}
}
}
display.clearDisplay();
// Выведем текст
display.setContrast(60); // Устанавливаем контраст
display.setTextColor(BLACK); // Устанавливаем цвет текста
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temp:");
display.print(T,2);
display.println("oC");
P = P * 0.750062; // Перевод в мм ртутного столба
display.print("Pres:");
display.print(P,2);
display.println("mm");
display.print("Hum:");
display.print(h,2);
display.println("%");
display.print("Temp2:");
display.print(t,2);
display.println("oC");
display.display();
time_pass = millis();
}
}
Схема может давать сбой, как правило датчики температуры редко выходят из строя. к тому же часто дублируются - для надежности
ОтветитьУдалить