В
интернет-магазинах за небольшую цену можно приобрести датчик влажности почвы,
принцип действия которого основан на измерении сопротивления. Он же резистивный датчик. Чем больше
влажность почвы – тем меньше сопротивление, всё просто.
Я тоже купил один такой датчик , но у
него есть несколько недостатков:
- Маленький размер. Для цветочного горшка, может, и подойдёт, но для измерения влажности в открытом грунте – вряд ли. Ведь он позволит оценить влажность только нескольких сантиметров грунта. Что, если после засухи прошёл кратковременный сильный дождь? Почва вверху (там, где датчик) будет влажная, а внизу – сухая.
- Электроды, помещённые в мокрый грунт, при постоянном напряжении на них, должны подвергаться коррозии. Это со временем приведёт к неисправности датчика.
Учитывая эти
недостатки, я решил сделать ёмкостный датчик влажности. Представляет собой
простой плоский конденсатор, сделанный из двустороннего фольгированного
текстолита по лазерно-утюжной технологии.
Рабочий элемент ёмкостного датчика влажности почвы
Принцип его
работы заключается в том, что ёмкость конденсатора в значительной мере зависит
от того, какое вещество находится между его пластинами. "Между" - это если пластины расположены параллельно. Но в данном случае положительные и отрицательные пластины расположены в одной плоскости в виде двух "гребёнок" - так что диэлектриком будет выступать то, что находится рядом с ними.
Формула ёмкости плоского конденсатора
У всех веществ
разная диэлектрическая проницаемость. У
воздуха она равна почти единице, а у воды – аж 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 детали, засунуть её в герметичную коробку - и можно подключать датчик к системе автополива. Но об этом - в другой раз!
Комментариев нет :
Отправить комментарий