Геркон и Arduino: датчик двери, сигнализация и спидометр
Как работает геркон и как подключить его к Arduino: типы NO/NC, расстояние до магнита, подтяжка и антидребезг, дверная сигнализация, велоспидометр, код для ESP32 и Pico.
Геркон (герметизированный магнитоуправляемый контакт, reed switch) — простой датчик, который замыкает цепь, когда магнит притягивает друг к другу две тонкие металлические пластины внутри стеклянной колбы, а сам при этом совсем не потребляет энергии. На Arduino его читают точно так же, как кнопку: рядом с магнитом контакты замыкаются, а когда магнит удаляется, снова размыкаются. Эта крошечная стеклянная колба прячется в дверных и оконных сигнализациях, велокомпьютерах, поплавковых датчиках уровня и ветромерах.
В этом руководстве пошагово разберём, что находится внутри геркона, чем отличаются типы NO и NC, на каком расстоянии и в каком положении магнит работает лучше всего и как подключить геркон к Arduino с подтягивающим резистором. Затем справимся с дребезгом контактов программно, соберём сигнализацию открытой двери и велоспидометр, отправим на телефон уведомление «дверь открыта» с ESP32 и запустим ту же схему на Raspberry Pi Pico с MicroPython. В последних разделах геркон сравнивается с датчиком Холла и собраны самые частые ошибки.

Что такое геркон и как он работает?
Сердце геркона — маленькая стеклянная колба, заполненная инертным газом вроде азота или вакуумированная. С обоих концов в неё входят две гибкие пластины из железоникелевого сплава и перекрываются в середине с очень маленьким зазором; английское слово reed («язычок») относится именно к этим пластинам. Их кончики покрыты твёрдыми металлами, например родием или рутением: так контактное сопротивление остаётся низким, а износ уменьшается. Когда рядом появляется магнит, обе пластины намагничиваются, на перекрывающихся кончиках образуются противоположные полюса, и пластины притягиваются друг к другу. Когда магнит удаляется, упругость пластин снова разводит контакты. Стекло защищает контакты от пыли, влаги и окисления, поэтому при малом токе герконы выдерживают сотни миллионов срабатываний.
Продавцы часто называют эту деталь «герконовым реле» (reed relay), но технически стеклянная колба сама по себе — это геркон (reed switch). Настоящее герконовое реле — та же стеклянная колба с намотанной вокруг катушкой; там контакты замыкает не магнит, а ток через катушку. В этой статье речь о герконе, которым управляет магнит, и о модулях датчиков на его основе. Его главное преимущество в том, что он не потребляет энергии: через него течёт только ток твоей собственной схемы, поэтому он идеален для устройств, которые месяцами работают от батареек.
Технические характеристики геркона
| Параметр | Типичное значение (маленький стеклянный геркон) |
|---|---|
| Тип контакта | Чаще всего Form A (NO, нормально разомкнутый) |
| Стеклянный корпус | Диаметр около 2 мм, длина 10–15 мм |
| Коммутируемая мощность | До 10 W |
| Коммутируемое напряжение | До 100–200 V постоянного тока |
| Коммутируемый ток | Около 0,5 A |
| Контактное сопротивление | Меньше 0,1 Ω |
| Время срабатывания | Меньше 1 мс (с учётом дребезга) |
| Чувствительность | 10–40 AT (ампер-витков) |
| Ресурс | От 100 млн до 1 млрд срабатываний при малом токе |
| Собственное потребление | Нет (пассивный компонент) |
Чувствительность указывают в AT (ампер-витках): это произведение тока на число витков, нужное, чтобы замкнуть геркон в стандартной испытательной катушке. Чем меньше значение, тем более слабый магнит может его замкнуть, то есть тем с большего расстояния он срабатывает. Есть и гистерезис: поле, нужное для замыкания контактов (срабатывание), сильнее, чем поле, достаточное, чтобы удерживать их замкнутыми (отпускание). Например, геркон, который магнит замыкает на 15 мм, может разомкнуться только примерно на 20 мм. Эта разница уменьшает дребезг от мелких вибраций, но в конструкции важно, чтобы магнит отходил и дальше расстояния отпускания.
Герконы NO, NC и переключающие (Form A, B, C)
По расположению контактов герконы бывают трёх видов. Обозначения NO (нормально разомкнутый) и NC (нормально замкнутый) всегда описывают состояние контактов без магнита.
| Тип | Без магнита | Магнит рядом | Выводы | Где применяется? |
|---|---|---|---|---|
| Form A (NO) | Разомкнут | Замкнут | 2 | Датчики двери, счётчики скорости, большинство модулей |
| Form B (NC) | Замкнут | Разомкнут | 2 | Задачи, где цепь должна замыкаться, когда магнит удаляется |
| Form C (переключающий) | COM–NC замкнуты | COM–NO замкнуты | 3 | Схемы, которым нужны и разомкнутый, и замкнутый выход |
Срабатывание от магнита: расстояние, ориентация и чувствительность
Лучше всего геркон срабатывает от маленького неодимового магнита. Неодимовый диск 10×3 мм обычно замыкает распространённый геркон с 10–20 мм; чёрный ферритовый магнит того же размера сокращает это расстояние примерно вдвое. Готовые дверные датчики обычно срабатывают на 15–25 мм. Расстояние зависит не только от силы магнита, но и от его ориентации: если держать ось север–юг магнита параллельно стеклянной колбе и подносить его к середине, получается одно чистое замыкание. Если магнит перпендикулярен колбе, ровно посередине он может не сработать вовсе, а сработать в двух точках ближе к концам. Параллельный магнит, который ведут вдоль колбы, тоже создаёт по обе стороны от основной зоны небольшие дополнительные зоны замыкания. Поэтому, пока магнит проходит мимо геркона, контакты могут замкнуться и разомкнуться два-три раза; это самая частая причина, по которой в проектах со счётом один оборот засчитывается как два или три.

- Полярность не важна: геркон одинаково реагирует на северный и южный полюс; если перевернуть магнит, результат не изменится.
- Выравнивай магнит по середине колбы: в дверных датчиках магнит и корпус геркона должны располагаться рядом и параллельно, с как можно меньшим зазором.
- Стальные двери сокращают расстояние: железо стягивает поле магнита на себя. Подними датчик и магнит пластиковой прокладкой на 5–10 мм или возьми магнит посильнее.
- Сначала измерь расстояние: открой монитор порта и медленно приближай магнит к геркону и отводи его. При закрытой двери магнит должен быть с запасом в пределах расстояния срабатывания, а когда дверь чуть приоткрыта, уже за пределами расстояния отпускания.
- Держи подальше от сильных полей: динамики, моторы и другие магниты могут случайно замкнуть геркон; не ставь его вплотную к ним.
Подключение геркона к Arduino: почему без подтягивающего резистора не обойтись?
Геркон ведёт себя как кнопка, поэтому сам по себе напряжения не создаёт: он лишь соединяет или разъединяет два своих вывода. Пока контакты разомкнуты, пин ни к чему не подключён («висит в воздухе»), и из-за помех читаются случайные HIGH и LOW. Решение — подтягивающий резистор (pull-up): пин подтягивается через резистор к 5 V (или к 3,3 V), а геркон ставится между пином и GND. Без магнита пин читает HIGH; когда магнит замыкает контакты, пин соединяется напрямую с GND и читает LOW. У Arduino Uno есть встроенный подтягивающий резистор на 20–50 kΩ, поэтому достаточно написать pinMode(pin, INPUT_PULLUP), и внешний резистор не нужен. Подробнее об этой логике — в руководстве Как подключить кнопку к Arduino.
| Подключение | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Вывод геркона 1 (голый геркон) | D2 | GPIO 27 | GP15 (физический пин 20) |
| Вывод геркона 2 (голый геркон) | GND | GND | GND |
| Подтяжка (pull-up) | Встроенная (INPUT_PULLUP) | Встроенная (INPUT_PULLUP) | Встроенная (Pin.PULL_UP) |
| VCC модуля | 5V | 3V3 | 3V3(OUT) (физический пин 36) |
| GND модуля | GND | GND | GND |
| DO модуля | D2 | GPIO 27 | GP15 |
| Светодиод состояния | D13 (встроенный светодиод) | GPIO 2 (встроенный светодиод) | Встроенный светодиод |
| Активный зуммер (+) | D8 | Не используется | GP14 |
Первая схема шаг за шагом: обнаруживаем магнит
- Подключи один вывод геркона к пину D2 на Arduino, а другой — к GND. У голого геркона нет полярности, так что направление выводов не важно.
- Если используешь модуль, подключи VCC к 5V, GND к GND, а выход DO к D2.
- Загрузи код ниже и открой монитор порта на скорости 9600 бод.
- Медленно приближай магнит, держа его параллельно стеклянной колбе; встроенный светодиод должен загореться, а на экране — появиться «magnet detected» (магнит обнаружен).
- Отводя магнит, измерь линейкой, на каком расстоянии светодиод гаснет; это и есть расстояние отпускания для твоего геркона.
1const byte REED_PIN = 2; // reed: D2 ile GND arasında / reed between D2 and GND
2const byte LED_PIN = 13; // karttaki LED / onboard LED
3
4void setup() {
5 Serial.begin(9600);
6 pinMode(REED_PIN, INPUT_PULLUP); // dahili pull-up: mıknatıs yokken HIGH / internal pull-up: HIGH without a magnet
7 pinMode(LED_PIN, OUTPUT);
8}
9
10void loop() {
11 if (digitalRead(REED_PIN) == LOW) { // kontak kapalı: mıknatıs yakında / contacts closed: magnet nearby
12 digitalWrite(LED_PIN, HIGH);
13 Serial.println(F("Miknatis var / magnet detected"));
14 } else { // kontak açık: mıknatıs uzakta / contacts open: magnet away
15 digitalWrite(LED_PIN, LOW);
16 Serial.println(F("Miknatis yok / no magnet"));
17 }
18 delay(200);
19}Единственное, на что нужно обратить внимание в коде, — инверсная логика: из-за INPUT_PULLUP при магните читается LOW, а без него — HIGH. На 3-выводных модулях с LM393 выход тоже обычно уходит в LOW, когда приближается магнит, и на плате загорается светодиод DO; но это может отличаться от модели к модели, поэтому сначала проверь свой модуль в мониторе порта. Потенциометр на модуле задаёт порог компаратора; геркон и так работает по принципу «вкл/выкл», поэтому на дальность срабатывания потенциометр почти не влияет, и обычно достаточно оставить его в среднем положении. На мини-модулях вроде KY-021 компаратора нет: на плате только геркон и резистор на 10 kΩ.
Антидребезг: дребезг контактов и вибрация
Как и любой механический контакт, геркон при замыкании может несколько раз подпрыгнуть. У геркона этот дребезг очень короткий, обычно меньше 1 мс, но главная проблема не в нём. Если магнит медленно движется на границе расстояния срабатывания или дверь дрожит от ветра, контакты могут за секунду много раз разомкнуться и замкнуться. Из-за этого система, отправляющая уведомление об открытой двери, может прислать пять сообщений за одно открытие. Решение — не принимать каждое изменение сразу, а дождаться, пока состояние продержится без изменений определённое время. Для дверного датчика хватает 50–100 мс; для счётчика скорости хорошо работает время блокировки, равное кратчайшему физически возможному интервалу между двумя импульсами.
Если нужно аппаратное решение, поставь между пином и GND конденсатор на 100 nF. Вместе с подтяжкой 10 kΩ это даёт постоянную времени τ = R × C = 10 kΩ × 100 nF = 1 мс, которая сглаживает очень короткий дребезг. Другие пары резисторов и конденсаторов можно попробовать в утилите постоянной времени RC. Со встроенной подтяжкой сопротивление составляет 20–50 kΩ, поэтому время растёт до 2–5 мс. На дверных датчиках с кабелем в несколько метров внешняя подтяжка 4,7–10 kΩ вместе с этим конденсатором защищает ещё и от помех.
Проект: датчик открытия двери и окна с сигнализацией
Самый популярный проект с герконом — датчик двери. Магнит крепится на подвижную створку двери, а геркон — на коробку; когда дверь закрыта, они стоят рядом, контакты замкнуты, и пин читает LOW. Когда дверь открывается, магнит удаляется, и пин переходит в HIGH. У такой схемы есть приятный побочный эффект: если кто-то перережет кабель датчика, пин тоже перейдёт в HIGH, и система воспримет это как «дверь открыта». Именно поэтому охранные системы используют замкнутый шлейф. Код ниже считает каждое открытие, измеряет, сколько дверь остаётся открытой, и прерывисто пищит зуммером, если дверь открыта дольше 30 секунд; идеально для двери холодильника или морозильника.
1const byte REED_PIN = 2; // reed: D2 ile GND arası / reed between D2 and GND
2const byte BUZZER_PIN = 8; // aktif buzzer artı ucu / active buzzer positive leg
3const byte LED_PIN = 13; // karttaki LED / onboard LED
4const unsigned long STABLE_MS = 50; // debounce: 50 ms değişmeden kalmalı / debounce: must hold for 50 ms
5const unsigned long OPEN_LIMIT = 30000; // 30 sn'den uzun açık kalırsa alarm / alarm if open longer than 30 s
6
7bool doorOpen = false; // onaylanmış durum / confirmed state
8bool lastReading = false; // son ham okuma / last raw reading
9unsigned long lastChange = 0; // ham okumanın son değiştiği an / when the raw reading last changed
10unsigned long openedAt = 0; // kapının açıldığı an / when the door was opened
11unsigned int openCount = 0; // toplam açılış / total openings
12
13void setup() {
14 Serial.begin(9600);
15 pinMode(REED_PIN, INPUT_PULLUP);
16 pinMode(BUZZER_PIN, OUTPUT);
17 pinMode(LED_PIN, OUTPUT);
18 doorOpen = (digitalRead(REED_PIN) == HIGH); // açılıştaki durumu al / take the state at boot
19 lastReading = doorOpen;
20}
21
22void loop() {
23 unsigned long now = millis();
24 bool reading = (digitalRead(REED_PIN) == HIGH); // HIGH: mıknatıs uzak, kapı açık / HIGH: magnet away, door open
25
26 if (reading != lastReading) { // ham değer değişti, sayacı yeniden başlat / raw value changed, restart the timer
27 lastReading = reading;
28 lastChange = now;
29 }
30
31 if (reading != doorOpen && now - lastChange >= STABLE_MS) { // 50 ms kararlı: gerçek değişim / stable for 50 ms: real change
32 doorOpen = reading;
33 if (doorOpen) {
34 openedAt = now;
35 openCount++;
36 Serial.print(F("Kapi acildi / door opened, sayac / count: "));
37 Serial.println(openCount);
38 } else {
39 Serial.print(F("Kapi kapandi / door closed, sure / duration (s): "));
40 Serial.println((now - openedAt) / 1000);
41 }
42 }
43
44 digitalWrite(LED_PIN, doorOpen ? HIGH : LOW); // LED kapı açıkken yanar / LED is on while the door is open
45
46 // Uzun süre açık kalırsa çeyrek saniyede bir öt / beep every quarter second if left open too long
47 bool alarm = doorOpen && (now - openedAt > OPEN_LIMIT);
48 digitalWrite(BUZZER_PIN, (alarm && (now / 250) % 2) ? HIGH : LOW);
49}Код не использует delay(), поэтому цикл постоянно проверяет пин и не пропускает ни одного открытия; этот приём подробно разобран в статье millis и delay. Каждый раз, когда меняется сырое показание, время lastChange сбрасывается, а состояние doorOpen меняется, только если значение держится неизменным 50 мс. Часть с зуммером делит millis() на 250, чтобы включать и выключать его каждую четверть секунды. Чтобы превратить это в настоящую сигнализацию, можно ставить её на охрану и снимать с охраны кодом с матричной клавиатуры и добавить в комнату PIR-датчик движения. Более полная система описана в статье Сигнализация на Arduino.
Велоспидометр: считаем обороты герконом
Большинство велокомпьютеров состоит из геркона и маленького магнита, закреплённого на спице. При каждом обороте колеса магнит один раз проходит мимо геркона на вилке и создаёт импульс. Измерь время между двумя импульсами — получишь скорость; посчитай импульсы — получишь пройденное расстояние: скорость (км/ч) = длина окружности (мм) / время (мс) × 3,6. Здесь мм/мс в точности равно м/с, а умножение на 3,6 переводит результат в км/ч. Например, для колеса 700x25C с окружностью 2105 мм интервал 253 мс между импульсами означает 2105 / 253 × 3,6 ≈ 30 км/ч. Точнее всего окружность находят так: ставят колесо ниппелем вниз, прокатывают ровно на один оборот и измеряют расстояние между двумя отметками на земле.
| Размер шины | Примерная длина окружности | Время одного оборота при 30 км/ч |
|---|---|---|
| 20x1.75 (BMX, детский велосипед) | 1515 мм | 182 мс |
| 26x2.1 (горный велосипед) | 2068 мм | 248 мс |
| 29x2.1 (горный велосипед) | 2288 мм | 275 мс |
| 700x25C (шоссейный велосипед) | 2105 мм | 253 мс |
| 700x28C (городской, гравийный) | 2136 мм | 256 мс |
1const byte REED_PIN = 2; // kesme pini D2 (INT0) / interrupt pin D2 (INT0)
2const float WHEEL_MM = 2105.0; // 700x25C tekerlek çevresi (mm) / 700x25C wheel circumference (mm)
3const unsigned long LOCKOUT_MS = 80; // daha sık darbe imkânsız (~95 km/sa) / faster pulses are impossible (~95 km/h)
4const unsigned long TIMEOUT_MS = 3000; // 3 sn darbe yoksa hız 0 / no pulse for 3 s means speed 0
5
6volatile unsigned long lastPulseMs = 0; // son geçerli darbe zamanı / time of the last valid pulse
7volatile unsigned long periodMs = 0; // son iki darbe arası süre / time between the last two pulses
8volatile unsigned long revCount = 0; // toplam tur / total revolutions
9
10void onMagnet() { // ISR: kısa ve hızlı / ISR: short and fast
11 unsigned long now = millis();
12 unsigned long dt = now - lastPulseMs;
13 if (dt < LOCKOUT_MS) return; // sıçrama ya da çift darbe: yok say / bounce or double pulse: ignore
14 periodMs = (dt < TIMEOUT_MS) ? dt : 0; // uzun duraklamadan sonraki ilk darbe hız vermez / first pulse after a stop gives no speed
15 lastPulseMs = now;
16 revCount++;
17}
18
19void setup() {
20 Serial.begin(9600);
21 pinMode(REED_PIN, INPUT_PULLUP);
22 attachInterrupt(digitalPinToInterrupt(REED_PIN), onMagnet, FALLING); // mıknatıs gelince HIGH->LOW / HIGH->LOW when the magnet arrives
23}
24
25void loop() {
26 static unsigned long lastPrint = 0;
27 if (millis() - lastPrint < 500) return; // saniyede 2 kez yaz / print twice per second
28 lastPrint = millis();
29
30 noInterrupts(); // çok baytlı değerleri güvenle kopyala / copy multi-byte values safely
31 unsigned long period = periodMs;
32 unsigned long last = lastPulseMs;
33 unsigned long revs = revCount;
34 interrupts();
35
36 float speedKmh = 0;
37 if (period > 0 && millis() - last < TIMEOUT_MS) {
38 speedKmh = WHEEL_MM / period * 3.6; // mm/ms = m/s; 3,6 ile çarp = km/sa / multiply by 3.6 = km/h
39 }
40 float distanceKm = revs * WHEEL_MM / 1000000.0; // tur x çevre / revolutions x circumference
41
42 Serial.print(F("Hiz / speed: "));
43 Serial.print(speedKmh, 1);
44 Serial.print(F(" km/h Mesafe / distance: "));
45 Serial.print(distanceKm, 3);
46 Serial.println(F(" km"));
47}Импульс ловится через attachInterrupt, поэтому ни один оборот не теряется, как бы ни был занят loop(); на Arduino Uno такие прерывания дают только пины D2 и D3. Значение LOCKOUT_MS очень важно: 80 мс соответствуют максимальной скорости около 95 км/ч на колесе 2105 мм (2105 / 80 × 3,6). Импульсы, приходящие чаще, физически невозможны, поэтому они отбрасываются как дребезг, боковые зоны замыкания магнита или подпрыгивание контакта при размыкании. Если импульсов нет 3 секунды, скорость считается нулевой. С той же структурой можно измерять частоту вращения мотора или колеса в оборотах в минуту: об/мин (RPM) = 60000 / время (мс). Подробнее о прерываниях — в руководстве Прерывания в Arduino; чтобы показывать скорость на дисплее на руле, объедини код с OLED-дисплеем.
Геркон или датчик Холла?
Второй способ обнаружить магнит — датчик Холла. Он превращает магнитное поле в электрический сигнал внутри полупроводниковой микросхемы; движущихся частей у него нет, но для работы ему нужно питание. Короткое правило: для дверного или оконного датчика, который долго работает от батареек и срабатывает редко, выбирай геркон; для быстрого и непрерывного счёта, например мотора, вентилятора или датчика расхода воды, вращающихся десятки раз в секунду, лучше подходит датчик Холла.
| Параметр | Геркон | Датчик Холла (A3144, US1881, 49E) |
|---|---|---|
| Принцип работы | Механический контакт, замыкается магнитом | Полупроводник, превращает поле в электрический сигнал |
| Питание | Не нужно, сам энергию не потребляет | Нужно (несколько mA) |
| Скорость переключения | Сотни раз в секунду | До десятков тысяч Hz |
| Дребезг контактов | Есть (меньше 1 мс) | Нет |
| Ресурс | Механический износ, 100 млн – 1 млрд срабатываний | Нет движущихся частей, не изнашивается |
| Различение полюсов | Нет, реагирует на оба полюса | В зависимости от модели: униполярный, биполярный или с защёлкой |
| Аналоговое измерение | Нет, только разомкнут или замкнут | Линейные модели (49E) измеряют напряжённость поля |
| Коммутация нагрузки | Может напрямую коммутировать небольшие нагрузки AC/DC | Только сигнальный выход |
| Прочность | Стеклянная колба боится ударов и изгиба | Пластиковый корпус, устойчив к ударам |
Уведомление об открытой двери с ESP32 (Telegram)
Благодаря Wi-Fi у ESP32 дверной датчик может отправить сообщение на телефон в тот же момент, когда открывается дверь. Для этого нужно создать бота через BotFather в Telegram, получить его токен и свой chat ID (ID чата), а в Arduino IDE установить библиотеки UniversalTelegramBot и ArduinoJson; эти шаги подробно описаны в статье Telegram-бот на ESP32. Подключи один вывод геркона к GPIO 27, а другой — к GND. Код отправляет сообщение, когда дверь открывается и закрывается, напоминает, если дверь открыта дольше 5 минут, а если в этот момент нет Wi-Fi, повторяет отправку через 10 секунд.
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi"; // Wi-Fi adın (yalnız 2,4 GHz) / your Wi-Fi name (2.4 GHz only)
7const char* WIFI_PASS = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // BotFather'ın verdiği token / token from BotFather
9#define CHAT_ID "123456789" // bildirimin gideceği ID / the ID that receives alerts
10
11const int REED_PIN = 27; // reed: GPIO 27 ile GND arası / reed between GPIO 27 and GND
12const int LED_PIN = 2; // çoğu DevKit'te dahili LED / onboard LED on most DevKits
13const unsigned long STABLE_MS = 100; // değişim 100 ms sürmeli / a change must last 100 ms
14const unsigned long REMIND_MS = 300000; // 5 dk açık kalırsa hatırlat / remind after 5 min open
15const unsigned long RETRY_MS = 10000; // gönderilemeyen mesajı 10 sn sonra dene / retry a failed message after 10 s
16
17WiFiClientSecure client; // şifreli (HTTPS) bağlantı / encrypted (HTTPS) connection
18UniversalTelegramBot bot(BOT_TOKEN, client);
19
20bool doorOpen = false; // onaylanmış kapı durumu / confirmed door state
21bool lastRaw = false; // son ham okuma / last raw reading
22unsigned long lastChange = 0;
23unsigned long openedAt = 0;
24bool reminded = false;
25String pending = ""; // gönderilmeyi bekleyen mesaj / message waiting to be sent
26unsigned long lastTry = 0;
27
28void notify(const String& text) {
29 Serial.println(text);
30 if (WiFi.status() == WL_CONNECTED && bot.sendMessage(CHAT_ID, text)) {
31 pending = ""; // gönderildi / sent
32 } else {
33 pending = text; // Wi-Fi yoksa sonra dene / no Wi-Fi: try again later
34 lastTry = millis();
35 }
36}
37
38void setup() {
39 Serial.begin(115200);
40 pinMode(REED_PIN, INPUT_PULLUP); // dahili pull-up; GPIO 34-39'da yoktur / internal pull-up; GPIO 34-39 have none
41 pinMode(LED_PIN, OUTPUT);
42
43 WiFi.mode(WIFI_STA);
44 WiFi.begin(WIFI_SSID, WIFI_PASS);
45 Serial.print("Wi-Fi'ye baglaniyor / connecting to Wi-Fi");
46 while (WiFi.status() != WL_CONNECTED) {
47 delay(500);
48 Serial.print(".");
49 }
50 Serial.println();
51 Serial.println(WiFi.localIP());
52 client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // api.telegram.org kök sertifikası / root certificate of api.telegram.org
53
54 doorOpen = (digitalRead(REED_PIN) == HIGH); // HIGH = mıknatıs uzak = kapı açık / HIGH = magnet away = door open
55 lastRaw = doorOpen;
56 openedAt = millis();
57 digitalWrite(LED_PIN, doorOpen ? HIGH : LOW);
58 notify(String("Kapı sensörü hazır, kapı ") + (doorOpen ? "AÇIK" : "KAPALI") + " / door sensor ready");
59}
60
61void loop() {
62 unsigned long now = millis();
63 bool raw = (digitalRead(REED_PIN) == HIGH);
64
65 if (raw != lastRaw) { // ham değer değişti / raw value changed
66 lastRaw = raw;
67 lastChange = now;
68 }
69
70 if (raw != doorOpen && now - lastChange >= STABLE_MS) { // kararlı değişim / stable change
71 doorOpen = raw;
72 digitalWrite(LED_PIN, doorOpen ? HIGH : LOW);
73 if (doorOpen) {
74 openedAt = now;
75 reminded = false;
76 notify("Kapı AÇILDI! / door OPENED!");
77 } else {
78 unsigned long sec = (now - openedAt) / 1000;
79 notify("Kapı kapandı / door closed (" + String(sec) + " sn)");
80 }
81 }
82
83 if (doorOpen && !reminded && now - openedAt > REMIND_MS) { // açık unutuldu / left open
84 reminded = true;
85 notify("Kapı 5 dakikadır açık! / door open for 5 minutes!");
86 }
87
88 if (pending.length() > 0 && now - lastTry > RETRY_MS) { // bekleyen mesajı yeniden dene / retry the pending message
89 String msg = pending;
90 notify(msg);
91 }
92}Отправка сообщения в Telegram может занять 1–2 секунды, и всё это время цикл ждёт; но конечный автомат после отправки снова читает пин, поэтому последнее состояние двери никогда не теряется. Если датчик должен работать от батареек, отправляй ESP32 в глубокий сон и используй esp_sleep_enable_ext0_wakeup(GPIO_NUM_27, 1), чтобы плата просыпалась, когда дверь открывается и пин переходит в HIGH. Если перед сном выставлять уровень пробуждения противоположным текущему состоянию пина, плата будет просыпаться и при открытии, и при закрытии. В этом случае учитывай и ток через подтягивающий резистор: пока дверь закрыта, геркон замкнут, и через резистор 10 kΩ постоянно течёт 3,3 V / 10 kΩ = 330 µA; со 100 kΩ ток падает до 33 µA. В глубоком сне надёжнее всего использовать внешний резистор вместо встроенной подтяжки. Время работы от батареи можно оценить в калькуляторе времени работы от батареи.
Геркон на Raspberry Pi Pico с MicroPython
Чтобы прочитать геркон на Raspberry Pi Pico, хватит нескольких строк на MicroPython. Подключи геркон между GP15 и GND, затем плюс активного зуммера к GP14, а минус — к GND. Pico работает от 3,3 V, поэтому модуль всегда питай от пина 3V3(OUT); если запитать модуль от 5 V, его выход DO поднимется до 5 V и может повредить вход Pico. Встроенная подтяжка Pico около 50–80 kΩ, и для коротких проводов этого достаточно.
1from machine import Pin
2import time
3
4reed = Pin(15, Pin.IN, Pin.PULL_UP) # reed: GP15 ile GND arası / reed between GP15 and GND
5buzzer = Pin(14, Pin.OUT) # aktif buzzer artı ucu / active buzzer positive leg
6led = Pin("LED", Pin.OUT) # dahili LED (Pico ve Pico W) / onboard LED (Pico and Pico W)
7
8STABLE_MS = 50 # debounce süresi / debounce time
9door_open = reed.value() == 1 # 1 = mıknatıs uzak = kapı açık / 1 = magnet away = door open
10last_raw = door_open
11last_change = time.ticks_ms()
12open_count = 0
13led.value(door_open)
14
15while True:
16 raw = reed.value() == 1
17 now = time.ticks_ms()
18 if raw != last_raw: # ham değer değişti / raw value changed
19 last_raw = raw
20 last_change = now
21 if raw != door_open and time.ticks_diff(now, last_change) >= STABLE_MS:
22 door_open = raw # 50 ms kararlı: gerçek değişim / stable for 50 ms: real change
23 led.value(door_open)
24 if door_open:
25 open_count += 1
26 print("Kapi acildi / door opened:", open_count)
27 buzzer.on()
28 time.sleep_ms(100) # kısa bip / short beep
29 buzzer.off()
30 else:
31 print("Kapi kapandi / door closed")
32 time.sleep_ms(5)Код строит ту же логику антидребезга, что и на Arduino, с помощью time.ticks_ms() и time.ticks_diff(); ticks_diff возвращает правильную разницу, даже когда счётчик переполняется. Для импульсов, которые нельзя пропустить, например в счётчике скорости, можно использовать прерывание reed.irq(trigger=Pin.IRQ_FALLING, handler=...). Если у тебя Pico W, добавь к этому коду пример для Pico W из статьи про Telegram-бота, чтобы отправлять то же событие на телефон по Wi-Fi. Если Pico в руках впервые, начни с руководства Что такое Raspberry Pi Pico.
Идеи проектов с герконом
- Беспроводной датчик двери и окна: сообщай на телефон о каждом открытии дома с помощью ESP32 или отправляй события в Home Assistant по MQTT.
- Напоминалка о двери холодильника: прерывистый писк, если дверь открыта дольше 30 секунд.
- Велокомпьютер: показывай на дисплее текущую скорость, общий пробег и среднюю скорость.
- Ветромер и осадкомер: на метеостанциях чашечный анемометр даёт один импульс геркона за оборот, а осадкомер с опрокидывающимся ковшом — один импульс за каждое опрокидывание.
- Поплавковый датчик уровня: магнит внутри поплавка замыкает и размыкает геркон в стержне и сообщает, что бак полон; подробности — в статье Датчик уровня воды.
- Замок потайного ящика: сделай соленоидный замок, который открывается, только если поднести магнит в нужное место.
- Уведомление о почте: геркон на крышке почтового ящика будит ESP32 из глубокого сна, когда приходит письмо.
Частые ошибки и как их исправить
- Пин читает случайные значения: нет подтяжки. Выставь pinMode в INPUT_PULLUP или добавь внешний подтягивающий резистор на 10 kΩ.
- Логика перевёрнута: с подтяжкой при магните читается LOW; возможно, код ждёт HIGH или датчик типа NC. Проверь мультиметром.
- Несколько срабатываний за одно открытие: нет антидребезга, или магнит проходит через боковые зоны замыкания. Добавь время устойчивости и выровняй магнит параллельно колбе.
- Геркон вообще не замыкается: магнит слабый, расстояние слишком большое, магнит стоит перпендикулярно середине колбы или стальная дверь поглощает поле. Возьми неодимовый магнит посильнее и пластиковую прокладку.
- Геркон всё время замкнут: контакты могли свариться из-за слишком большого тока или ёмкостной нагрузки. Никогда не управляй мотором, лампой или катушкой реле напрямую через геркон; коммутируй нагрузки модулем реле или транзистором.
- Треснула стеклянная колба: выводы согнули слишком близко к корпусу. Держи вывод плоскогубцами, сгибай его не ближе 2–3 мм от стекла и паяй быстро.
- Ложные тревоги на длинных проводах: встроенная подтяжка слишком слабая. Используй внешнюю подтяжку 4,7–10 kΩ, конденсатор 100 nF на пине и кабель «витая пара».
Геркон — дешёвый и чрезвычайно надёжный датчик, который обнаруживает магнит, совсем не потребляя энергии; при правильной ориентации магнита, подтягивающем резисторе и нескольких строках антидребезга он годами работает без проблем. В приложении BlueGrays есть проекты «Чтение геркона» и «Датчик двери на герконе», а также такие проекты, как «Сигнализация движения на ESP32» и сигнализация с уведомлениями в Telegram, с пошаговыми схемами подключения и кодом.
Частые вопросы
Как работает геркон?
Геркон состоит из двух пластин из железоникелевого сплава внутри стеклянной колбы. Когда рядом появляется магнит, пластины намагничиваются, притягиваются друг к другу, и контакты замыкаются; когда магнит удаляется, упругость пластин их разводит. Сам он энергии не потребляет, а на Arduino читается точно так же, как кнопка.
Геркон нормально разомкнутый или нормально замкнутый?
Самые распространённые герконы — NO (нормально разомкнутые, Form A): без магнита разомкнуты, а рядом с магнитом замкнуты. Бывают и варианты NC (Form B), и переключающие с тремя выводами (Form C). Но на охранных дверных контактах пометка «NC» означает, что цепь замкнута, пока дверь закрыта и магнит рядом, поэтому надёжнее всего проверить мультиметром.
С какого расстояния магнит замыкает геркон?
Это зависит от силы магнита и чувствительности геркона. Маленький неодимовый магнит обычно замыкает распространённые герконы с 1–2 см, а готовые дверные датчики срабатывают на 15–25 мм; с ферритовыми магнитами расстояние примерно вдвое меньше. Расстояние увеличивается, если держать магнит параллельно колбе и подальше от стальных поверхностей.
Нужен ли геркону резистор?
Входу Arduino нужен подтягивающий (pull-up) или стягивающий (pull-down) резистор; иначе, пока контакты разомкнуты, пин «висит в воздухе» и читает случайные значения. У Arduino, ESP32 и Pico есть встроенная подтяжка, которую включают через INPUT_PULLUP или Pin.PULL_UP, поэтому внешний резистор обычно не нужен. На длинных проводах внешний резистор 4,7–10 kΩ даёт более стабильный результат.
Чем геркон отличается от датчика Холла?
Геркон — механический контакт: ему не нужно питание, и он может напрямую коммутировать небольшие нагрузки, но у него есть дребезг, а стеклянная колба хрупкая. Датчик Холла — полупроводниковый: ему нужно питание, дребезга нет, и он гораздо быстрее. Для дверных датчиков на батарейках выбирают геркон, для быстрого счёта оборотов — датчик Холла.
Можно ли герконом включать сетевую лампу?
Маленькие стеклянные герконы обычно выдерживают не больше 10 W коммутируемой мощности, поэтому если напрямую включать ими сетевую лампу или мотор, контакты сварятся, и это опасно. Подключай геркон к Arduino только как источник сигнала, сетевую нагрузку коммутируй модулем реле и при работе с сетевым напряжением всегда соблюдай правила безопасности.
Что собрать после прочтения
Все проекты
Чтение геркона
Интересно, что за магнитный выключатель стоит в сигнализации на дверях и окнах? Когда к модулю геркона подносят магнит, крошечный контакт внутри замыкается; Arduino читает его раз в секунду и выводит

Датчик двери на герконе
Узнай, открыта дверь или закрыта, просто взглянув на огонёк. Маленький магнит крепится на дверь, а чувствительный к магниту контакт — на раму; когда дверь закрыта, они рядом, и горит зелёный светодиод

Управление светодиодом кнопкой (удержание)
Как дверной звонок: свет горит, пока ты нажимаешь, и гаснет, когда отпускаешь. Arduino всё время слушает кнопку; пока она нажата, светодиод горит, а как только ты убираешь палец, он гаснет. Эта просте

Управление светодиодом кнопкой на ESP32 (удержание)
Светодиод горит, когда кнопка нажата, и гаснет, когда её отпускают. Показывает, как используются цифровой входной пин ESP32 и встроенный подтягивающий резистор. Режим INPUT_PULLUP избавляет от внешнего резистора.

Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)
Умная охранная сигнализация, которая при обнаружении движения PIR-датчиком включает зуммер и светодиод и одновременно сразу отправляет владельцу уведомление в Telegram. В ней есть 30-секундная пауза, ограничивающая частоту повторных тревог; этот механизм не проверяет срабатывания PIR и не устраняет ложные тревоги. Подходит для дома, гаража, склада или мастерской. С ESP32-CAM можно добавить уведомления с фото, а с обычной ESP32 DevKit V1 приходят текстовые.

Антидребезг кнопки на Pico: IRQ против программного опроса
Нажимаешь кнопку один раз, а код насчитывает 3–4? Это дребезг контактов — металлические контакты колеблются доли миллисекунды! Сравни в мониторе два способа подсчёта рядом: сырой опрос (ловит дребезг и считает лишнее) и IRQ + программный антидребезг (точно). Изучи физику дребезга, программный антидребезг (ticks_diff() > 50ms), регистрацию прерывания Pin.irq(), триггер IRQ_FALLING, обработчики ISR и безопасность global в ISR.

Лазерная охранная система
Совсем как сцены ограблений с лазерами в фильмах: лазерный луч светит на датчик освещённости, и как только кто-то входит и прерывает луч, загорается красный светодиод и начинает звучать зуммер. Сигнал
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

