Калибровка кнопки с библиотеки capsense

VitaliyD
Offline
Зарегистрирован: 10.05.2013

Всем Доброго времени суток, на днях назрел вопрос как сделать автоматическую калибровку при использовании библиотеки Capsense. Суть такова есть значения получаемые с сенсора

Днем значения        в покое ~50 при касании кнопке ~67

Вечером значения  в покое ~ 70 при нажатой кнопке ~87

соответственно вечером при чувствительности 67 уже идут ложные срабатывания если значения ставить выше 70 то в утром будет недабор значений так как потолок при касании - 69.

Как сделать чтобы значения в покое калибровались автоматически и к примеру отсчет был с 0 не понятно.

ниже привел свой скетч, в качестве стабилизации которой смог придумать на кнопку это счетчик.  так же хотел пробовать играть со значениями

set_CS_Timeout_Millis(unsigned long timeout_millis); reset_CS_AutoCal();  set_CS_AutocaL_Millis(unsigned long autoCal_millis); не понял что каждое из них дает результата не заметил.

в скетче использую Capacitive.sensorRAW - только так смог добиться более менее стабильных показаний и видеть реальную картину происходящего. в самой схеме применяю резистор на 100К и конденсатор на 20пикофарад. Играться с номиналом резисторов пробовал меняются только значения в высшую сторону разница не меняется, использую Arduino Nano.

#include <CapacitiveSensor.h>
int led = 13;


CapacitiveSensor   k1 = CapacitiveSensor(4,2);
int cout1;
int out1;
long cap1;

boolean key1() {
 cap1 = k1.capacitiveSensorRaw(30);
 cout1 = constrain (out1,0,80);
        if (cap1 >=69 && out1 <= 20) out1++;
        if (cap1 >=69 && out1 >= 20) out1=80;
        if (cap1 < 69 && out1 >= 0)  out1--;
        if (cap1 < 69 && out1 == 20) out1=0;
        if (cout1 >= 20) return 1;
        else return 0;
}

void setup(){
Serial.begin(9600);
pinMode(led,OUTPUT);
}
void loop(){
digitalWrite(led,key1());
Serial.println(cap1);
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

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

VitaliyD
Offline
Зарегистрирован: 10.05.2013

Спасибо Leshak/ Пошел вашим путем создал переменную float (так как надо вычислять не целые числа), делаю измерения каждые 5 секунд на протяжении последних 15 минут итого 180 измерений вроде полет нормальный, в теории может быть отказ работы кнопки в случае если кто нибудь по 10 минут будет держать нажатой кнопку. на этот случай можно мерить послений час.

ниже фрагмент кода

float cap1a = 60;
...
void loop()
 if ((millis()-last)>=5000){
 last=millis();
 cap1a=(cap1a*179+cap1)/180;}

 

leshak
Offline
Зарегистрирован: 29.09.2011

VitaliyD пишет:

 в теории может быть отказ работы кнопки в случае если кто нибудь по 10 минут будет держать нажатой кнопку. на этот случай можно мерить послений час.

Значит нужно "защиту от дурака". Понятно что если дурак с ломом - ничего не поможет, но если без лома... ;)

Вы же ловите "кнопка нажата"? Ну значит пока ее не отпустят - обновлять среднее не нужно.

leshak
Offline
Зарегистрирован: 29.09.2011

leshak пишет:

 Понятно что если дурак с ломом - ничего не поможет, 

Хотя... если сочинить "детектор лома" :) Железка как никак. Теоретически возможно ;)

VitaliyD
Offline
Зарегистрирован: 10.05.2013

Leshak спасибо что подсказал на на счет обновлений во время нажатий опять же Вам +1 ))

leshak
Offline
Зарегистрирован: 29.09.2011

VitaliyD пишет:

Leshak спасибо что подсказал на на счет обновлений во время нажатий опять же Вам +1 ))

Да не за что :)

Возможно вам еще нужно продумать, что-бы на старте, Взять какое-то значение и "объявить его средним". Что-бы он 15-ть минут не "разогревался". Или... первые 180-замеров сделать с намного меньшим интервалом.

VitaliyD
Offline
Зарегистрирован: 10.05.2013

это я сразу в сетапе описал

void setup(){
cap1a=k1.capacitiveSensorRaw(30);}

А еще я сегодня код уже оттестировал работает на ура 4 сенсорные клавиши.

leshak
Offline
Зарегистрирован: 29.09.2011

VitaliyD пишет:

это я сразу в сетапе описал

void setup(){
cap1a=k1.capacitiveSensorRaw(30);}

А еще я сегодня код уже оттестировал работает на ура 4 сенсорные клавиши.

"Поделись улыбкою своей,И она к тебе не раз ещё вернётся." (C)

Вот поделились бы кодом целиком, то небыло бы лишних уточнений :)

Если там "много всего другого" - можно сделать упрощенную версию. Без экраном и проч. Оставить только работу с кнопками и какой-нибудь Serial.println сообщающий какая кнопка нажата.

Авось залетит сюда редкая ископаемая птица "новичок пользующийся поиском". Уталит жажду вашим кодом ;)

VitaliyD
Offline
Зарегистрирован: 10.05.2013

А вот и код

#include <CapacitiveSensor.h>

CapacitiveSensor   k1 = CapacitiveSensor(4,2);
int cout1;
int out1;
long cap1;
float cap1a;
long last;

boolean key1() {
 cap1 = k1.capacitiveSensorRaw(30);
 if (cout1<3){
  if ((millis()-last)>=500){
  last=millis();
  cap1a=(cap1a*89+cap1)/90;}
 }
 cout1 = constrain (out1,0,20);
        if (cap1 - cap1a >= 10 && out1 <= 10) out1++;
        if (cap1 - cap1a >= 10 && out1 >= 10) out1=20;
        if (cap1 - cap1a <= 10 && out1 >= 0)  out1--;
        if (cap1 - cap1a <= 10 && out1 == 10) out1=0;
        if (cout1 >= 10) return 1;
        else return 0;
}

void setup(){
Serial.begin(9600);
cap1a=k1.capacitiveSensorRaw(30);
}
void loop(){
Serial.print(" key - ");
Serial.print(key1());
Serial.print(" cap1a - ");
Serial.println(cap1a);
}

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

появился один вопрос как эти кнопки будут вести себя при статическом электричестве? если я к примеру случайным образом разряжусь через эту кнопку после того как сниму синтетическую футболку.

VitaliyD
Offline
Зарегистрирован: 10.05.2013

Очень хороший вопрос я им задавался только когда начал изучать тач сенсоры, в данном случае они не увеличивают среднее знаечение болше чем на 1% а соответственно все будет работать, и сейчас сам специально нашел свитер снимал одевал снимал одевал его и "разрядился в кнопку" монитор порта даже не увидел этого "щелчка"