Датчик в связке с ардуино для измерения влажности воздуха и температуры. Модуль DHT11 подключение к Arduino Схема подключения датчика температуры и влажности

Итак, датчик DHT11 имеет следующие характеристики:

  • диапазон измеряемой относительной влажности - 20..90% с погрешностью до 5%,
  • диапазон измеряемых температур - 0..50°C с погрешностью до 2°C;
  • время реакции на изменения влажности - до 15 секунд, температуры - до 30 секунд;
  • минимальный период опроса - 1 секунда.

Как видно, датчик DHT11 не отличается особой точностью, да и диапазон температур не охватывает отрицательные значения, что вряд ли подойдёт для наружных измерений в холодное время года при нашем климате. Однако малая стоимость, малый размер и простота работы с ним частично перекрывают эти недостатки. На рисунке приведён внешний вид датчика и его размеры в миллиметрах.

2 Схема подключения датчика температуры и влажности DHT11

Рассмотрим схему подключения датчика температуры и влажности DHT11 к микроконтроллеру, в частности, к Arduino.


Давайте посмотрим, что показано на рисунке.

Обозначение на рисунке Описание Примечание
MCU Микроконтроллер или одноплатный компьютер Arduino / Raspberry Pi и др.
DHT11 Датчик температуры и влажности Выводы 1Pin, 2Pin и 4Pin задействованы в схеме, один из выводов датчика - 3-ий пин 3Pin - ни к чему не подключается.
DATA Шина данных Если длина соединительного кабеля от датчика к микроконтроллеру не превышает 20 метров, то эту шину рекомендуется подтянуть к питанию резистором 5,1 кОм; если больше 20 метров - то другой подходящий номинал (меньший).
VDD Питание датчика Допустимы напряжения от ~3,0 до ~5,5 вольт постоянного тока; если используется питание ~3,3 В, то желательно использовать питающий провод не длиннее 20 см.

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



Сенсор DHT11 часто продаётся в виде готовой сборки с необходимой обвязкой - подтягивающими резистором и фильтрующим конденсатором (как на предыдущей фотографии). Для экспериментов с Arduino я рекомендую покупать именно такой.

3 Считывание данных с сенсора DHT11 при помощи Arduino

Давайте пойдём таким путём: скачаем библиотеку для датчика DHT11 , установим её стандартным способом (распаковав в директорию \libraries\ среды разработки для Arduino).

Напишем вот такой простенький скетч. Он будет выводить в последовательный порт компьютера каждые 2 секунды сообщения об относительной влажности и температуре, считанные с датчика DHT11.

#include // подключаем библиотеку dht11 sensor; // инициализация экземпляра датчика #define DHT11PIN 8 // вывод 8 будет шиной DATA void setup() { Serial.begin(9600); } void loop() { int chk = sensor.read(DHT11PIN); Serial.print("h="); Serial.print(sensor.humidity); Serial.print("%\t"); Serial.print("t="); Serial.print(sensor.temperature); Serial.println("C"); delay(2000); }

Загрузим этот скетч в Arduino. Подключимся к Arduino с помощью монитора COM-порта и увидим следующее:


Видно, что данные и о влажности, и о температуре считываются и выводятся в терминалку.

4 Временная диаграмма информационного обмена датчика температуры и влажности DHT11 с микроконтроллером

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

Для связи с микроконтроллером датчик температуры и влажности DHT11 использует однопроводный последовательный пакетный интерфейс. Один информационный пакет длительностью около 4 мс содержит: 1 бит запроса от микроконтроллера, 1 бит ответа датчика и 40 битов данных от датчика (16 битов информации о влажности, 16 битов информации о температуре и 8 проверочных битов). Давайте подробнее рассмотрим временную диаграмму информационного обмена Arduino с датчиком DHT11.



Временная диаграмма информационного обмена сенсора DHT11 с микроконтроллером

Из рисунка видно, что есть два типа импульсов: короткие и длинные. Короткие в данном протоколе обмена обозначают нули, длинные импульсы - единицы.

Итак, первые два импульса - это запрос Arduino к DHT11 и, соответственно, ответ датчика. Далее идут 16 бит влажности. Причём они разделены на байты, старший и младший, старший слева. То есть на нашем рисунке данные о влажности такие: 0001000000000000 = 00000000 00010000 = 0x10 = 16% относительной влажности.

Данные о температуре, аналогично: 0001011100000000 = 00000000 00010111 = 0x17 = 23 градуса Цельсия.

Контрольная сумма - это всего-навсего арифметическое суммирование 4-х полученных байтов данных:
00000000 +
00010000 +
00000000 +
00010111 =
00100111 в двоичной системе или 0 + 16 + 0 + 23 = 39 в десятичной.

5 Работа с датчиком DHT11 без библиотеки

Теперь мы знаем достаточно для того чтобы написать собственную программу для работы с сенсором температуры и влажности DHT11 без использования сторонних библиотек. Напишем скетч, который будет опрашивать раз в секунду датчик и выводить в последовательный порт компьютера принятый пакет и данные о температуре, влажности, а также проверочный байт. На 13-ую ножку Arduino выведем контрольный сигнал и, подключившись в ней логическим анализатором, проверим, что мы верно считываем информацию от датчика.

Скетч для работы с DHT11 и Arduino без сторонних библиотек (разворачивается) #define DHT11pin 8 // для подключения шины DATA сенсора DHT11 #define LEDpin 13 // используем для контроля const int NUM_READS = 500; // зависит от частоты кварца и подбирается экспериментально long readsCounter = 0; // счётчик циклов чтения int reads; // сырой массив считанных значений void setup() { Serial.begin(9600); pinMode(DHT11pin, INPUT); pinMode(LEDpin, OUTPUT); } void loop() { if (readsCounter void initLink() { pinMode(DHT11pin, OUTPUT); digitalWrite(DHT11pin, LOW); delay(15); pinMode(DHT11pin, INPUT); } // Читает данные датчика DHT11 и записывает в массив: void readSerialDHT11() { int sensorValue = digitalRead(DHT11pin); reads = sensorValue; digitalWrite(LEDpin, sensorValue); // для проверки выводим на отдельную ножку readsCounter++; } // Обрабатывает массив данных за цикл с DHT11: void processDht11Data() { byte dht11Data = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // обработанный массив (биты пакета) int zeroLen = 1; // минимальная длительность бита "0" int oneLen = 3 * zeroLen; // примерная длительность бита "1" int wrongData = 6 * zeroLen; // допуск по длительности для данных int currentBitLen = 0; // длительность текущего бита int bitPosition = 0; // позиция бита в пакете for (int i=1; i = zeroLen) && (currentBitLen <= oneLen)) { dht11Data = 0; bitPosition++; } else if ((currentBitLen > oneLen) && (currentBitLen <= wrongData)) { dht11Data = 1; bitPosition++; } currentBitLen = 0; } else { if (reads[i] == HIGH) { // при сигнале HIGH currentBitLen += 1; // считаем длительность текущего бита } } } for (int i=0; i void getHumidTemperatureParity(byte data) { word humidity = 0; byte hLow = 0; byte hHi = 0; word temperature = 0; byte tLow = 0; byte tHi = 0; byte parity = 0; for (int i=1; i<9; i++){ //пропускаем первый импульс-подтверждение hLow = hLow | (data[i] << (8 - i)); } for (int i=9; i<17; i++){ hHi = hHi | (data[i] readsCounter = 0; }

Небольшая таблица даст дополнительные разъяснения к предлагаемому решению.

Функция Назначение

В этой инструкции я использую датчик DHT11 в связке с Ардуино Уно, чтобы отобразить текущую температуру и влажность на дисплее размером 16 х 2. Кроме того, я также встроил в девайс три диода, которые отображают показания датчика температуры (холодно, горячо, экстремально).

DHT11 – это цифровые датчики, позволяющие вам получать данные о температуре и влажности. Из-за их низкой цены и небольшого размера, DHT11 идеально подходят для разных самодельных проектов, связанных с электроникой. Некоторые проекты, где используется DHT11, также включают в себя удаленные погодные станции, системы управления домашней обстановкой и системы мониторинга садовых участков.

Спецификация DHT11:

  • Диапазон измерения влажности: 20-90% RH
  • Точность измерения влажности: ±5% RH
  • Диапазон измерения температуры: 0-50 °C
  • Точность измерения температуры: ±2% °C
  • Рабочее напряжение: от 3 до 5.5V

Шаг 1: Вещи, необходимые для проекта

  1. Макетная плата
  2. Дисплей LCD 16 X 2
  3. Провода с джамперами
  4. Плата Arduino UNO и установленный на компьютере Arduino IDE
  5. 3 светодиода (разных цветов)
  6. Небольшая макетная плата (не обязательно)
  7. Датчик температуры и влажности DHT11

Это всё, что вам нужно для начала сборки датчика влажности воздуха и температуры на Ардуино.

Шаг 2: Настраиваем соединение с Ардуино

Соединение компонентов – самая важная часть проекта. Удостоверьтесь, что всё сделали правильно, иначе вы можете уничтожить датчик. Изображение выше и в шаге 3 отображает соединение на макетной плате в чистом виде. Темно-синие провода отвечают за напряжение 5V, черные – заземление.

  1. Дисплей содержит 16 пинов, которые отмечены на обратной стороне модуля разными именами. Удостоверьтесь, что соединяете нужные пины.
  2. Чтобы определить, где какие пины у датчика DHT11, смотрите диаграмму, приложенную выше. Если диаграмма выглядит слишком сложной, то соединяйте устройства по этому списку:
  • GND Ардуино к отрицательному контакту печатной платы (все черные провода соединяются здесь)
  • 5V Ардуино к положительному контакту платы (все тёмно-синие провода соединяются здесь)
  • Положительный пин DHT11 на положительный контакт печатной платы
  • Отрицательный пин к отрицательному контакту
  • Сигнальный пин DHT11 на налоговый пин A0 Arduino (по нему данные с DHT11передаются на Arduino)
  • LCD 1 на отрицательный контакт печатной платы
  • LCD 2 на положительный контакт
  • LCD на отрицательный контакт печатной платы (если вы соедините его с потенциометром, то сможете управлять яркостью дисплея)
  • LCD 4 на цифровой пин 12 Arduino (координаты символов на дисплее)
  • LCD 5 на отрицательный контакт печатной платы
  • LCD 6 на цифровой пин (ЦП) 11 Arduino (команда инициализации LCD)
  • LCD 11 на ЦП 5 Arduino
  • LCD 12 на ЦП 4 Arduino
  • LCD 13 на ЦП 3 Arduino
  • LCD 14 на ЦП 2 Arduino
  • LCD на положительный контакт печатной платы
  • LCD 16 на отрицательный контакт печатной платы
  • Положительный пин холодного/зеленого светодиода на ЦП 7 Arduino (отрицательный пин на отрицательный контакт платы)
  • Положительный пин горячего/желтого светодиода на цифровой пин 8 (отрицательный пин на отрицательный контакт платы)
  • Положительный пин экстремального/красного светодиода на цифровой пин 9 Arduino (отрицательный пин на отрицательный контакт платы)

Если вы всё соединили правильно, то вы выполнили практически половину проекта, так как следующие шаги будут достаточно простыми.

Шаг 3: Что у вас примерно должно получиться




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

Теперь, перед тем, как приступить к шагу с программированием, нам нужно скачать две библиотеки Ардуино для дисплея и датчика DHT11. Мне потребовалось некоторое время, чтобы найти работающую библиотеку для DHT11, так как большинство из них оказались устаревшими. Библиотека дисплея встроена в IDE Ардуино, но я приложу обе библиотеки.

Если вы не знаете, как установить библиотеки Ардуино внутри IDE, то откройте Arduino IDE  Sketch  Include Library  Add Library и выберите файлы.zip.

Файлы

Шаг 4: Скетч (код Ардуино)

Вот код, который вам нужно будет скомпилировать и загрузить на плату Ардуино Уно. Если вы соединили всё правильно и установили две нужные библиотеки, то у вас не должно возникнуть ошибок.

#include #include #include "DHT.h" #define DHTPIN A0 // what pin we"re connected to #define DHTTYPE DHT11 // we are using the DHT11 sensor LiquidCrystal lcd(12, 11, 5, 4, 3, 2); DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); for (int DigitalPin = 7; DigitalPin <= 9; DigitalPin++) { pinMode(DigitalPin, OUTPUT); } lcd.begin(16,2); //16 by 2 character display dht.begin(); } void loop() { delay(1000); // Reading temperature or humidity takes about 250 milliseconds! float h = dht.readHumidity(); float t = dht.readTemperature(); // Read temperature as Celsius (the default) lcd.clear(); lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(t); //printing temperarture to the LCD display lcd.print(""C"); lcd.setCursor(0,1); lcd.print("Humid: "); lcd.print(h); //printing humidity to the LCD display lcd.print("%"); //the 3-led setup process if (t22) { digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(9, LOW); } else if (t>=35) { digitalWrite(9, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); } } Файлы

  • Если температура ниже 22℃, то горит холодный светодиод (зеленый)
  • Если температура между 22 — 35℃, будет светиться горячий светодиод (желтый)
  • Если температура выше 35℃, будет гореть экстремальный светодиод (красный)

Вы можете настроить данные для светодиодов по своему усмотрению.

Я приложил две фотографии с нормальной для нашей местности температурой в 31 ℃ (с горящим желтым светодиодом). Затем я расположил датчик недалеко от кубика льда, чтобы понизить температуру до 22℃ (чтобы загорелся зеленый светодиод).

На приложенном видео вы увидите, как температура меняется с 19 до 24 градусов и соответственно меняется горящий светодиод.

Когда вы уезжаете куда-то далеко на определенный срок времени? Ваши комнатные цветы некому поливать, поэтому приходится просить помощи у ваших соседей, которые, в свою очередь, могут халатно относиться к этому. В результате к вашему приезду растения будут чувствовать себя плохо. Чтобы этого не произошло, можно сделать систему автоматического полива. Для этой цели нам понадобится Arduino и датчик влажности почвы. В статье рассмотрим пример подключения и работы с датчиком FC-28. Он зарекомендовал себя с положительной стороны, с помощью него были созданы тысячи проектов.

О датчике FC-28

Датчиков для определения влажности земли великое множество, но самым популярным является модель FC-28. У него низкая цена, благодаря чему широко используется всеми радиолюбителями в своих проектах. Применяется датчик влажности почвы с Arduino. У него есть два зонда, которые проводят электрический ток через землю. Получается, что если почва влажная, то сопротивление между зондами меньше. При сухой земле, соответственно, сопротивление больше. Arduino принимает эти значения, сравнивает и при необходимости включает, например насос. Датчик способен работать как с цифровым режимом, так и с аналоговым, оба варианта подключения мы рассмотрим. Применяется FC-28 в основном в мелких проектах, например, при автоматическом поливе одного конкретного растения, так как использовать в больших масштабах его неудобно в силу размеров и минусов, которые мы также рассмотрим.

Где купить

Дело в том, что в российских магазинах датчики для работы с Arduino стоят относительно дорого. Средняя цена на этот датчик в России варьируется от 200 до 300 рублей, в то же время как в Aliexpress этот же датчик стоит всего лишь каких-то 30-50. Наценка огромная. Конечно, можно еще сделать датчик для измерения влажности почвы своими руками, но об этом ниже.

О подключении

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

Подключение с помощью цифрового выхода

Подключается практически так же, как и аналоговый:

  • VCC - 5V на Arduino.
  • D0 - D8 на плате на Arduino.
  • GND - земля.

Как уже упоминалось выше, на модуле датчика расположены компаратор и потенциометр. Работает все следующим образом: при помощи потенциометра мы устанавливаем предельное значение нашего датчика. FC-28 сравнивает значение с предельным, и после этого отправляет значение в Arduino. Допустим, значения датчика выше порогового, в таком случае датчик влажности почвы на Arduino передает 5V, если меньше - 0V. Все очень просто, но более точные значения - у аналогового режима, поэтому рекомендуется использовать его.

Электрическая схема подключения выглядит так, как показано на фото выше. образом

Программный код для Arduino при использовании цифрового режима приведен ниже.

Int led_pin =13; int sensor_pin =8; void setup() { pinMode(led_pin, OUTPUT); pinMode(sensor_pin, INPUT); } void loop() { if(digitalRead(sensor_pin) == HIGH){ digitalWrite(led_pin, HIGH); } else { digitalWrite(led_pin, LOW); delay(1000); } }

Что же делает наш код? Первым делом были обозначены две переменные. Первая переменная - led_pin - служит для обозначения светодиода, а вторая - для обозначения датчика влажности земли. Далее мы объявляем контакт светодиода как выход, и контакт датчика как вход. Это нужно для того, чтобы мы могли получить значени, и при необходимости включить светодиод, чтобы визуально увидеть, что значения датчика выше порогового. В цикле мы считываем значения с датчика. Если значение выше предельного - включаем светодиод, если ниже - выключаем. Вместо светодиода может быть и насос, тут все зависит от вас.

Аналоговый режим

Для подключения при помощи аналогового выхода потребуется работать с A0. Емкостной датчик влажности почвы в Arduino принимает значения от 0 до 1023. Подключаем датчик следующим образом:

  • VCC подключаем на 5V к Arduino.
  • GND на датчике подключаем к GND на плате Arduino.
  • A0 подключаем к A0 на Arduino.

Int sensor_pin = A0; int output_value ; void setup() { Serial.begin(9600); Serial.println("Читаем сенсор"); delay(2000); } void loop() { output_value= analogRead(sensor_pin); output_value = map(output_value,550,0,0,100); Serial.print("Влажность "); Serial.print(output_value); Serial.println("%"); delay(1000); }

Итак, что же делает этот программный код? Первым делом были заданы переменные. Первая переменная нужна, чтобы определить контакт датчика, а другая будет хранить результаты, которые мы будем получать при помощи датчика. Далее мы считываем данные. В цикле мы записываем в созданную нами переменную output_value значения с датчика. Затем рассчитывается процент влажности почвы, после чего выводим их на монитор порта. Электрическая схема подключения изображена ниже.

Своими руками

Выше было рассмотрено, как подключить датчик влажности почвы к Arduino. Проблема этих датчиков в том, что они недолговечные. Дело в том, что они очень сильно склонны к коррозии. Некоторые фирмы делают датчики со специальным покрытием, чтобы увеличить срок службы, но это все равно не то. Также рассматривается вариант использования датчика не часто, а только когда требуется. Например, есть программный код, где каждую секунду датчик считывает значения о влажности почвы. Можно продлить срок службы, если включать его, например, один раз в день. Но если и это вам не подходит, то можно сделать своими руками датчик влажности почвы. Arduino разницы не почувствует. В принципе, система такая же. Просто вместо двух сенсоров можно поставить свои и использовать при этом материал, который менее подвержен коррозии. Идеально, конечно, использовать золото, но, учитывая его цену, это выйдет очень дорого. Вообще, дешевле выходит покупать, учитывая цену FC-28.

Плюсы и минусы

В статье были рассмотрены варианты подключения датчика влажности почвы к Arduino, также были представлены примеры программного кода. FC-28 является действительно хорошим датчиком для определения влажности почвы, но какие же конкретные плюсы и минусы этого датчика?

Плюсы:

  • Цена. Этот датчик имеет очень низкую цену, поэтому каждый радиолюбитель сможет купить и соорудить свою систему автоматического полива для растений. Конечно, при работе с большими масштабами этот датчик не подойдет, но он для этого и не предназначен. Если нужен датчик мощнее - SM2802B, то за него и отдать придется немаленькую сумму.
  • Простота. Освоить работу с этим датчиком влажности почвы в Arduino может каждый. Всего несколько проводов, пара строк кода - и все. Контроль влажности почвы сделан.

Минусы:

  • Подверженность коррозии. Это единственный недостаток этих датчиков. Но, учитывая цену, на это и глаза можно закрыть. В первую очередь эти датчики были сделаны скорее для обучения, нежели для практического использования в больших проектах.
Датчик влажности почвы Arduino предназначен для определения влажности земли, в которую он погружен. Он позволяет узнать о недостаточном или избыточном поливе ваших домашних или садовых растений. Подключение данного модуля к контроллеру позволяет автоматизировать процесс полива ваших растений, огорода или плантации (своего рода "умный полив").

Модуль состоит из двух частей: контактного щупа YL-69 и датчика YL-38, в комплекте идут провода для подключения.. Между двумя электродами щупа YL-69 создаётся небольшое напряжение. Если почва сухая, сопротивление велико и ток будет меньше. Если земля влажная - сопротивление меньше, ток - чуть больше. По итоговому аналоговому сигналу можно судить о степени влажности. Щуп YL-69 соединен с датчиком YL-38 по двум проводам. Кроме контактов соединения с щупом, датчик YL-38 имеет четыре контакта для подключения к контроллеру.

  • Vcc – питание датчика;
  • GND – земля;
  • A0 - аналоговое значение;
  • D0 – цифровое значение уровня влажности.
Датчик YL-38 построен на основе компаратора LM393, который выдает напряжение на выход D0 по принципу: влажная почва – низкий логический уровень, сухая почва – высокий логический уровень. Уровень определяется пороговым значением, которое можно регулировать с помощью потенциометра. На вывод A0 подается аналоговое значение, которое можно передавать в контроллер для дальнейшей обработки, анализа и принятия решений. Датчик YL-38 имеет два светодиода, сигнализирующих о наличие поступающего на датчик питания и уровня цифрового сигналы на выходе D0. Наличие цифрового вывода D0 и светодиода уровня D0 позволяет использовать модуль автономно, без подключения к контроллеру.

Технические характеристики модуля

  • Напряжение питания: 3.3-5 В;
  • Ток потребления 35 мА;
  • Выход: цифровой и аналоговый;
  • Размер модуля: 16×30 мм;
  • Размер щупа: 20×60 мм;
  • Общий вес: 7.5 г.

Пример использования

Рассмотрим подключение датчика влажности почвы к Arduino. Создадим проект индикатора уровня влажности почвы для комнатного растения (ваш любимый цветок, который вы иногда забываете поливать). Для индикации уровня влажности почвы будем использовать 8 светодиодов. Для проекта нам понадобятся следующие детали:
  • Плата Arduino Uno
  • Датчик влажности почвы
  • 8 светодиодов
  • Макетная плата
  • Соединительные провода.
Соберем схему, показанную на рисунке ниже


Запустим Arduino IDE. Создадим новый скетч и внесем в него следующие строчки: // Датчик влажности почвы // http://сайт // контакт подключения аналогового выхода датчика int aPin=A0; // контакты подключения светодиодов индикации int ledPins={4,5,6,7,8,9,10,11}; // переменная для сохранения значения датчика int avalue=0; // переменная количества светящихся светодиодов int countled=8; // значение полного полива int minvalue=220; // значение критической сухости int maxvalue=600; void setup() { // инициализация последовательного порта Serial.begin(9600); // настройка выводов индикации светодиодов // в режим OUTPUT for(int i=0;i<8;i++) { pinMode(ledPins[i],OUTPUT); } } void loop() { // получение значения с аналогового вывода датчика avalue=analogRead(aPin); // вывод значения в монитор последовательного порта Arduino Serial.print("avalue=");Serial.println(avalue); // масштабируем значение на 8 светодиодов countled=map(avalue,maxvalue,minvalue,0,7); // индикация уровня влажности for(int i=0;i<8;i++) { if(i<=countled) digitalWrite(ledPins[i],HIGH); //зажигаем светодиод else digitalWrite(ledPins[i],LOW); // гасим светодиод } // пауза перед следующим получением значения 1000 мс delay(1000); } Аналоговый вывод датчика подключен к аналоговому входу Arduino, который представляет собой аналого-цифровой преобразователь (АЦП) с разрешением 10 бит, что позволяет на выходе получать значения от 0 до 1023. Значение переменных для полного полива (minvalue) и сильной сухости почвы (maxvalue) получим экспериментально. Большей сухости почвы соответствует большее значение аналогового сигнала. С помощью функции map масштабируем аналоговое значение датчика в значение нашего светодиодного индикатора. Чем больше влажность почвы, тем больше значение светодиодного индикатора (количество зажженных светодиодов). Подключив данный индикатор к цветку, мы издали можем видеть на индикаторе степень влажности и при определять необходимость полива.

Часто задаваемые вопросы FAQ

1. Не горит светодиод питания
  • Проверьте наличие и полярность подаваемого на датчик YL-38 питания (3,3 – 5 В).
2. При поливе почвы не загорается светодиод индикации влажности почвы
  • Настройте потенциометром порог срабатывания. Проверьте соединение датчика YL-38 с щупом YL-69.
3. При поливе почвы не изменяется значение выходного аналогового сигнала
  • Проверьте соединение датчика YL-38 с щупом YL-69.
  • Проверьте наличие щупа в земле.

Новые статьи

● 4.3. Подключаем датчик влажности почвы

Домашний уют — это атмосфера тепла в вашей квартире, желание возвращаться туда после трудного дня. Уют и комфорт в вашем доме оказывают непосредственное влияние на ваше самочувствие и настроение. Необходимое условие в создании уюта имеет использование комнатных цветов. Они доступны каждому из нас и при этом лучше любой мебели помогут создать уют и комфорт, и как ни что другое просто вдохнуть в ваш дом чистую энергию.
Но чтобы домашние цветы радовали вас красотой, следует выполнять общие правила по уходу за комнатными растениями - необходимо создать благоприятный для них режим температуры воздуха, влажности и освещения.
Модуль влажности почвы (рис. 4.12) предназначен для определения влажности земли, в которую он погружен. Он позволяет узнать о недостаточном или избыточном поливе ваших домашних или садовых растений. Модуль состоит из двух частей: контактного щупа YL-28 и датчика YL-38, щуп YL-28 соединен с датчиком YL-38 по двум проводам. Между двумя электродами щупа YL-28 создаётся небольшое напряжение. Если почва сухая, сопротивление велико и ток будет меньше. Если земля влажная — сопротивление меньше, ток — чуть больше. По итоговому аналоговому сигналу можно судить о степени влажности.
Подключение данного модуля к контроллеру позволяет автоматизировать процесс полива ваших растений (своего рода "умный полив").

Рис. 4.12. Датчик увлажненности почвы Soil Moisture

Кроме контактов соединения с щупом, датчик YL-38 имеет четыре контакта для подключения к контроллеру.

Vcc - питание датчика;
. GND - земля;
. A0 - аналоговое значение;
. D0 - цифровое значение уровня влажности.

Датчик YL-38 построен на основе компаратора LM393, который выдает напряжение на выход D0 по принципу: влажная почва - низкий логический уровень, сухая почва - высокий логический уровень. Уровень определяется пороговым значением, которое можно регулировать с помощью потенциометра. На вывод A0 подается аналоговое значение, которое можно передавать в контроллер для дальнейшей обработки, анализа и принятия решений.
Датчик YL-38 имеет два светодиода, сигнализирующих о наличие поступающего на датчик питания и уровня цифрового сигналы на выходе D0. Наличие цифрового вывода D0 и светодиода уровня D0 позволяет использовать модуль автономно, без подключения к контроллеру.
Рассмотрим подключение датчика увлажненности почвы Soil Moisture к плате Arduino Mega и модулю NodeMcu ESP8266.

4.3.1. Подключение датчика Soil Moisture к плате Arduino Mega

Подключение датчика Soil Moisture к плате Arduino Mega мы будем производить по аналоговому входу. Питание для датчика берем также с платы Arduino. Схема соединений представлена на рис. 4.13.

Рис. 4.13. Схема подключений датчика Soil Moisture к Arduino Mega

Загрузим на плату Arduino Mega скетч получения данных с датчика температуры DS18B20 и вывода в последовательный порт Arduino. Получение данных влажности оформим в виде отдельной процедуры get_data_soilmoisture(). Содержимое скетча представлено в листинге 4.5.
Листинг 4.5

#// интервала измерений, мс #define SOILMOISTUREPIN A8 // пин подключения контакта A0 // значение полного полива # # void setup (void ) { Serial.begin(9600 ); } void loop (void ) { if (millis()-millis_int1 >= INTERVAL_GET_DATA) { Serial.print("soilmoisture =" );Serial.println(moisture); Serial.println(" %" ); // старт интервала отсчета millis_int1=millis(); } } { int avalue=analogRead(SOILMOISTUREPIN);

Загрузим скетч на плату Arduino Mega, откроем монитор последовательного порта и видим вывод данных, получаемых с датчика Soil Moisture (рис. 4.14). Подберите практическим путем аналоговые значения для констант MINVALUESOILMOISTURE (полный полив) и MINVALUESOILMOISTURE (критическая сухость).

Рис. 4.14. Вывод данных с датчика Soil Moisture в монитор последовательного порта

Скачать данный скетч можно на сайте www..

4.3.2. Расширение аналоговых входов - мультиплексор CD4051

Модуль Node Mcu имеет один канал АЦП доступный для пользователей. Однако нам понадобится их гораздо больше. Как увеличить количество аналоговых входов? Для этого будем использовать мультиплексор CD4051 (см. рис. 4.15).


Рис. 4.15. Мультиплексор CD4051

Микросхема 4051 является 8-канальным аналоговым мультиплексор/ демультиплексором, имеющим 8 входов (y0 - y7) и 1 выход Z (см. рис. 4.16). Выбор считываемого входа осуществляется подачей цифровых сигналов на выходы s0 - s2. Т.е. для подключения к модулю Node Mcu 8 аналоговых датчиков необходимо задействовать 3 цифровых выхода модуля и 1 аналоговый вход.

Рис. 4.16. Контакты мультиплексора CD4051

И в листинге 4.6. представлен скетч циклического опроса 8 аналоговых датчиков, подключенных к 8 входам мультиплексора и через вход Z к аналоговому входу A0 модуля Node Mcu.
Листинг 4.6

// список пинов для подключения к s0, s1, s2 мультиплексора // D5, D7, D8 (GPIO 14, 13, 15) int pins={14 , 13 , 15 }; // Массив двоичных числ определяющих номер выбранного входа/выхода // микросхемы 4051, с 1 по 8. int bin = { B000, B001, B010, B011, B100, B101, B110, B111 } ; // служебные переменные int row; int r0 = 0 ; int r1 = 0 ; int r2 = 0 ; int avalue =0 ; void setup (void ) { // входы подключения к мультиплексору как OUTPUT for (int i=0 ;i<3 ;i++) { pinMode(pins[i],OUTPUT); } // запуск последовательного порта Serial.begin(9600 ); } void loop (void ) { for (int i=0 ;i<8 ;i++) { // выбор входа мультиплексора row = bin [i] ; r0 = row & 0x01 ; r1 = (row >> 1 ) & 0x01 ; // r2 = (row >> 2 ) & 0x01 ; // digitalWrite (pins[i], r0) ; digitalWrite (pins[i], r1) ; digitalWrite (pins[i], r2) ; // получение данных c A0 avalue= analogRead(A0); // вывод в монитор последовательного порта Serial.print("analog input =" );Serial.print(i); Serial.println(" = " ); Serial.println(avalue); } // пауза delay(2000 ); }

4.3.3. Подключение датчика Soil Moisture к модулю NodeMcu ESP8266

Теперь рассмотрим подключение датчика Soil Moisture к модулю NodeMcu ESP8266. Датчик Soil Moisture подключаем к входу y0 мультиплексора. Для выбора аналогового входа мультиплексора используем контакты D5, D7, D8 модуля Node Mcu. Схема соединений представлена на рис. 4.17.

Рис. 4.17. Схема подключений датчика Soil Moisture к NodeMcu ESP8266

Загрузим на модуль Node Mcu скетч получения данных с датчика Soil Moisture и вывода в последовательный порт Arduino. Получение данных влажности оформим в виде отдельной процедуры get_data_soilmoisture(). Для выбора аналогового входа мультиплексора y0 подаем на контакты D5, D7, D8 сигнал низкого уровня LOW. Содержимое скетча представлено в листинге 4.7.
Листинг 4.7

#define INTERVAL_GET_DATA 2000 // интервала измерений, мс #define SOILMOISTUREPIN A0 // аналоговый вход // значение полного полива #define MINVALUESOILMOISTURE 220 // значение критической сухости #define MAXVALUESOILMOISTURE 900 // переменная для интервала измерений unsigned long millis_int1=0 ; void setup (void ) { // входы подключения к мультиплексору D5, D7, D8 (GPIO 14, 13, 15) // как OUTPUT pinMode(14 ,OUTPUT); pinMode(13 ,OUTPUT); pinMode(15 ,OUTPUT); // запуск последовательного порта Serial.begin(9600 ); } void loop (void ) { if (millis()-millis_int1 >= INTERVAL_GET_DATA) { // получение данных c датчика SoilMoisture float moisture= get_data_soilmoisture(); // вывод в монитор последовательного порта Serial.print("soilmoisture =" );Serial.print(moisture); Serial.println(" %" ); // старт интервала отсчета millis_int1=millis(); } } // получение данных с датчика SoilMoisture float get_data_soilmoisture () { // выбор входа мультиплексора CD4051 - y0 (000) digitalWrite(14 ,LOW); digitalWrite(13 ,LOW); digitalWrite(15 ,LOW); // получение значения с аналогового вывода датчика int avalue=analogRead(SOILMOISTUREPIN); Serial.print("avalue =" );Serial.println(avalue); // масштабируем значение в проценты avalue=constrain(avalue, MINVALUESOILMOISTURE,MAXVALUESOILMOISTURE); int moisture=map (avalue, MINVALUESOILMOISTURE, MAXVALUESOILMOISTURE,100 ,0 ); return (float )moisture; }

Загрузим скетч на модуль Node Mcu, откроем монитор последовательного порта и видим вывод данных, получаемых с датчика Soil Moisture (рис. 4.18). Подберите практическим путем аналоговые значения для констант MINVALUESOILMOISTURE (полный полив) и MINVALUESOILMOISTURE (критическая сухость).

Рис. 4.18. Вывод данных Soil Moisture в монитор последовательного порта

 

Возможно, будет полезно почитать: