разделы:

Для мониторинга температуры и влажности в отдельно взятой комнате (пусть будет серверная), была собрана небольшая схема из всего трех компонентов из давно валяющегося без дела Arduino Nano и китайского OLED 0,91-дюймового дисплея. Осталось лишь докупить датчик да связать все в единое целое при помощи всего нескольких проводов, загрузить небольшой скетч в плату и готово.

Имея перед глазами все необходимые компоненты, готовую схему подключения и готовый код, собрать все это воедино в рабочий прототип не составляет труда, даже если вы только пробуете свои силы в различных поделках из Arduino. У меня например были сложности в подборе подходящей библиотеки которая смогла бы работать с этим дисплеем. Потом подбирались варианты подключения дисплея к самой плате Arduino Nano и координация работы в связке с датчиком DHT11 и поиск причин почему присутствует погрешность и как ее компенсировать. В конечном итоге, есть теперь готовый вариант проекта Мониторинга температуры и влажности с использованием Arduino Nano, DHT11 и OLED 0,91-дюймового дисплея.

Список необходимых деталей:

1 x Arduino Nano [Aliexpress 1, 2, 3, ChipDip, Амперкот ]
1 x OLED 0,91-дюймовый дисплей (128×32) [Aliexpress 1, 2, 3, ChipDip, Амперкот ]
1 x DHT11 датчик [Aliexpress 1, 2, 3, ChipDip, Амперкот ]
& x Провода

Иллюстрация с примерами необходимых компонентов:

Общий процесс сборки не представляет сложности, особенно если вы уже имели ранее дела с платами Arduino и IDE Arduino. В данном проекте, от нас требуется лишь залить код готового скетча на плату, используя IDE Arduino и в правильной последовательности, используя приведенные схемы, собрать все наши компоненты в одну схему. После чего нам остается только проверить правильность сборки и подать питание на плату Arduino Nano, например достаточно использовать провод Mini USB. После непродолжительно загрузки нашей платы, мы должны увидеть показания температуры и влажности, которые будет считывать датчик DHT11 и выводить на дисплей через Arduino Nano.

При необходимости можно внести изменения в код скетча. Например убрать вывод показаний в Фаренгейтах. Возможно может понадобится выводить температуру или влажность с некоторыми принудительными поправками.

ШАГ 1

Скачиваем готовый скетч UNODHT11OLED.ino [ СКАЧАТЬ *.ZIP]

В случае появления ошибок, вам могут понадобиться следующие библиотеки:
U8glib.h — https://github.com/olikraus/u8glib или так:

1. Откройте IDE Arduino
2. Перейдите в: Скетч –> Подключить библиотеку –> Менеджер библиотек
3. Введите в строке поиска u8glib и выберете из списка «U8glib by oliver»
4. Установить (install)

DHT.h — https://github.com/adafruit/DHT-sensor-library

ШАГ 2

При помощи IDE Arduino загружаем скачанный скетч в плату Arduino Nano.
Мониторинг температуры и влажности с использованием Arduino Nano

ШАГ 3

Используя схемы, подключаем необходимые компоненты между собой.
Схема для сборки Мониторинг температуры и влажности с использованием Arduino Nano, DHT11 и OLED 0,91-дюймового дисплея

Схема для сборки Мониторинг температуры и влажности с использованием Arduino Nano, DHT11 и OLED 0,91-дюймового дисплея

Таблица подключения проводов:
Таблица подключения проводов Arduino Nano, DHT11 и OLED 0,91

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

В качестве совета, настоятельно рекомендую перед включением питания тщательно проверить правильность сборки. Предварительно, первую сборку можно провести на макетной плате (breadboard), чтобы убедиться в работоспособности компонентов и кода. После того как вы убедитесь, что все правильно и работает, можно уже собирать основательно, не забывая каждый раз в процессе, проверять правильность подключения проводов.

Мониторинг температуры и влажности с использованием Arduino Nano, DHT11 и OLED 0,91-дюймового дисплея

Собрав все компоненты воедино и убедившись в их работоспособности, можно экспериментировать с различными вариантами оформления, подбора корпуса и так далее. Так же можно вносить некоторые изменения в сам код.

На этом основные шаги по сборке можно смело завершать. На данном этапе, у вас все должно работать.

— — — — —

Дальше я приведу некоторые пояснения к коду скетча, которые возможно могут вам пригодиться. Если чтение кода у вас вызывает сложности или вопросы, попробуйте или изучать его построчно, изучая каждую строку медленно и без спешки или не пробуйте изменять совсем, чтобы не поломать его совсем.

С кодом возможны следующие манипуляции:

Можно кастомизировать используемый размер цифр, заменив в с троках где есть:

u8g.setFont(u8g_font_unifont);

Шрифт u8g_font_unifont на подходящий вам

u8g_font_unifont // Универсальный шрифт
u8g_font_4x6 // Мелкий шрифт
u8g_font_5x8 // Мелкий шрифт +
u8g_font_6x10 // Мелкий шрифт с читаемыми буквами
u8g_font_6x12 // Шрифт с читаемыми буквами
u8g_font_8x13B // толстые буквы, шрифт крупнее
u8g_font_8x13 // Шрифт крупнее

Так же можно убрать вывод температуры в Фаренгейтах. Для этого необходимо найти в коде скетча и полностью удалить (или закомментировать символами //) следующую строку:

float f = dht.readTemperature(true); // Temperature in Fahrenheit | Температура в Фаренгейтах

Далее необходимо найти и удалить следующий кусок кода:

u8g.setFont(u8g_font_4x6);
u8g.drawStr( 0, 32, "F: "); // Temperature in Fahrenheit | Температура в Фаренгейтах
u8g.drawStr( 10, 32, dtostrf(f, 5, 0, str));
u8g.drawStr( 40, 32, "\260F");

Стоит рассмотреть принцип отображения текста, на примере тестового вывода строк текста, который появляется при загрузке платы.

u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(50, 15);
u8g.print("HELLO");
u8g.setPrintPos(60,30);
u8g.print(">_<");

Строкой u8g.setFont(u8g_font_unifont); мы задаем шрифт, который будет использоваться в при последующем выводе информации на экране.
Строка u8g.setPrintPos(50, 15); указывает, что текст должен выводиться на 15 строке экрана, на 50й позиции.
Печатаем текст на экране u8g.print("HELLO");
Задаем координаты следующего текста u8g.setPrintPos(60,30);, 30 строка, 60 позиция.
Печатаем текст u8g.print(">_<");

Или можно сразу казать координаты и текст u8g.drawStr( 0, 14, "TEST"); 14 строка, 0 позиция, текст TEST. Используя эти знания вы можете манипулировать координатами положения текста можно выводить цифры выше или ниже, правее или левее.

Теперь давайте рассмотрим следующие строки:
u8g.drawStr( 20, 14, dtostrf(t, 5, 2, str));

и

u8g.drawStr( 20, 26, dtostrf(h, 5, 2, str));

Отвечают за вывод температуры и влажности. Попробуем разобрать их синтаксис:

Цифры 20, 26 и 20, 14 указывают на то, что значения выводятся на 20 позиции на 14 и 26 строках экрана.

Цифры t, 5, 2, str обозначают следующее:
t - это ранее обозначенная переменная с значением температуры с датчика
h - это ранее обозначенная переменная с значением температуры с датчика.
Цифра 5 - длина получаемого символьного значения (предварительно цифры преобразуются функцией dtostrf ())
Цифра 2 - кол-во знаков после запятой.

Стоит обратить внимание на тот факт, что датчики DHT11\DHT22 славятся своей не очень точной работой. Например несколько датчиков, могут выдавать совершенно разные показания. Гарантированного решения как это исправить кроме как полностью поменять датчик или всю схему нет. Но можно грубо вносить корректировку в показания через код. Например имеющийся у меня датчик привирает на 3 градуса. Вместо 25 градусов по цельсию, показывает 27. Для моих целей, это довольно высокая погрешность. Поэтому в самом коде, было сделано так, чтобы приходящие показания температуры понижались на два градуса. Данный способ вполне применим и к показаниям влажности. При наличии такой же проблемы, вы можете сделать аналогично.

Найдите в коде строку:

float t = dht.readTemperature();

Добавить корректирующее значение. В моем примере от имеющейся температуры отнимается 3 градуса.

float t = dht.readTemperature() - 3.0;

Но! Это не самый хороший вариант. Из-за особенностей датчика DHT11\DHT22, погрешность не является постоянной величиной и на каждом из значений начинает варьироваться в большую или меньшую сторону. В идеале, должна составляться таблица погрешностей и вноситься корректировки используя показатели из этой таблицы. Конкретно в этом варианте, предложенного решения должно быть достаточно.

Можно изменить код до неузнаваемости, выключив например не нужные показания и увеличив размер цифр, сделать оригинальный корпус и так далее. Список возможностей ограничен только вашей фантазией и возможностями. Сфера применения данной сборки, тоже довольно широк. Можно сделать домашнюю метеостанцию в комнату квартиры, на дачу или мониторить температуру и влажность в инкубаторе и так далее.

На этом вроде все!