Сенсорная кнопка TTP223 на Arduino: управление светодиодным кольцом касанием
Это третья часть проверки сборки схемы на макетной плате. В данном случае рассмотрим прошивку сенсорной кнопки TTP223, а также совместим работу данной кнопки со светодиодным кольцом из второй части.
📌 Первая часть (телеметрические датчики): Датчики CJMCU BME680 и AHT20+BMP280 на Arduino
📌 Вторая часть (светодиодное кольцо): Светодиодное кольцо CJMCU-2812B на Arduino
Содержание статьи
1. Обзор сенсорной кнопки TTP223
Модуль выполнен на микросхеме TTP223-BA6.
Принцип работы: Модуль сенсорной кнопки отслеживает изменение частоты генератора, зависящей от величины емкости внешнего открытого колебательного контура. При этом предусмотрена регулировка чувствительности сенсора за счет дополнительно подключаемого конденсатора, емкостью от 0 пФ до 50 пФ.
📊 Характеристики TTP223
| Параметр | Значение |
|---|---|
| Напряжение питания | 2 В — 5,5 В |
| Максимальное время отклика | 220 мс |
| Время готовности после подачи питания | 0,5 с |
| Расстояние срабатывания | 0 — 5 мм |
| Выход «Q» | КМОП, настраивается перемычками |
- Перемычка «A» — устанавливает начальный уровень на выходе (логические 0 или 1)
- Перемычка «B» — включает/выключает режим фиксации (latch mode)
2. Подключение TTP223 к ESP32-C3
🔌 Таблица подключения
| TTP223 | ESP32-C3 (Zero) |
|---|---|
| VCC | 3.3V |
| GND | GND |
| I/O | GPIO21 |
3. Пример кода: чтение нажатий
#define TOUCH_PIN 21
bool lastState = false;
void setup() {
Serial.begin(115200);
pinMode(TOUCH_PIN, INPUT);
Serial.println("TTP223 тест на ESP32-C3");
}
void loop() {
// Читаем значение с кнопки
int buttonState = digitalRead(TOUCH_PIN);
// TTP223 в режиме HIGH (H) -> при касании = HIGH
// TTP223 в режиме LOW (L) -> при касании = LOW
bool isTouched = (buttonState == HIGH); // Для режима HIGH
if (isTouched != lastState) {
if (isTouched) {
Serial.println("Кнопка НАЖАТА!");
} else {
Serial.println("Кнопка ОТПУЩЕНА!");
}
lastState = isTouched;
}
// Выводим текущее значение каждые 500 мс
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 500) {
Serial.print("Значение: ");
Serial.println(buttonState);
lastPrint = millis();
}
delay(50);
}
4. Совместная работа TTP223 и WS2812B
🔌 Таблица подключения
| TTP223 | ESP32-C3 (Zero) | CJMCU-WS2812B-12 |
|---|---|---|
| VCC | 3.3V | — |
| GND | GND | GND |
| I/O | GPIO21 | — |
| — | GPIO2 (через резистор 470 Ом) | DI |
| — | 5V | VCC |
Установка библиотеки:
- Откройте Arduino IDE
- Перейдите в меню Скетч → Включить библиотеку → Управление библиотеками
- В строке поиска введите
Adafruit NeoPixel - Найдите библиотеку Adafruit NeoPixel (автором Adafruit) и нажмите Установить
5. Пример кода: управление светодиодным кольцом касанием
При нажатии на сенсорную кнопку включается бегущая дуга на светодиодном кольце. Повторное нажатие выключает подсветку.
#include <Adafruit_NeoPixel.h>
#define LED_PIN 2
#define LED_COUNT 12
#define TOUCH_PIN 21
#define BRIGHTNESS 80
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
bool effectEnabled = false;
bool lastButtonState = false;
int position = 0;
void setup() {
Serial.begin(115200);
strip.begin();
strip.setBrightness(BRIGHTNESS);
strip.show();
pinMode(TOUCH_PIN, INPUT);
}
void updateEffect() {
strip.clear();
// Дуга из 3 светодиодов
for (int i = 0; i < 3; i++) {
int ledIndex = (position - i + LED_COUNT) % LED_COUNT;
int brightness = BRIGHTNESS * (3 - i) / 3;
uint32_t color = strip.ColorHSV((position * 65536 / LED_COUNT + i * 5000) % 65536, 255, brightness);
strip.setPixelColor(ledIndex, color);
}
strip.show();
position = (position + 1) % LED_COUNT;
}
void turnOffLights() {
for (int i = 0; i < LED_COUNT; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
}
void loop() {
// Читаем кнопку (для режима HIGH)
bool buttonPressed = (digitalRead(TOUCH_PIN) == HIGH);
// Определяем нажатие (переключение по фронту)
if (buttonPressed && !lastButtonState) {
effectEnabled = !effectEnabled;
if (effectEnabled) {
position = 0; // Сбрасываем позицию для плавного старта
} else {
turnOffLights();
}
delay(200); // Антидребезг
}
lastButtonState = buttonPressed;
// Запускаем эффект только если включен
if (effectEnabled) {
updateEffect();
delay(50);
}
}