Датчики: как Pi чувствует мир

Светодиоды позволяют Pi говорить с миром. Датчики дают ему противоположное — способность слушать и чувствовать.

Датчик — это орган чувств для компьютера. Один чувствует движение, другой — температуру, третий — свет. Задача программы — превратить эти ощущения в решения.

Представь, что ты заходишь в тёмную комнату. Глаза говорят мозгу «темно», уши ловят шаги, кожа чувствует холод — и мозг решает: включить свет, насторожиться, накинуть кофту. У Raspberry Pi нет глаз и кожи, но есть датчики, и работают они ровно по той же схеме: чувствуют что-то в реальном мире и сообщают программе. Без датчиков Pi умеет только командовать (зажги лампу, покрути мотор), но не умеет реагировать на происходящее. Именно датчики превращают железку в устройство, которое замечает мир вокруг.

Датчики бывают двух типов. Цифровые отвечают «да/нет»: есть движение или нет, нажато или нет. Аналоговые выдают плавную величину: температуру, яркость, влажность в виде непрерывного напряжения. Хорошая аналогия — выключатель и регулятор громкости. Выключатель знает только два положения, и это цифровой сигнал. А регулятор громкости плавно идёт от тишины до максимума — это аналог. Большинство «интересных» датчиков из реального мира (свет, звук, температура) по своей природе аналоговые, потому что природа не любит резких границ.

Как работает под капотом

Важная особенность: пины GPIO понимают только цифровые сигналы — 0 или 1, есть напряжение или нет. Поэтому цифровые датчики (датчик движения, кнопка) подключаются к Pi напрямую. А аналоговые (потенциометр, фоторезистор) нужно сначала пропустить через отдельную микросхему — АЦП (аналого-цифровой преобразователь), например MCP3008.

  Цифровой датчик          Аналоговый датчик
   (движение)               (яркость света)
       |                         |
    0 или 1                  плавное напряжение
       |                         |
    GPIO напрямую            [АЦП MCP3008] -> GPIO

Почему так? Внутри Pi у каждого пина есть простой «вахтёр», который умеет отвечать лишь на один вопрос: «напряжение выше порога или нет?». Порог примерно посередине между 0В и 3.3В. Если фоторезистор выдаёт 1.7В на ярком свету и 1.4В в тени, вахтёр в обоих случаях скажет одно и то же — он не различает оттенки, ему нужна чёткая граница. АЦП решает эту проблему: он берёт плавное напряжение и переводит его в число, например от 0 до 1023. Теперь «чуть темнее» и «совсем темно» — это разные числа, с которыми программа уже может работать.

   Аналоговое напряжение     ->   АЦП   ->   число
        0.0 В                         0
        1.65 В                      512
        3.3 В                      1023

Многие «умные» датчики общаются по специальным протоколам — I2C, SPI, 1-Wire. Это как языки общения: по одному-двум проводам датчик передаёт целые числа, а не просто 0/1. Эти протоколы включаются в настройках Pi. У каждого свой характер: I2C экономит провода и позволяет повесить несколько устройств на одну пару линий, SPI быстрее, но требует больше проводов, а 1-Wire вообще обходится одним сигнальным проводом и часто используется в датчиках температуры. Для тебя как программиста разница почти не видна — библиотека прячет детали, и ты просто читаешь готовое число.

Чтобы почувствовать, как из «сырого» числа АЦП получается понятная величина, разберём пересчёт в браузере. Это чистая математика, никакого железа. Попробуй сам ▶

# Перевод сырого значения АЦП (0..1023) в проценты яркости
raw_values = [0, 256, 512, 768, 1023]

for raw in raw_values:
    percent = raw / 1023 * 100
    status = "темно" if percent < 30 else ("сумерки" if percent < 70 else "светло")
    print(f"АЦП={raw:4d} -> {percent:5.1f}% ({status})")

Частые ошибки

  • Пытаются читать аналог напрямую. Pi не видит плавное напряжение без АЦП — будут случайные значения.
  • Забыли включить I2C/SPI. Многие датчики не заработают, пока протокол не включён в raspi-config.
  • Путают питание датчика. Одни датчики хотят 3.3В, другие 5В — проверяй документацию.
  • Подают 5В на пин GPIO. Сигнальные пины рассчитаны на 3.3В; лишний вольт может сжечь Pi — для 5В-датчиков нужен делитель напряжения.
  • Забывают про общую землю. Если датчик питается отдельно, его GND всё равно должен быть соединён с GND платы, иначе сигнал «плавает».

Best practices

  • Перед покупкой проверь, как датчик подключается: напрямую, через АЦП или по I2C/SPI.
  • Включи нужные протоколы в sudo raspi-config заранее.
  • Начни с простых цифровых датчиков — они подключаются как кнопка.
  • Заведи блокнот с распиновкой: какой провод куда идёт. Это спасёт часы отладки.
  • Сначала проверяй датчик отдельной программой «прочитай и выведи значение», и только потом встраивай в большой проект.

Запомни главное правило проектирования: датчик никогда не принимает решений сам — он лишь поставляет данные. Решение «включить свет» или «поднять тревогу» всегда принимает твой код. Поэтому даже если завтра ты поменяешь фоторезистор на более точный датчик, логика программы останется прежней. Эта граница между «измерить» и «решить» — основа всех проектов умного дома.

Итоги. Датчики бывают цифровые (0/1, подключаются напрямую) и аналоговые (плавная величина, нужен АЦП). Умные датчики говорят по I2C/SPI/1-Wire, а пины GPIO работают на 3.3В и понимают только «есть напряжение или нет». Дальше подключим датчик движения.

Проверьте себя
1. Почему аналоговый датчик нельзя подключить к GPIO напрямую?
AОн слишком дорогой
BПины GPIO понимают только цифровой сигнал (0/1), а аналоговый нужно сначала преобразовать через АЦП
CАналоговых датчиков не существует
DНе хватит пинов
2. Что такое I2C и SPI применительно к датчикам?
AМодели Raspberry Pi
BПротоколы (языки общения), по которым датчики передают данные по нескольким проводам
CВиды резисторов
DКоманды Linux