В этой статье я покажу, как можно просто и быстро реализовать сенсорную кнопку. В данном примере кнопку будет изображать кусок фольгированного текстолита. А вообще на роль сенсора может подойти любой электрический проводник, даже просто кусок провода. Чтобы показать, что сенсор работает, будем включать светодиод, после прикосновения пальцем к сенсору. Ниже приведены две фотографии: схема в положении покоя и в момент прикосновения пальцем к сенсору (куску текстолита).
Что использовалось в проекте
Список того, что я использовал, так же привожу ссылки, где это покупал — все с Китая, там дешевле всего )
- Arduino (я использовал arduino nano, но можно любую другую). Покупал тут: arduino nano
- 1 Кусок фольгированного текстолита. Покупал тут: 10 кусков одностороннего текстолита 70x100x1.2 мм
- 1 резистор сопротивлением 1 мОм (не критично, если сопротивление будет больше). Покупал тут: набор резисторов 700 шт. От 10 Ом до 1 МОм
- 1 светодиод. Покупал тут: 100 светодиодов, 10 разных цветов
- Несколько соединительных проводов. Покупал тут: соединительные провода
- Макетная плата. Я использовал с 830 отверстиями. Покупал тут: макетная плата
Схема сборки сенсорной кнопки для arduino
Остается только написать скетч, но прежде стоит разобраться, как работает наша схема. Мы будем посылать сигнал с одного пина, и получать сигнал другим пином. Пины будут разделены резистором с большим сопротивлением, а также параллельно к ним подключена пластина, которая будет являться очень маленьким конденсатором, емкость которого будет наполняться при каждой отправке сигнала от пина к пину. В связи с тем, что емкость пластинки должна наполняться, каждый раз будет происходить очень короткая задержка (это примерно 15-20 микросекунд). А когда мы касаемся пальцем, емкость конденсатора увеличивается в несколько раз, что скажется на скорости передачи сигнала между пинами. Именно скорость передачи сигнала и будет указывать на то, что было прикосновение к сенсору. Остается только программно обработать передачу, прием и подсчет времени передачи сигнала.
Подробнее почитать о получившейся у нас цепи можно в Википедии тут: RC-цепь
Скетч для сенсорной кнопки
Скачать скетч можно тут: скачать.
int firstPin = 3; // Пин, который отправляет сигнал int secondPin = 2; // Пин, который принимает сигнал int ledPin = 13; // Светодиод void setup() { pinMode(secondPin, OUTPUT); pinMode(firstPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { int ms = getDeltaTime(); if(ms > 100){ digitalWrite(ledPin,HIGH); }else{ digitalWrite(ledPin,LOW); } delay(10); } int getDeltaTime() { int time_start=0; int time_finish = 0; int time_delta = 0; time_start = micros(); // Количество микросекунд со старта программы digitalWrite(secondPin, HIGH); // Отправляем сигнал while(digitalRead(firstPin) == LOW); // Джем пока дойдет сигнал от одного пина к другому time_finish = micros(); // Еще раз смотрим сколько прошло микросекунд со старта программы time_delta = time_finish - time_start; // Высчитываем сколько микросекунд ушло на передачу сигнала между пинами digitalWrite(secondPin, LOW); // Останавливаем передачу сигнала Serial.println(time_delta); return time_delta; }
Подскажите, как изменится схема, если требуется сделать пять кнопок? И второй вопрос можно ли ряд таких кнопок повесить на один пин, как простые кнопки?
Собрал схему и в реальных условиях оказалось, что схема не совсем рабочая. Из-за наводок сети светодиод на 13м выходе моргает, а не загорается. Пришлось дописывать код обработки наводок от сети.
у меня при прикосновении к пластине getDeltaTime() начинает выдавать всякую чушь, в том числе отрицательные значения. Оказалось что она не всегда заходит в блок while(digitalRead(firstPin) == LOW), потому как наводка на пальце даёт HIGH сразу же.
в моем случае вся та же схема работает, но надо не задержку мерить, а просто ждать 1 на пине, к которому подключена пластина. при этом не забыть пин подтянуть к земле резистором (от сопротивления зависит чувствительность). также нужна разумная задержка, чтобы успеть убрать палец (1 сек например).
то есть вся программа становится такой:
void loop()
{
if (digitalRead(firstPin) == HIGH) {
// do something
delay(1000);
}
}
я тоже хочу сделать кнопку, заглянул в интернет, такие мне не продходят.. нужно хотя бы кт315 с большим ку поставить и пластину на базу.
Да. не нужно и кт315, просто пластинку из фольгированого текстолита , фольгу напополам разрезать, одну часть заземлить, на другую подать через 1 мом +5 вольт. подключив к пину. при замыкании пальцем двух частей фольги вторая часть через сопротивление пальца заземляется до напряжения лог. нуля. Легко и четко работает. Резестивная сенсорная кнопка называется.