Помогите добиться точности считывания показаний с датчика влажности почвы YL-38.

k60
Offline
Зарегистрирован: 30.03.2018

Всем привет! Пытаюсь приладить датчик влажности почвы YL-38 (вот такой https://ru.aliexpress.com/item/Free-shipping-soil-the-hygrometer-detection-module-robot-intelligent-car-soil-moisture-sensor-for-arduino/32345244850.html?spm=a2g0s.9042311.0.0.etxnxS)

Чтобы он под действием электролиза быстро не сгнил в агрессивной среде, нужно кратковременно подать на него напряжение, замерить величину влажности почвы, загрузить полученные данные в переменную, вывести переменную в Serial и отключить питание датчика. Все это должно происходить раз в несколько часов (пока что - раз в пять секунд, для тестирования).

Пишем такой скетч:

const uint8_t  pinSensorVZ = A1; // Константа с указанием номера аналогового входа, к которому подключен датчик влажности почвы
const uint8_t  pinVcc      = A2; // Константа с указанием номера вывода, от которого запитан датчик (вывод Vcc)
const uint8_t  pinGND      = A3; // Константа с указанием номера вывода, от которого запитан датчик (вывод GND)

int vlazZEMLI = 0; // Переменная влажности земли

#define interval 5000UL // Интервал между замерами
static unsigned long previousMillis = 0; // Храним время последнего замера

void setup() {
  pinMode     (pinVcc,    OUTPUT); // Переводим вывод pinVcc в режим выхода
  pinMode     (pinGND,    OUTPUT); // Переводим вывод pinGND в режим выхода
  digitalWrite(pinVcc,    LOW   ); // Подаем уровень логического 0 на вывод Vcc датчика
  digitalWrite(pinGND,    LOW   ); // Подаем уровень логического 0 на вывод GND датчика
  Serial.begin(9600); //Запускаем Serial
}

void loop() {
  if (millis() - previousMillis >= interval) { // Если прошел интервал, замеряем значение влажности почвы
    digitalWrite(pinVcc, HIGH); // Включаем датчик влажности почвы
    previousMillis = millis(); // Сбрасываем счетчик
    vlazZEMLI = analogRead(pinSensorVZ); // Считываем влажность земли и загружаем в переменную
    Serial.println(vlazZEMLI); // Выводим показания влажности в Serial
    digitalWrite(pinVcc, LOW); // Выключаем датчик влажности почвы
  }
}

После запуска получаем недостоверные данные: что при полностью политой, что при сухой земле получаем значение около 55!

Но, если держать датчик под напряжением всегда, а замеры производить через некоторое время, получаем достоверные данные: политая земля - около 250, сухая - около 1000!

const uint8_t  pinSensorVZ = A1; // Константа с указанием номера аналогового входа, к которому подключен датчик влажности почвы
const uint8_t  pinVcc      = A2; // Константа с указанием номера вывода, от которого запитан датчик (вывод Vcc)
const uint8_t  pinGND      = A3; // Константа с указанием номера вывода, от которого запитан датчик (вывод GND)

int vlazZEMLI = 0; // Переменная влажности земли

#define interval 5000UL // Интервал между замерами
static unsigned long previousMillis = 0; // Храним время последнего замера

void setup() {
  pinMode     (pinVcc,    OUTPUT); // Переводим вывод pinVcc в режим выхода
  pinMode     (pinGND,    OUTPUT); // Переводим вывод pinGND в режим выхода
  digitalWrite(pinVcc,    HIGH   ); // Подаем уровень логического 1 на вывод Vcc датчика
  digitalWrite(pinGND,    LOW   ); // Подаем уровень логического 0 на вывод GND датчика
  Serial.begin(9600); //Запускаем Serial
}

void loop() {
  if (millis() - previousMillis >= interval) { // Если прошел интервал, замеряем значение влажности почвы
    previousMillis = millis(); // Сбрасываем счетчик
    vlazZEMLI = analogRead(pinSensorVZ); // Считываем влажность земли и загружаем в переменную
    Serial.println(vlazZEMLI);             // Выводим показания влажности в Serial
    }
}

Подскажите, пожалуйста, как решить проблему?!

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Использовать другой датчик - под действием напряжения он вступат в хим реакцию и в зависимости от влажности скорость протекания реакции различная - вот эти показания вы и получате. Поэтому при кратковременных замерах - значение одинаковое - реакция не развила скорость. Будет гнить - без этого никак. Можно попробовать 2 стержня из меди и чего нибудь.

можно поробовать и такой датчик https://ru.aliexpress.com/item/-/32832538686.html 

k60
Offline
Зарегистрирован: 30.03.2018

NeiroN пишет:

...можно поробовать и такой датчик https://ru.aliexpress.com/item/-/32832538686.html 

А Вы лично посоветованный датчик юзали? Он точно поможет решить проблему? 

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Может стоит попробовать подавать напряжение в течении ограниченного времени. Скажем опроса каждые 10 минут. А на датчик подать питание в течении 30 сек и замерить в конце 29-30 сек. Потом отключаем питание - профит. Пока 30 сек пройдет все дожно устаканится. В схеме использовать аналоговый выход с подяжкой на землю 10 кОм.
А по ссылке выше судя по всему емкостный изолированный датчик и его можно постоянно питать в отличии от вашего где по ходу используется электропроводимость между двумя клинками.

но я сам его не юзал.

k60
Offline
Зарегистрирован: 30.03.2018

UserDead пишет:

Может стоит попробовать подавать напряжение в течении ограниченного времени. Скажем опроса каждые 10 минут. А на датчик подать питание в течении 30 сек и замерить в конце 29-30 сек. Потом отключаем питание - профит. Пока 30 сек пройдет все дожно устаканится. В схеме использовать аналоговый выход с подяжкой на землю 10 кОм.

Не подскажете как это реализовать программно с помощью millis() ?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#2  замените мигание светодиода на запрос датчика.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

2. И еще два вопроса:

- зачем Вы (насколько я нонял из скетча. А вообще- следовало бы привести и схему подключения) подсоединяете землю датчика к пину Ардуино?

- уверены ли Вы, что того тока, конторый может выдавать пин Ардуино, достаточно для питания датчика?