пятница, 26 июня 2015 г.

Ёмкостный датчик влажности почвы своими руками

Есть у меня на даче самодельная система автоматического полива на базе Arduino Leonardo. Работает вполне прилично - но всегда ведь хочется что-то усовершенствовать. Вот я и подумал - а зачем она будет работать, если земля и так мокрая - после дождя, к примеру? И решил приделать к системе автополива ещё и датчик влажности почвы.

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



Я тоже купил один такой датчик , но у него есть несколько недостатков:
  •  Маленький размер. Для цветочного горшка, может, и подойдёт, но для измерения влажности в открытом грунте – вряд ли. Ведь он позволит оценить влажность только нескольких сантиметров грунта. Что, если после засухи прошёл кратковременный сильный дождь? Почва вверху (там, где датчик) будет влажная, а внизу – сухая.
  •  Электроды, помещённые в мокрый грунт, при постоянном напряжении на них, должны подвергаться коррозии. Это со временем приведёт к неисправности датчика.

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

Рабочий элемент ёмкостного датчика влажности почвы


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

Формула ёмкости плоского конденсатора        

У всех веществ разная диэлектрическая проницаемость.  У воздуха она равна почти единице, а у воды – аж 81!  И ёмкость датчика, теоретически, может меняться в 80 раз при помещении его из воздуха в воду.
Но измерять ёмкость – задача неблагодарная. Для микроконтроллера (на базе которого я и сделал ранее свою систему автополива) проще измерить частоту. Поэтому была сварганена простейшая схема генератора частоты (осциллятора) на основе микросхемы SN74HC00. Это – 4 логических элемента «2И-НЕ», или NAND. Кроме микросхемы, для генератора частоты нужен только два резистора, и один конденсатор – в роли которого и выступает датчик влажности.

Осциллятор на SN74HC00

Я не был уверен в том, что эта схема будет работать идеально, поэтому сделал ещё один осциллятор - на базе стандартного таймера NE555. Он тоже не отличается особой сложностью.

Осциллятор на NE555

Выход осциллятора (или одного, или другого) соединяется с 2-м пином Arduino (digital pin 2). Это, конечно, если для измерения частоты использовать ту программу, что я написал. Потому как там используется внешнее прерывание (interrupt 0), которое привязано именно к pin 2.

Чтобы как-то видеть полученные результаты, присоединил к Ардуино экранчик от Nokia 3110. В программе в комментариях написано, какие пины Ардуино соединять с какими портами LCD.

Вот, собственно, сама программа:


#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#define  buffer 20
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
//Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
Adafruit_PCD8544 display = Adafruit_PCD8544(12, 11, 10, 9, 8);
volatile float freq=0.0;
volatile float frqarr[buffer];
volatile uint8_t farrptr=0;
volatile float avgfreq;
volatile unsigned long pulseDuration;
volatile unsigned long lastpulse;
float tmp;
const int analogInPin = A0;
int  AnalogSensorValue = 0;
  
void setup()   {
  pinMode(2, INPUT);
  display.begin();
  display.setContrast(50);
  display.setTextSize(2);
  display.setTextColor(BLACK);
  attachInterrupt(0, _spdint, RISING);
  pulseDuration=0;
 }
  
void loop() {
 tmp=0;
  for(uint16_t i=0; i<buffer-1; i++){
    tmp+=frqarr[i];
  }
  avgfreq=tmp/buffer;
  
  if((micros() - lastpulse)>1000000) pulseDuration=0;
freq =  1000000.0/pulseDuration;
AnalogSensorValue=analogRead(analogInPin);

display.clearDisplay();   
  display.setCursor(0,0);  
  display.setTextSize(2);
  if(pulseDuration>0){
  display.print((int)freq);
  display.print(" Hz");}
  else display.print("No signal");
  display.setCursor(0,20);
  display.print((int)avgfreq); //average frequency of last 20 cycles
  display.print(" Hz");
  display.setCursor(0,40);
  display.setTextSize(1);
  display.print("Analog: ");
  display.print(AnalogSensorValue);
  display.display();
  delay(200);
}

void _spdint()
{
  unsigned long time = micros();
  pulseDuration = time - lastpulse;
  lastpulse=time;
  frqarr[farrptr]=1000000.0/pulseDuration;
  farrptr++;
  if(farrptr>=buffer) farrptr=0;
}

Насыпал в горшок сухой земли, взвесил, закопал в неё датчик влажности и начал мелкими порциями (по 2% от веса земли) добавлять воду, после каждого раза замеряя частоту. То же проделал для купленного аналогового датчика.(он был подключен к 0-му аналоговому входу Ардуино).

Процесс можно посмотреть на видео:


Результаты порадовали! 


Для более простого их восприятия - сделал в Экселе график:

Хорошо видно, что после того, как в землю было влито 12% воды, показания резистивного датчика  уже не менялись. А вот ёмкостный датчик менял частоту генерации практически до конца!
Чтобы это получше разглядеть - вот график с 12% до полного насыщения почвы водой:

Да, не зря Эксель выбрал для резистивного датчика коричневый цвет, не зря...

Теперь осталось только развести плату осциллятора, впаять 3 детали, засунуть её в герметичную коробку - и можно подключать датчик к системе автополива. Но об этом - в другой раз!

Комментариев нет :

Отправить комментарий