• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Кто-небудь делал ёмкостную безконтактную кнопку (capacitive touch sensor)?

Chouck

New member
Хотел прикрутить к своему esp8266 удобную дезконтакную кнопку или парочку на подобии этих
https://github.com/PaulStoffregen/CapacitiveSensor
http://playground.arduino.cc/Main/CapacitiveSensor
http://www.esp8266.com/viewtopic.php?f=11&t=3720

Я так понял на одном выходе выставляешь PWM через большой резитор замыкаешь его на вход к которому подсоединён кусок фольги. И смотришь количество(частоту) единичек на входе.
Нехочется изобретать велосипед.
Может кто-то делал напрямую через SDK а не через ардуину?
 

Shyster

New member
Вам ресурсов процессора и своего времени на отладку не жалко?
С аппаратной кнопкой вы можете использовать прерывания и вводить чип в слип режим, легко обрабатывать сигнал, не морочися с дребезгом.
 

FoxKeys

New member
Пост старый, надо полагать автору не актуальный... Но может кому пригодится.
Измерение емкости (в попугаях, но при желании можно откалибровать) с помощью ESP8266 и одного резистора (100к от сенсора на землю для емкостей порядка 0-50пФ)
Для больших емкостей нужно меньший "разрядный" резистор и добавить токоограничивающий от пина до сенсора (или измеряемого кондея если использовать как измеритель)
Методика измерения типовая.
1. Заряжаем кондей (тач сенсор) устанавливая 1 на выход
2. Переключаем выход в режим входа и измеряем время разрядки (по смене 1 на 0)

Через Arduino.h цепляются нужные макросы типа GPC и т.д. Сразу скажу, с pinMode/digitalWrite/digitalRead для малых емкостей (тач сенсора) работать НЕ будет! Т.к. эти функции слишком медленные.

#include <Arduino.h>
#include <user_interface.h>
#define IO_PIN 12
#define GPIO_IN ( (volatile uint32_t *)0x60000318 )
void ICACHE_RAM_ATTR setup() {
pinMode( IO_PIN, OUTPUT );
Serial.begin( 74880 );
system_soft_wdt_stop();
*( (volatile uint32_t *)0x60000900 ) &= ~( 1 ); // Hardware WDT OFF
uint32_t pinMask = 1 << IO_PIN;
uint32_t timeCount = 0;
digitalWrite( IO_PIN, 1 ); // Важно! Это состояние будет сохраняться в регистре и выводиться на пин при смене INPUT/OUTPUT
uint32_t sampleCount = 65536;
uint32_t sampleNo = 0;
while ( true ) {
sampleNo++; //Работает с переполнением. Вычисление среднего и вывод каждые sampleNo % sampleCount замеров
// Быстрый аналог pinMode( IO_PIN, OUTPUT );
// При переводе в режим OUTPUT на выход пойдет высокий уровень (установленный в строке 15), т.к. значение в регистре _сохраняется_ при смене OUTPUT на INPUT и обратно
//GPF( IO_PIN ) = GPFFS( GPFFS_GPIO( IO_PIN ) ); //Set mode to GPIO //В _данном случае_ лишнее, т.к. не меняется при смене направления IN/OUT порта
GPC( IO_PIN ) = ( GPC( IO_PIN ) & ( 0xF << GPCI ) ); //SOURCE(GPIO) | DRIVER(NORMAL) | INT_TYPE(UNCHANGED) | WAKEUP_ENABLE(DISABLED)
GPES = ( 1 << IO_PIN ); //Enable
// Быстрый аналог pinMode( IO_PIN, INPUT );
//GPF( IO_PIN ) = GPFFS( GPFFS_GPIO( IO_PIN ) ); //Set mode to GPIO //В _данном случае_ лишнее, т.к. не меняется при смене направления IN/OUT порта
GPEC = ( 1 << IO_PIN ); //Disable
GPC( IO_PIN ) = ( GPC( IO_PIN ) & ( 0xF << GPCI ) ) | ( 1 << GPCD ); //SOURCE(GPIO) | DRIVER(OPEN_DRAIN) | INT_TYPE(UNCHANGED) | WAKEUP_ENABLE(DISABLED)
while ( ( *GPIO_IN & pinMask ) != 0 ) { // Этот вариант самый быстрый из найденных (соотв. выше точность измерения интервала)
//while ( GPIP( IO_PIN ) != 0 ) { //digitalRead();
timeCount++;
}
if ( ( sampleNo % sampleCount ) == 0 ) { //Вываливаем результат каждые sampleCount замеров
Serial.print( "TC: " );
Serial.print( timeCount );
Serial.print( "; L: " );
Serial.println( timeCount / sampleCount );
timeCount = 0;
ESP.wdtFeed();
}
}
}
void loop() {
}
 

nikolz

Well-known member
У меня этот метод и различные его модификации на ESP8266
позволяет измерять от 0.5 пф до 10000 пф.
прога на СИ.
 

nikolz

Well-known member
есть готовые чипы TI для измерения емкости от долей пф до мкф.
 

FoxKeys

New member
есть готовые чипы TI для измерения емкости от долей пф до мкф.
Есть. Полно. И не только от TI.
Например: MTCH101 от Microchip - для случая когда нужен настраиваемый емкостной датчик.
Если нужна просто кнопка - то отлично подойдет TTP223 (Важно! НЕ годится для кастомных вещей, типа измерения емкости конденсаторов или емкостного датчика уровня (как раз то, что было нужно мне). Дело в том, что датчик постоянно автокалибруется и "зажатая" кнопка "отпустися" спустя 4, кажется, секунды). Плюс этого чипа - дешивизна и доступность копеечных готовых кнопочных модулей на Алиэкспресе

Но! Прикол в том, что такие микросхемы нельзя купить в соседнем ларьке (ну, в Нерезиновой - может и можно - а в других городах - только заказывать. И ждать неделю-месяц пока придут).
Описанное же решение позволяет решить задачу "на коленке" имеющимися средствами. Просто не все понимают физику процесса и возможные решения. Для того и опубликовал образчик кода.

К слову, итоговое решение я вообще сделал на ESP32. Несколько ... из пушки по воробьям, конечно. Но пачка ESP32 у меня лежит в столе всегда, стоят - терпимо. И один ESP32 имеет 10 готовых "тач" каналов. Причем, неплохо настраиваемых (https://docs.espressif.com/projects...s/touch_pad.html#optimization-of-measurements)
Форум посвящен ESP8266, поэтому публиковать подробности не буду. Но если кому надо, пишите в личку, скину код.
 

nikolz

Well-known member
Есть. Полно. И не только от TI.
Например: MTCH101 от Microchip - для случая когда нужен настраиваемый емкостной датчик.
Если нужна просто кнопка - то отлично подойдет TTP223 (Важно! НЕ годится для кастомных вещей, типа измерения емкости конденсаторов или емкостного датчика уровня (как раз то, что было нужно мне). Дело в том, что датчик постоянно автокалибруется и "зажатая" кнопка "отпустися" спустя 4, кажется, секунды). Плюс этого чипа - дешивизна и доступность копеечных готовых кнопочных модулей на Алиэкспресе

Но! Прикол в том, что такие микросхемы нельзя купить в соседнем ларьке (ну, в Нерезиновой - может и можно - а в других городах - только заказывать. И ждать неделю-месяц пока придут).
Описанное же решение позволяет решить задачу "на коленке" имеющимися средствами. Просто не все понимают физику процесса и возможные решения. Для того и опубликовал образчик кода.

К слову, итоговое решение я вообще сделал на ESP32. Несколько ... из пушки по воробьям, конечно. Но пачка ESP32 у меня лежит в столе всегда, стоят - терпимо. И один ESP32 имеет 10 готовых "тач" каналов. Причем, неплохо настраиваемых (https://docs.espressif.com/projects...s/touch_pad.html#optimization-of-measurements)
Форум посвящен ESP8266, поэтому публиковать подробности не буду. Но если кому надо, пишите в личку, скину код.
проще делать на ESP8266 а еще лучше делать на ESP8285
------------------
изготовление кнопки более простая задача чем измерение емкости.
---------------------
Физика того, что Вы изложили - это процессы в RC цепочки - основа электротехники.
----------------
Написано в любом учебнике даже в школьном (заряд разряд конденсатора)
----------
Прискорбно, что в 21 веке кто-то даже этого не знает пытаясь делать поделки на микропроцессорах.
 

FoxKeys

New member
проще делать на ESP8266 а еще лучше делать на ESP8285
Ну, во первых не проще. А во вторых у ESP8266 не хватит ни быстродействия ни ног на 10 каналов.

---------------------
Физика того, что Вы изложили - это процессы в RC цепочки - основа электротехники.
----------------
Написано в любом учебнике даже в школьном (заряд разряд конденсатора)
----------
Прискорбно, что в 21 веке кто-то даже этого не знает пытаясь делать поделки на микропроцессорах.
Теория - да. Известна.
Но дьявол-то, как водится, в деталях. В моем случае емкость сенсора порядка 5-7пф. Оно конечно можно и "аналоговыми" методами что-то сделать. Вот только это будет чуть-чуть посложнее, чем одна микросхема обслуживающая 10 каналов, не так ли?
Сам сенсор, к слову, находится в условиях конденсации влаги (т.е. поставить мегаомный резистор, чтобы увеличить время разряда - нереально. Заряд утекает "мимо" резистора. И время саморазряда измеряется наносекундами...)
К тому же - емкость изменяется всего на 20% между "пустым" и "полным" состояниями.
Все это потребовало увеличения точности измерения временных интервалов, не достигаемых на ESP8266 "стандартными" методами. "В ардуино стайл" нужного не сделать вообще. Только прямой работой с регистрами. Чего не умеет большинство. Именно ради этого я и опубликовал свой пост :)

Реальное же изделие, как я уже говорил, вообще сделано на ESP32 потому что там и быстродействие выше, и есть аппаратные ресурсы для измерений емкости в "линейной" зоне. Для моего случая оптимальным режимом оказалось 0.8 - 1.4V (на ESP8266 вообще невозможно "ловить" заданное напряжение, у АЦП и каналов мало и скорость не та) только логический уровень,.
 
Сверху Снизу