Автор Тема: Капацитивен сензор за ниво с Ардуино  (Прочетена 6202 пъти)

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Имам един хоби проект свързан със система за поливане и се чудех дали сравнително лесно може да се направи безконтактен сензор за ниво на течност. Реших да пробвам с капацитивен метод, тъй като водата има сравнително голяма относителна диелектрична проницаемост  (около 80) спрямо въздуха. След няколко проби се спрях на електрод от двустранен текстолит за печатни платки с размери 10x30 mm. Капацитета му във въздуха е около 8-10pF, при потапяне във вода нараства на около 20-22pF.
За измерванe на капацитете позлвам класическия 555 таймер в CMOS изпълнение (ICM7555 или LMC555). Електрода е включен като честотно задаващ елемент в схемата на генератора и по този начин се получава преобразувател капацитет-честота. При стойност на честотно задаващия резистор от 2,2М изходната честота въз въздуха е около 21-23kHz, а при потапяне във вода намалява плавно до 10-12 kHz в зависимост от това колко е потопен електрода. Важно е електрода да е близо до таймера 555, за да се намали паразитния капацитет.
Измерването на честота става с Ардуино. В следващия пост ще кача тестовия код.
Ясен Паунски,  гр.София, 39 г.

zoro1

  • Global Moderator
  • *****
  • Публикации: 610
    • Профил
    • http://www.zoro1.com
Re: Капацитивен сензор за ниво с Ардуино
« Отговор #1 -: Март 12, 2015, 12:32:55 pm »
Яско ,идеята ти за измерване по капацитивен метод я бива ,ама дали става за сензор за поливане?Все пак водата за поливане идва от различни източници ,с натрупването на котлен камък или други примеси системата ще може ли да реагира адекватно?Занимавах се с подобно нещо преди година ,но използвах сензор с две пластини или проводници  за датчик с един транзистор и реле ,а нивото на водата ползвах подобна схема на датчика само ,че с добавен трети електрод за трите нива -ниско ,общ  и високо,изход отново с реле ,но този нивомер не беше вързан с ардуиното  а на отделна система.В ардуиното имах датчик за осветеност ,като след това го премахнах и монтирах обикновен таймер /продават се по магазините / настройва се времето за включване примерно от 19 до 6  .Клапани от пералня ползвах за пускане на водата , дебита е задоволителен при условие ,че ползвам самотек.Сега всичко е разглобено и метнато някъде си и трябва пак да го монтирам -сезона се задава.


...Великите нации  се държат като гангстери,а малките като проститутки...
И.Несторов
Skype:Zorro1430

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Re: Капацитивен сензор за ниво с Ардуино
« Отговор #2 -: Март 15, 2015, 04:32:44 pm »
Аз също не съм сигурен дали такъв сензор е подходящ, но смятам да направя някой друг реален опит. Ще пусна отделна тема където да обсъдим подобни системи за поливане.
А сега да се върна на кода за измерване на честота. Сигнала от таймер 555 го подавам на пин 3 на Ардуино. Измерването на честота става като се броят постъпилите  импулси за фиксиран  интервал от време (250ms). За да мога да броя импулсите на пин 3 съм закачил прекъсване по преден фронт. В него чрез променливата  pulsecount броя импулсите. Като измине зададения период, копирам получената стойност, нулирам брояча и почвам нов цикъл. Измерването на времето става чрез вградената функция millis(). Измерването не е супер точно, но за целите на експеримента  върши работа. Получения резултат го изкарвам на серийния монитор. Има реализиран прост прагов детектор с който управлявам светодиод на пин 13.
 
//сензора е свързан на цифров пин 3
#define LED            13
#define MainPeriod     250 // 4 измервания за секунда
#define F_TH           15000 //праг на сработване в Hz
#define F_MIN          5000  //минимална защитна честота
#define INT_PIN3       1     //прекъсване на пин 3

long t_start = 0; //
volatile unsigned int pulsecount=0;

void setup()
{
  pinMode(LED,OUTPUT);
  Serial.begin(9600);
  attachInterrupt(INT_PIN3, myinthandler, RISING);
}

void loop()
{
  unsigned long t_end = millis();
  if (t_end - t_start >= MainPeriod) {
      t_start = t_end;   
      unsigned long pcount = pulsecount*4;
      pulsecount = 0;
      Serial.print(" ");
      Serial.println(pcount);
      if (pcount < F_TH && pcount > F_MIN){
        digitalWrite(LED,HIGH);
      }
      else {
        digitalWrite(LED,LOW);
      }
  }
}

void myinthandler() // interrupt handler
{
  pulsecount++;
}
« Последна редакция: Март 15, 2015, 04:34:24 pm от yasko »
Ясен Паунски,  гр.София, 39 г.