#include <Wire.h>
#include "MTCH2120.h"
#define IRQ_PIN 13 // 13 sg
#define TOUCH_LED 2 // LED_BUILTIN // 2
#define DEBOUNCE 200
// Shift Register Pins
#define LATCH_PIN 25 // ST_CP pin 12 - STorage Clock Pulse
#define CLOCK_PIN 27 // SH_CP pin 11 - SHift register Clock Pulse (SCK)
#define DATA_PIN 26 // DS pin 14 - (MOSI)
volatile bool Flag_irq;
bool ledStates[12] = { false };
// unsigned long lastInterruptTime = 0;
MTCH2120 touch;
void toggleLed(uint8_t pad) {
ledStates[pad] = !ledStates[pad];
digitalWrite(TOUCH_LED, HIGH);
delay(50);
digitalWrite(TOUCH_LED, LOW);
uint8_t noise = touch.getNoiseLevel(pad);
Serial.println("=== TOUCH EVENT ===");
Serial.print("Sensor Pad: X");
Serial.println(pad);
Serial.print("Noise Level: ");
Serial.println(noise);
Serial.print("74HC595 Output Q");
Serial.print(pad);
Serial.print(" -> ");
Serial.println(ledStates[pad] ? "ON" : "OFF");
Serial.println("====================");
updateShiftRegister();
}
void updateShiftRegister() {
uint16_t data = 0;
for (int i = 0; i < 12; i++) {
if (ledStates[i]) data |= (1 << i);
}
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, (data >> 8) & 0xFF);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data & 0xFF);
digitalWrite(LATCH_PIN, HIGH);
// --- Serial output for debugging ---
// Serial.print("LEDs: ");
// for (int i = 0; i < 12; i++) {
// Serial.print("[");
// Serial.print(ledStates[i] ? "1" : "0");
// Serial.print("]");
// }
// Serial.println();
}
void IRAM_ATTR handleInterrupt() {
// unsigned long currentTime = millis();
// if (currentTime - lastInterruptTime > DEBOUNCE) {
// lastInterruptTime = currentTime;
// }
static uint32_t lastMillis;
if ((millis() - lastMillis) > DEBOUNCE) { // Software debouncing buton
Flag_irq = true;
}
lastMillis = millis();
}
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("--- Start TOUCH Test Project ---");
pinMode(TOUCH_LED, OUTPUT);
digitalWrite(TOUCH_LED, LOW);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
updateShiftRegister();
touch.setIRQPin(IRQ_PIN);
touch.begin();
// attachInterrupt(digitalPinToInterrupt(IRQ_PIN), handleInterrupt, FALLING);
for (uint8_t i = 0; i < 12; i++) {
pinMode(i, OUTPUT);
touch.onTouch(i, toggleLed);
}
Serial.println("MTCH2120 Ready with shift register toggle support");
}
void loop() {
// if (millis() - lastInterruptTime < DEBOUNCE) return;
// if (touch.available()) {
// touch.readTouchStatus();
// lastInterruptTime = millis();
// }
if (Flag_irq) {
Flag_irq = false;
if (touch.available()) {
touch.readTouchStatus();
}
}
}