Помогите добиться точности считывания показаний с датчика влажности почвы YL-38.
- Войдите на сайт для отправки комментариев
Всем привет! Пытаюсь приладить датчик влажности почвы 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 } }
Подскажите, пожалуйста, как решить проблему?!
Использовать другой датчик - под действием напряжения он вступат в хим реакцию и в зависимости от влажности скорость протекания реакции различная - вот эти показания вы и получате. Поэтому при кратковременных замерах - значение одинаковое - реакция не развила скорость. Будет гнить - без этого никак. Можно попробовать 2 стержня из меди и чего нибудь.
можно поробовать и такой датчик https://ru.aliexpress.com/item/-/32832538686.html
...можно поробовать и такой датчик https://ru.aliexpress.com/item/-/32832538686.html
А Вы лично посоветованный датчик юзали? Он точно поможет решить проблему?
Может стоит попробовать подавать напряжение в течении ограниченного времени. Скажем опроса каждые 10 минут. А на датчик подать питание в течении 30 сек и замерить в конце 29-30 сек. Потом отключаем питание - профит. Пока 30 сек пройдет все дожно устаканится. В схеме использовать аналоговый выход с подяжкой на землю 10 кОм.
А по ссылке выше судя по всему емкостный изолированный датчик и его можно постоянно питать в отличии от вашего где по ходу используется электропроводимость между двумя клинками.
но я сам его не юзал.
Может стоит попробовать подавать напряжение в течении ограниченного времени. Скажем опроса каждые 10 минут. А на датчик подать питание в течении 30 сек и замерить в конце 29-30 сек. Потом отключаем питание - профит. Пока 30 сек пройдет все дожно устаканится. В схеме использовать аналоговый выход с подяжкой на землю 10 кОм.
Не подскажете как это реализовать программно с помощью millis() ?
#2 замените мигание светодиода на запрос датчика.
1. Датчику, безусловно, надо некоторое время, чтобы "прочухаться". Думаю, 30 с. здесь не обязательно, - этот интервал можно подобрать экспериментально. Может, и долей секунды хватит. Но он должен быть.
2. И еще два вопроса:
- зачем Вы (насколько я нонял из скетча. А вообще- следовало бы привести и схему подключения) подсоединяете землю датчика к пину Ардуино?
- уверены ли Вы, что того тока, конторый может выдавать пин Ардуино, достаточно для питания датчика?