Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
У платы ESP32 есть несколько выводов, которые могут использоваться в качестве тач-выводов, способных обнаруживать касания рукой. Список выводов приводится ниже. Программно выводы начинаются с символа T. С правой стороны находятся три вывода, слева - шесть (версия платы на 30 выводов)
D4 = T0
D2 = T2
D15 = T3
#
D13 = T4
D12 = T5
D14 = T6
D27 = T7
D33 = T8
D32 = T9
У платы с 36-ю выводами есть ещё один тач-вывод GPIO0 = T1.
На некоторых платах может наблюдаться чехарда с пинами при работе в Arduino IDE, так GPIO 33 и GPIO 32 перепутаны местами. Поэтому в коде к ним лучше обращаться как T9 и T8 соответственно. Если у вас такой ошибки нет, то просто не обращайте внимания на данный абзац.
Вставим провод в вывод D4 (T0), второй конец провода оставим свободным. Вывод 18 соединим с длинной ножкой светодиода, а вывод GND с короткой ножкой светодиода. Не забываем про резистор.
Получить значение тач-вывода можно через функцию touchRead(GPIO), указав используемый вывод.
Напишем сначала простейший скетч, включая светодиод при касании провода рукой.
/*****************************************************
* ESP32 Touch Test
*****************************************************/
#define TOUTCH_PIN T0 // ESP32 Pin D4
#define LED_PIN 18
int touch_value = 100;
void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println("ESP32 Touch Test");
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
}
void loop()
{
touch_value = touchRead(TOUTCH_PIN);
Serial.println(touch_value); // get value using T0
if (touch_value < 50)
{
digitalWrite(LED_PIN, HIGH);
}
else
{
digitalWrite(LED_PIN, LOW);
}
delay(1000);
}
Напишем другой скетч, используя плавное включение светодиода при помощи функций ledc....
/*
ESP32 Touch Controled LED, using PWM
Board: ESP32 Dev Module
*/
uint8_t led = 18;
int buff(int pin) // Function to handle the touch raw sensor data
{
int out = (50 - touchRead(pin)); // Scale by n, value very sensitive currently
// change to adjust sensitivity as required
if (out > 0)
{
return (out + 2);
}
else
{
return 0;
}
}
void setup()
{
ledcAttachPin(led, 1); //Configure variable led, pin 18 to channel 1
ledcSetup(1, 12000, 8); // 12 kHz PWM and 8 bit resolution
ledcWrite(1, 100); // Write a test value of 100 to channel 1
Serial.begin(115200);
Serial.println("Testing ledc 12 channel 1");
}
void loop()
{
Serial.print("Touch sensor value:");
Serial.println(buff(T0));
{
ledcWrite(1, (buff(T0))); // Using T0 for touch data
}
delay(100);
}
Берёмся рукой за свободный вывод и наблюдаем, как светодиод светится с разной силой.
Для удобства можно сделать площадку из фольги и прикрепить её к выводу.