Вопросы программирования: Емкостный датчик влажности почвы

Всем доброго дня,

Это мой первый раз, когда я пишу на этом форуме, и это мое последнее средство, так как я хотел бы выяснить это сам. Я пытаюсь создать зонд влажности почвы, который можно использовать на фермах для определения влажности почвы на разной глубине. Проект состоит из Arduino Nano, установки емкостного считывания влажности DIY (схема прилагается - моя настройка такая же, за исключением светодиодного индикатора влажности) и ЖК-экрана для отображения требуемого значения.

Моей первоначальной настройкой был Arduino Nano (старый загрузчик 328P) с резистивным датчиком влажности почвы. Однако эти датчики (поскольку они резистивные) не дают надежных показаний при измерениях в разных точках поля. Я считаю, что на это в значительной степени влияет рН, содержание соли и так далее.

Мой следующий подход состоял в том, чтобы создать самодельный емкостный датчик влажности почвы. После поиска в Интернете я наткнулся на установку на hackster.io ( https://www.hackster.io/Pedro52/arduino-capacitive-soil-moisture-sensor-diy-with-esp32-d7ad72 ), где сигнал посылается через микроконтроллер ESP 32 на зонд в почве и возвращается обратно. Я реализовал ту же настройку с теми же компонентами, однако я использовал только оптимизацию таймеров на Nano для генерации волны PWM (опять же, этот код также был получен с другого сайта, и я все еще немного смущен тем, как работает код).

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

Это было бы очень ценно.

 /

    /The setup uses a Chinese Arduino Nano, a 10M ohm, a 10k ohm, a 1N4007 diode and a 1 microfarrad capacitor as shown in the schematic.
    // Светодиодный индикатор влажности на схеме можно игнорировать
    
    //#включить <LiquidCrystal_I2C.h>
    //#включить <LcdBarGraphRobojax.h>
    #include <Wire.h>
    
    //LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
    //LcdBarGraphRobojax lbg (&lcd, 16, 0, 0);
    
    
    float Moistlevel = 0;
    float Moistpin = A1;
    float Moisture = 0;
    float RESET;
    float factor;
    const byte CLOCKOUT = 9;


void setup() {
  // поместите свой установочный код здесь, чтобы запустить один раз:
  Serial.begin(9600);

  TCCR1A = bit (COM1A0);                  //Код, который я получил для инициирования бортового таймера 1 для подачи сигнала через D9
  TCCR1B = bit (WGM12) | bit (CS10);
  OCR1A =  0;                             // По-видимому, это должно быть изменено для предварительного масштабирования. Так ли это необходимо?


  RESET = analogRead(Moistpin);           // Возьмите начальное чтение, чтобы обнулить настройку

  for (int j = 1; j < 5 ; j++)            // Возьмите еще 5 показаний, из которых будет определено среднее значение
  {
    RESET = RESET + analogRead(Moistpin);
    delay(200);
  };

  RESET = RESET / 6;

  Serial.print(RESET);
  Serial.println();


  Serial.print("Moistlevel");
  Serial.print("\t");
  Serial.print("\t");
  Serial.print("Moisture");
  Serial.println();
}

void loop() {

  Moistlevel = analogRead(Moistpin);                  // Возьмите среднее значение чтения каждую секунду.

  for (int i = 1; i < 5 ; i++)
  {
    Moistlevel = Moistlevel + analogRead(Moistpin);
    delay(200);
  };

  Moistlevel = Moistlevel / 6;
  Moisture = (RESET - Moistlevel) / (RESET / 100);    // Преобразование для перехода от показания напряжения к показанию процента

  if (Moisture < 0)                                   //Перемещает начальное значение, если получается отрицательная влажность.        
  {
    RESET = Moistlevel;
  };

  Moisture = (RESET - Moistlevel) / (RESET / 100);    //Получает новое значение влажности и печатает его.

  Serial.println(Moistlevel);
  Serial.print("\t");
  Serial.print("\t");
  Serial.print("\t");
  Serial.print(Moisture);
  Serial.println();
  delay (500);
}

, 👍2

Обсуждение

https://arduino.stackexchange.com/tour, @Juraj

Прикосновение к емкостному датчику изменит его показания, это нормально. Вы уверены, что ваш код посылает правильную частоту на правильный контакт?, @ocrdu

Я пробовал разные сигналы, но все без какого-либо успеха..., @Louis Janse van Rensburg


2 ответа


0

Называть это емкостным датчиком может быть неточно. И это может быть наименьшей из его проблем. Схема "фрицевания" неясна и, по-видимому, противоречит объяснению на шаге 4 описания. К счастью, здесь была выведена разборчивая схема.

Автор статьи hackster.io статья цитирует известное видео Андреаса Спейса на YouTube на тему "Почему большинство датчиков влажности отстой"... а затем приступает к разработке датчика влажности, который ... отстой! Эта конструкция, по-видимому, "упускает суть": постоянный ток вызывает электролитическую реакцию, когда проводник находится в непосредственном контакте с электролитом (например, водой и влажной почвой).

Wrt комментарий OP о том, что прикосновение к проводу изменяет выходные показания: почти наверняка в подводящем проводе больше емкости, чем в "вилках фондю". Согласно статье, аудиокабель был выбран автором для передачи сигнала 600 кГц от его макета к датчику. Длинные подводящие провода к датчику кажутся мне странным выбором.

Я был более чем критичен к этому hackster.io проект. Но, конечно, я мог упустить что-то важное - я совершаю ошибки каждый день. Если кто-то захочет указать на какие-либо ошибки, которые я здесь допустил, я буду рад пересмотреть или удалить этот пост. До тех пор мой предлагаемый ответ заключается в том, чтобы найти лучший проект DIY.

Тем не менее - вы на правильном пути, решив построить емкостный датчик влажности. Если "вилки фондю" не изолированы, чтобы сделать их непроводящими при погружении в электролит почвы / воды, это не емкостный датчик - он резистивный. А его недостатки могут быть еще глубже. Другое руководство DIY может дать лучшие результаты.

Для тех, кто заинтересован, моделирование схемы датчика LTspice может дать представление о его работе. В одном случае датчик моделируется как чисто емкостное устройство (т.е. "Вилки фондю" изолированы, чтобы предотвратить протекание постоянного тока через почву), а во втором случае как цепь R-C (т.е. "вилки фондю" неизолированы, и течет постоянный ток через почву). Значения для Rw2 и C2 / C1 были основаны на измерениях, которые я сделал с помощью аналогичного датчика:

Используя эту модель датчика, я сделал следующие наблюдения:

  1. постоянная времени для RC-фильтра на выходе датчика может быть существенно больше, чем необходимо.

  2. Обратите внимание, что поток постоянного тока через Rw2 составляет в среднем ~ 0,18мА. Знание этого значения позволит использовать Закон электролиза Фарадея, чтобы оценить, сколько хромирования будет растворено в вашей почве с течением времени.

  3. Значение Rw2 во многом определяет значение выходного напряжения; значение емкости играет гораздо меньшую роль. Таким образом, этот датчик в основном резистивный, а не емкостный.

Файл LTspice .asc следует ниже; все отзывы приветствуются:

Version 4
SHEET 1 908 720
WIRE 336 32 288 32
WIRE 352 32 336 32
WIRE 512 32 432 32
WIRE 288 80 288 32
WIRE 336 80 336 32
WIRE 416 80 336 80
WIRE 512 80 512 32
WIRE 512 80 480 80
WIRE 512 96 512 80
WIRE 160 208 128 208
WIRE 288 208 288 144
WIRE 288 208 240 208
WIRE 480 208 288 208
WIRE 288 288 288 272
WIRE 288 288 128 288
WIRE 480 288 288 288
WIRE 288 304 288 288
WIRE 320 368 272 368
WIRE 336 368 320 368
WIRE 512 368 416 368
WIRE 272 400 272 368
WIRE 320 416 320 368
WIRE 416 416 320 416
WIRE 512 416 512 368
WIRE 512 416 480 416
WIRE 512 432 512 416
WIRE 160 528 128 528
WIRE 272 528 272 464
WIRE 272 528 240 528
WIRE 384 528 272 528
WIRE 464 528 384 528
WIRE 272 608 272 592
WIRE 272 608 128 608
WIRE 384 608 272 608
WIRE 464 608 384 608
WIRE 272 624 272 608
FLAG 288 304 0
FLAG 272 624 0
FLAG 480 208 Vsensor1
FLAG 464 528 Vsensor2
FLAG 512 96 0
FLAG 512 432 0
FLAG 288 32 Vout-insul
FLAG 272 368 Vout-unins
SYMBOL voltage 128 192 M0
WINDOW 3 -172 139 Left 0
SYMATTR Value PULSE(0 3.3 0 20n 20n 833.5n 1667.0n)
SYMATTR InstName V1
SYMBOL voltage 128 512 M0
WINDOW 3 -140 138 Left 0
SYMATTR Value PULSE(0 3.3 0 20n 20n 833.5n 1667.0n)
SYMATTR InstName V2
SYMBOL cap 256 528 R0
SYMATTR InstName C2
SYMATTR Value 80.0p
SYMBOL res 368 512 R0
SYMATTR InstName Rw2
SYMATTR Value 5000
SYMBOL res 256 192 R90
WINDOW 0 0 56 VBottom 2
WINDOW 3 32 56 VTop 2
SYMATTR InstName Rs1
SYMATTR Value 10k
SYMBOL res 256 512 R90
WINDOW 0 0 56 VBottom 2
WINDOW 3 32 56 VTop 2
SYMATTR InstName Rs2
SYMATTR Value 10k
SYMBOL cap 272 208 R0
SYMATTR InstName C1
SYMATTR Value 80.0p
SYMBOL diode 304 144 R180
WINDOW 0 24 64 Left 2
WINDOW 3 24 0 Left 2
SYMATTR InstName D1
SYMATTR Value 1N4007
SYMBOL diode 288 464 R180
WINDOW 0 24 64 Left 2
WINDOW 3 24 0 Left 2
SYMATTR InstName D2
SYMATTR Value 1N4007
SYMBOL res 448 16 R90
WINDOW 0 0 56 VBottom 2
WINDOW 3 32 56 VTop 2
SYMATTR InstName R1
SYMATTR Value 1Meg
SYMBOL res 432 352 R90
WINDOW 0 0 56 VBottom 2
WINDOW 3 32 56 VTop 2
SYMATTR InstName R2
SYMATTR Value 1Meg
SYMBOL cap 480 64 R90
WINDOW 0 0 32 VBottom 2
WINDOW 3 32 32 VTop 2
SYMATTR InstName C3
SYMATTR Value 10.0n
SYMBOL cap 480 400 R90
WINDOW 0 0 32 VBottom 2
WINDOW 3 32 32 VTop 2
SYMATTR InstName C4
SYMATTR Value 10.0n
TEXT 96 696 Left 1 !* .tran 0 2m 1.99m\n.tran 0 50.0m 49.99m
TEXT 312 168 Left 2 ;Insulated "Fondue Forks"
TEXT 288 488 Left 2 ;Non-insulated "Fondue Forks"
RECTANGLE Normal 256 184 640 316 2
RECTANGLE Normal 256 508 640 628 2
,

Кажется, [OP перекрестно разместил этот вопрос здесь] (https://forum.arduino.cc/index.php?topic=713146.0 ) и получил несколько ответов., @Seamus


1

Спасибо всем за советы,

Я решил отвлечь всю систему и вместо этого использовать таймер 555, чтобы отправить частоту на измерительные контакты. Он был протестирован и, похоже, полностью решил проблему.

,