Сенсорная кнопка

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Такой вопрос по железу, есть емкостная сенсорная кнопка(резистор,медная фольга), схемка подключения примерно такая, резистор к 5 вольтам одной стороной, второй стороной на медную фольгу, от медно фольги провод до пина контроллера, считаем время заряда, увеличилось - регистрируем нажатие.....

а теперь собственно вопрос:

1) как можно уменьшить шумы наводящиеся на фольгу(резистор подбирать или конденсатор ставить?)

2) как кроме экранирования защитить провод от фольги до контроллера, чтобы он не реагировал на нажатия? 

код кнопки приложу если нужно, но он огромный....

 

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Ночной ап, поменял резистор, было 10МОм, менял на 1МОм, 2МОм, 5МОм, выбрал пока что 5 МОм, намного меньше шума, скорость опроса выросла, актуален вопрос про обход экранизации сигнального провода(от ноги друины до сенсорной площадки),т.к. если провод не экранировать даже сквозь оплетку идет неплохое возрастание емкости., на всякий приложу картинк с интернетов на основе которой и собрана кнопка

За код сильно не пинать, первый проэкт под друину, знаю что он непомерно прожорлив, со временем улучшу, но уже после перевода на матрицу кнопок, и как только полностью закончу с апаратными проблмами



#include "TimerOne.h";

struct ButData
{
    unsigned long cicle;
    unsigned long value;   
    byte pin;  
    boolean state;
    byte ckl;
    unsigned int tm;
};

class buttons
{
  private:
    ButData buttons[10];
    int RealButon;
    int maxPulse;
    int Dring;
    float presch;
    unsigned int pulse(int pin)
    {
      int tm;
      while (digitalRead(pin)<HIGH){
        tm++;
        if(tm>=maxPulse)break;
      }
    if(tm>maxPulse)tm=maxPulse;
    return tm;
  };
  
  void butRun(int id)
  {
    if(buttons[id].ckl>=Dring)
    {      
      buttons[id].tm/=buttons[id].ckl;
      buttons[id].value +=buttons[id].tm;
      buttons[id].cicle++;
      if(buttons[id].value>2147483647)
      {
        buttons[id].cicle/=2;
        buttons[id].value/=2;
      }
      
      buttons[id].state = (buttons[id].tm>=(buttons[id].value / buttons[id].cicle *presch));      
      
      buttons[id].tm=0;
      buttons[id].ckl=0;            
    }else
    {
      pinMode(buttons[id].pin,INPUT);        
      buttons[id].tm+=pulse(buttons[id].pin);
      buttons[id].ckl++;
      pinMode(buttons[id].pin,OUTPUT);
      digitalWrite(buttons[id].pin,LOW);
    }
  };  
    
  public:     
    void init()
    {
      RealButon = 0;   //Кол-во кнопок
      maxPulse =100;   //Ограничение времени заряда
      presch = 1.2;    //Порог реакци
      Dring = 5;       //Циклы подсчета.
    }
    
    boolean State(int id)
    {
      return buttons[id].state;
    }
    
    void add(int bPin)
    {
      buttons[RealButon].pin=bPin;
      buttons[RealButon].cicle=0;
      buttons[RealButon].value=0;
      buttons[RealButon].state = false;
      pinMode(bPin,OUTPUT);
      digitalWrite(bPin,LOW);
      RealButon++;
    };
    
    void run()
    {
      for(int i=0;i<RealButon;i++) butRun(i);
    }
};

buttons But;
 
void setup() 
{
  Timer1.initialize(20000);
  Timer1.attachInterrupt(Timer1_action);
  But.init(); 
  But.add(5);
}
 
void Timer1_action() 
{ 
  But.run();
};

void loop() 
{ 
  if (But.State(0))
  {
    digitalWrite(OpenLed,LOW);
  } else 
  {
    digitalWrite(OpenLed,HIGH);
  }; 
}
std
Offline
Зарегистрирован: 05.01.2012
ToRcH2565
Offline
Зарегистрирован: 16.05.2015

std,

ToRcH2565 пишет:

..., со временем улучшу, но уже после перевода на матрицу кнопок, и как только полностью закончу с апаратными проблмами

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