
Собираем детектор лжи на Arduino, который измеряет кожно-гальваническую реакцию, пульс и температуру. Визуализация данных через Serial Plotter, полный код и схема.
Профессиональные полиграфы стоят тысячи долларов и измеряют целый набор физиологических показателей: частоту пульса, электропроводность кожи, частоту дыхания, артериальное давление. Однако базовый принцип их работы вполне можно продемонстрировать с помощью Arduino и нескольких датчиков.
Когда человек волнуется, его организм реагирует: сердце бьётся быстрее, потовые железы активизируются, температура кожи слегка меняется. Пот содержит соли, которые увеличивают электропроводность кожи -- это называется кожно-гальванической реакцией (КГР). Именно эти изменения и фиксирует наш прибор.
Конечно, школьный детектор не определит ложь со стопроцентной точностью -- это скорее научная демонстрация, чем настоящий полиграф. Но именно это делает проект отличной темой для обсуждения на уроках биологии и физики.
Проект рассчитан на учеников 7--9 классов и может использоваться на уроках физики, биологии или на кружках робототехники.
Базовый набор без датчика пульса обойдётся примерно в 3 000--5 000 тенге. Датчик пульса добавит ещё около 2 000 тенге, но без него проект полноценно работает на основе одной КГР.
Схема датчика -- классический делитель напряжения. Резистор 1 МОм подключён между пином 5V и аналоговым входом A0. Металлические пластины подключены между аналоговым входом A0 и GND. Когда человек кладёт два пальца на пластины, кожа замыкает цепь и создаёт переменное сопротивление.
В спокойном состоянии сопротивление кожи высокое (несколько мегаом), и на аналоговом входе -- низкое напряжение. При волнении кожа увлажняется, сопротивление падает, напряжение на входе растёт. Arduino фиксирует это изменение.

Датчик КГР (пластины):
| Компонент | Подключение |
|---|---|
| Резистор 1 МОм (вывод 1) | 5V Arduino |
| Резистор 1 МОм (вывод 2) | Аналоговый пин A0 + пластина 1 |
| Пластина 2 | GND Arduino |
Светодиоды:
| Светодиод | Пин Arduino | Резистор |
|---|---|---|
| Зелёный | D3 | 220 Ом |
| Жёлтый | D4 | 220 Ом |
| Красный | D5 | 220 Ом |
Пьезозуммер: положительный вывод к пину D6, отрицательный -- к GND.
Датчик пульса (опционально): сигнальный провод к A3, VCC к 5V, GND к GND.

```cpp
// Детектор лжи (полиграф) на Arduino
// Измеряет кожно-гальваническую реакцию и опционально пульс
// Пины подключения
const int gsrPin = A0; // Аналоговый вход для КГР-датчика
const int pulsePin = A3; // Аналоговый вход для датчика пульса (опционально)
const int greenLed = 3; // Зелёный светодиод (спокойствие)
const int yellowLed = 4; // Жёлтый светодиод (лёгкое волнение)
const int redLed = 5; // Красный светодиод (сильное волнение)
const int buzzerPin = 6; // Пьезозуммер
// Переменные для обработки данных
int baselineGSR = 0; // Базовый уровень КГР
int currentGSR = 0; // Текущее значение КГР
int smoothedGSR = 0; // Сглаженное значение
int difference = 0; // Отклонение от базы
// Пороговые значения (настройте под свои условия)
const int thresholdLow = 30; // Порог для жёлтого уровня
const int thresholdHigh = 70; // Порог для красного уровня
void setup() {
// Настраиваем выходы
pinMode(greenLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
Serial.println("=== Детектор лжи ===");
Serial.println("Положите два пальца на пластины и не двигайтесь.");
Serial.println("Калибровка начинается...");
// Калибровка: определяем базовый уровень КГР
// Снимаем 50 измерений за 3 секунды и берём среднее
long sum = 0;
for (int i = 0; i < 50; i++) {
sum += analogRead(gsrPin);
delay(60);
}
baselineGSR = sum / 50;
smoothedGSR = baselineGSR;
Serial.print("Базовый уровень КГР: ");
Serial.println(baselineGSR);
Serial.println("Калибровка завершена!");
Serial.println("Формат данных: КГР_сырое, КГР_сглаженное, Отклонение, Пульс");
// Тройное мигание зелёным -- калибровка завершена
for (int i = 0; i < 3; i++) {
digitalWrite(greenLed, HIGH);
delay(200);
digitalWrite(greenLed, LOW);
delay(200);
}
}
void loop() {
// Считываем текущее значение КГР
currentGSR = analogRead(gsrPin);
// Экспоненциальное скользящее среднее для сглаживания помех
// 70% предыдущего значения + 30% нового измерения
smoothedGSR = (smoothedGSR * 7 + currentGSR * 3) / 10;
// Вычисляем отклонение от базового уровня
difference = abs(smoothedGSR - baselineGSR);
// Считываем пульс (если датчик подключён)
int pulseValue = analogRead(pulsePin);
// Выводим данные для Serial Plotter (через запятую)
Serial.print(currentGSR);
Serial.print(",");
Serial.print(smoothedGSR);
Serial.print(",");
Serial.print(difference);
Serial.print(",");
Serial.println(pulseValue);
// Определяем уровень стресса и включаем индикацию
if (difference < thresholdLow) {
// Спокойное состояние -- горит зелёный
digitalWrite(greenLed, HIGH);
digitalWrite(yellowLed, LOW);
digitalWrite(redLed, LOW);
noTone(buzzerPin);
}
else if (difference < thresholdHigh) {
// Лёгкое волнение -- горит жёлтый
digitalWrite(greenLed, LOW);
digitalWrite(yellowLed, HIGH);
digitalWrite(redLed, LOW);
noTone(buzzerPin);
}
else {
// Сильное волнение -- горит красный, звучит зуммер
digitalWrite(greenLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(redLed, HIGH);
tone(buzzerPin, 1000); // Сигнал тревоги на 1000 Гц
}
delay(100); // Пауза между измерениями (10 раз в секунду)
}
`
Калибровка при запуске. Первые 3 секунды программа снимает 50 измерений и вычисляет среднее значение -- это базовый уровень электропроводности кожи в спокойном состоянии. Калибровку нужно проводить, когда испытуемый расслаблен и не двигает пальцами.
Сглаживание данных. Аналоговый вход Arduino подвержен электрическим наводкам и шумам. Экспоненциальное скользящее среднее фильтрует случайные скачки: каждое новое значение -- это 70% предыдущего сглаженного и 30% свежего измерения. Реальные тренды сохраняются, а шум отсекается. Это базовая техника цифровой обработки сигналов.
Три уровня реакции. Программа сравнивает отклонение от базы с двумя порогами. Зелёный -- человек спокоен. Жёлтый -- заметно волнение. Красный плюс зуммер -- сильная реакция. Пороги thresholdLow и thresholdHigh можно подстроить: если детектор слишком чувствителен, увеличьте их значения.
Визуализация через Serial Plotter. Данные выводятся через запятую -- это формат, который понимает встроенный инструмент Arduino IDE (меню Инструменты -- Serial Plotter). На графике видны все четыре значения в реальном времени: сырые данные КГР, сглаженные данные, отклонение и пульс.
Все компоненты для этого проекта -- Arduino, резисторы, светодиоды, пьезозуммер и датчик пульса -- доступны в наборах Alashed Hardware, укомплектованных специально для школьных проектов. Для написания и загрузки кода используйте Alashed CodeStudio -- онлайн-среду разработки, в которой можно писать скетчи, компилировать и загружать их на плату прямо из браузера, без установки дополнительного ПО на школьные компьютеры.
Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.