Датчики влажности почвы: различия между версиями

Материал из MIK32 микроконтроллер
мНет описания правки
Нет описания правки
Строка 65: Строка 65:
* Соединительные провода.
* Соединительные провода.


<pre class=" line-numbers match-braces language-cpp"><code class=" language-cpp"><span class="token comment">// Скетч к обзору датчика</span>
// контакт подключения аналогового выхода датчика
<span class="token comment">//  влажности почвы</span>
int aPin=A0;
<span class="token comment">// http://</span>
// контакты подключения светодоодов индикации
<span class="token comment">// Петин В., 2015</span>
int ledPins[8]={4,5,6,7,8,9,10,11};
// переменная для сохранения значения датчика
int avalue=0;
// переменная количества светящихся светодиодов
int countled=8;
// значение полного полива
int minvalue=220;
// значение критической сухости
int maxvalue=600;


<span class="token comment">// контакт подключения аналогового выхода датчика</span>
void setup()
<span class="token keyword">int</span> aPin<span class="token operator">=</span>A0<span class="token punctuation">;</span>
  {
<span class="token comment">// контакты  подключения светодоодов индикации</span>
  // инициализация последовательного порта
<span class="token keyword">int</span> ledPins<span class="token punctuation brace-square brace-open brace-level-1" id="pair-14-close">[</span><span class="token number">8</span><span class="token punctuation brace-square brace-close brace-level-1" id="pair-14-open">]</span><span class="token operator">=</span><span class="token punctuation brace-curly brace-open brace-level-1" id="pair-18-close">{</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">11</span><span class="token punctuation brace-curly brace-close brace-level-1" id="pair-18-open">}</span><span class="token punctuation">;</span>
  Serial.begin(9600);
<span class="token comment">// переменная для сохранения значения датчика</span>
  // настройка выводов индикации светодиодов
<span class="token keyword">int</span> avalue<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
  // в режим OUTPUT
<span class="token comment">// переменная количества светящихся светодиодов</span>
  for(int i=0;i<8;i++)
<span class="token keyword">int</span> countled<span class="token operator">=</span><span class="token number">8</span><span class="token punctuation">;</span>
    {
<span class="token comment">// значение полного полива</span>
    pinMode(ledPins[i],OUTPUT);
<span class="token keyword">int</span> minvalue<span class="token operator">=</span><span class="token number">220</span><span class="token punctuation">;</span>
    }
<span class="token comment">// значение критической сухости</span>
  }
<span class="token keyword">int</span> maxvalue<span class="token operator">=</span><span class="token number">600</span><span class="token punctuation">;</span>


<span class="token keyword">void</span> <span class="token function">setup</span><span class="token punctuation brace-round brace-open brace-level-1" id="pair-0-close">(</span><span class="token punctuation brace-round brace-close brace-level-1" id="pair-0-open">)</span>
void loop()
  <span class="token punctuation brace-curly brace-open brace-level-1" id="pair-20-close">{</span>
   {
  <span class="token comment">// инициализация последовательного порта</span>
   // получение значения с аналогового вывода датчика
  Serial<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation brace-round brace-open brace-level-2" id="pair-1-close">(</span><span class="token number">9600</span><span class="token punctuation brace-round brace-close brace-level-2" id="pair-1-open">)</span><span class="token punctuation">;</span>
   avalue=analogRead(aPin);
  <span class="token comment">// настройка выводов индикации светодиодов</span>
   // вывод значения в монитор последовательного порта Arduino
  <span class="token comment">// в режим OUTPUT</span>
   Serial.print("avalue=");Serial.println(avalue);
  <span class="token keyword">for</span><span class="token punctuation brace-round brace-open brace-level-2" id="pair-2-close">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">&lt;</span><span class="token number">8</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation brace-round brace-close brace-level-2" id="pair-2-open">)</span>
   // масштабируем значение на 8 светодиодов
    <span class="token punctuation brace-curly brace-open brace-level-2" id="pair-19-close">{</span>
   countled=map(avalue,maxvalue,minvalue,0,7);
    <span class="token function">pinMode</span><span class="token punctuation brace-round brace-open brace-level-3" id="pair-3-close">(</span>ledPins<span class="token punctuation brace-square brace-open brace-level-4" id="pair-15-close">[</span>i<span class="token punctuation brace-square brace-close brace-level-4" id="pair-15-open">]</span><span class="token punctuation">,</span>OUTPUT<span class="token punctuation brace-round brace-close brace-level-3" id="pair-3-open">)</span><span class="token punctuation">;</span>
   // индикация уровня влажности
    <span class="token punctuation brace-curly brace-close brace-level-2" id="pair-19-open">}</span>
   for(int i=0;i<8;i++)
  <span class="token punctuation brace-curly brace-close brace-level-1" id="pair-20-open">}</span>
     {
 
     if(i<=countled)
<span class="token keyword">void</span> <span class="token function">loop</span><span class="token punctuation brace-round brace-open brace-level-1" id="pair-4-close">(</span><span class="token punctuation brace-round brace-close brace-level-1" id="pair-4-open">)</span>
       digitalWrite(ledPins[i],HIGH); //зажигаем светодиод
   <span class="token punctuation brace-curly brace-open brace-level-1" id="pair-22-close">{</span>
     else
   <span class="token comment">// получение значения с аналогового вывода датчика</span>
       digitalWrite(ledPins[i],LOW);  // гасим светодиод
   avalue<span class="token operator">=</span><span class="token function">analogRead</span><span class="token punctuation brace-round brace-open brace-level-2" id="pair-5-close">(</span>aPin<span class="token punctuation brace-round brace-close brace-level-2" id="pair-5-open">)</span><span class="token punctuation">;</span>
     }
   <span class="token comment">// вывод значения в монитор последовательного порта Arduino</span>
   // пауза перед следующим получением значения 1000 мс
   Serial<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation brace-round brace-open brace-level-2" id="pair-6-close">(</span><span class="token string">"avalue="</span><span class="token punctuation brace-round brace-close brace-level-2" id="pair-6-open">)</span><span class="token punctuation">;</span>Serial<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation brace-round brace-open brace-level-2" id="pair-7-close">(</span>avalue<span class="token punctuation brace-round brace-close brace-level-2" id="pair-7-open">)</span><span class="token punctuation">;</span>
   delay(1000);
   <span class="token comment">// масштабируем значение на 8 светодиодов</span>
}
   countled<span class="token operator">=</span><span class="token function">map</span><span class="token punctuation brace-round brace-open brace-level-2" id="pair-8-close">(</span>avalue<span class="token punctuation">,</span>maxvalue<span class="token punctuation">,</span>minvalue<span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation brace-round brace-close brace-level-2" id="pair-8-open">)</span><span class="token punctuation">;</span>
   <span class="token comment">// индикация уровня влажности</span>
   <span class="token keyword">for</span><span class="token punctuation brace-round brace-open brace-level-2" id="pair-9-close">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">&lt;</span><span class="token number">8</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation brace-round brace-close brace-level-2" id="pair-9-open">)</span>
     <span class="token punctuation brace-curly brace-open brace-level-2" id="pair-21-close">{</span>
     <span class="token keyword">if</span><span class="token punctuation brace-round brace-open brace-level-3" id="pair-10-close">(</span>i<span class="token operator">&lt;=</span>countled<span class="token punctuation brace-round brace-close brace-level-3" id="pair-10-open">)</span>
       <span class="token function">digitalWrite</span><span class="token punctuation brace-round brace-open brace-level-3" id="pair-11-close">(</span>ledPins<span class="token punctuation brace-square brace-open brace-level-4" id="pair-16-close">[</span>i<span class="token punctuation brace-square brace-close brace-level-4" id="pair-16-open">]</span><span class="token punctuation">,</span>HIGH<span class="token punctuation brace-round brace-close brace-level-3" id="pair-11-open">)</span><span class="token punctuation">;</span> <span class="token comment">//зажигаем светодиод</span>
     <span class="token keyword">else</span>
       <span class="token function">digitalWrite</span><span class="token punctuation brace-round brace-open brace-level-3" id="pair-12-close">(</span>ledPins<span class="token punctuation brace-square brace-open brace-level-4" id="pair-17-close">[</span>i<span class="token punctuation brace-square brace-close brace-level-4" id="pair-17-open">]</span><span class="token punctuation">,</span>LOW<span class="token punctuation brace-round brace-close brace-level-3" id="pair-12-open">)</span><span class="token punctuation">;</span> <span class="token comment">// гасим светодиод</span>
     <span class="token punctuation brace-curly brace-close brace-level-2" id="pair-21-open">}</span>
   <span class="token comment">// пауза перед следующим получением значения 1000 мс</span>
   <span class="token function">delay</span><span class="token punctuation brace-round brace-open brace-level-2" id="pair-13-close">(</span><span class="token number">1000</span><span class="token punctuation brace-round brace-close brace-level-2" id="pair-13-open">)</span><span class="token punctuation">;</span>
<span class="token punctuation brace-curly brace-close brace-level-1" id="pair-22-open">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>


Аналоговый вывод датчика подключен к аналоговому входу Arduino, который представляет собой аналого-цифровой преобразователь (АЦП) с разрешением 10 бит, что позволяет на выходе получать значения от 0 до 1023. Значение переменных для полного полива (minvalue) и сильной сухости почвы (maxvalue) получим экспериментально. Большей сухости почвы соответствует большее значение аналогового сигнала. С помощью функции map масштабируем аналоговое значение датчика в значение нашего светодиодного индикатора. Чем больше влажность почвы, тем больше значение светодиодного индикатора (количество зажженных светодиодов). Подключив данный индикатор к цветку, мы издали можем видеть на индикаторе степень влажности и определять необходимость полива.
Аналоговый вывод датчика подключен к аналоговому входу Arduino, который представляет собой аналого-цифровой преобразователь (АЦП) с разрешением 10 бит, что позволяет на выходе получать значения от 0 до 1023. Значение переменных для полного полива (minvalue) и сильной сухости почвы (maxvalue) получим экспериментально. Большей сухости почвы соответствует большее значение аналогового сигнала. С помощью функции map масштабируем аналоговое значение датчика в значение нашего светодиодного индикатора. Чем больше влажность почвы, тем больше значение светодиодного индикатора (количество зажженных светодиодов). Подключив данный индикатор к цветку, мы издали можем видеть на индикаторе степень влажности и определять необходимость полива.

Версия от 13:47, 28 мая 2021

Внешний вид датчика влажности почвы

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

Модуль состоит из двух частей:

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

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

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

Принцип работы

Ёмкостный датчик выполнен в виде штыря, которым погружается в грунт на расстояние до 80 мм. На штыре в виде дорожек расположены два электрода.

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

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

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

Элементы платы (емкостного датчика влажности почвы)

Элементы платы емкостного датчика
Элементы платы емкостного датчика

Измерительные электроды

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

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

Генератор импульсов

Микросхема LCM555 используется для генерации импульсов высокой частоты для работы измерительной схемы сенсора.

Операционный усилитель MCP6002

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

Регулятор напряжения 3V3

Линейный понижающий регулятор напряжения TPS73033DBVR обеспечивает питание микросхемы 555 и других компонентов сенсора. Диапазон входного напряжения от 3,3 до 5 вольт. Выходное напряжение 3,3 В с максимальным выходным током 200 мА.

Troyka-контакты

Датчик подключается к управляющей электронике через три провода.

  • Сигнальный (S) — выходной сигнал сенсора. Напряжение на выходе датчика прямо пропорционально уровню измеренной электропроводности: чем выше влажность почвы, тем выше уровень сигнала на выходе датчика и соответственно наоборот. Максимальное выходное значения 3,3 вольта. Подключите к аналоговому пину микроконтроллера.
  • Питание (V) — соедините с рабочим напряжением микроконтроллера.
  • Земля (G) — соедините с землёй микроконтроллера.

Принципиальная и монтажная схемы

Схема емкостного датчика

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

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

  • Плата Arduino Uno
  • Датчик влажности почвы
  • 8 светодиодов
  • Макетная плата
  • Соединительные провода.

// контакт подключения аналогового выхода датчика int aPin=A0; // контакты подключения светодоодов индикации int ledPins[8]={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 масштабируем аналоговое значение датчика в значение нашего светодиодного индикатора. Чем больше влажность почвы, тем больше значение светодиодного индикатора (количество зажженных светодиодов). Подключив данный индикатор к цветку, мы издали можем видеть на индикаторе степень влажности и определять необходимость полива.