Как вообще работают датчики
Датчик — это орган чувств Arduino. Свет, тепло, расстояние, влажность — всё это он превращает в то единственное, что понимает плата: в напряжение.
Любой датчик делает одно: переводит физическую величину в электрический сигнал. Понял этот принцип — и десятки разных датчиков становятся вариациями одной идеи.
Прежде чем подключать конкретные датчики, разберёмся в их общей логике. Это сэкономит часы: новый датчик перестанет быть загадкой, как только ты спросишь «он аналоговый или цифровой?».
Два больших класса датчиков
АНАЛОГОВЫЙ датчик: физика -> плавное напряжение -> analogRead -> 0..1023
(фоторезистор, термистор, потенциометр)
ЦИФРОВОЙ датчик: физика -> HIGH/LOW или цифровой протокол -> digitalRead
(датчик движения PIR, кнопка, ультразвук по импульсу)
- Аналоговые отдают плавно меняющееся напряжение. Читаются через analogRead, дают 0–1023. Пример: фоторезистор (чем светлее, тем иначе сопротивление).
- Цифровые отдают готовый сигнал HIGH/LOW или общаются по протоколу (один-два провода с данными). Пример: PIR-датчик движения выдаёт HIGH, когда что-то шевельнулось.
Как работает под капотом
Большинство простых аналоговых датчиков — это резисторы, меняющие сопротивление от физики. Фоторезистор меняет сопротивление от света, термистор — от температуры. Сами по себе они напряжение не выдают. Поэтому их включают в уже знакомый нам делитель напряжения: датчик + обычный резистор, а среднюю точку читаем через analogRead.
5V ---[ датчик-резистор ]---+--- A0
|
[ постоянный резистор 10кОм ]
|
GND
Меняется сопротивление датчика → меняется доля напряжения на A0 → меняется число. Вся «магия» датчиков сводится к этой схеме плюс немного математики.
Усреднение: борьба с шумом
Датчики «шумят»: соседние замеры скачут на единицы-десятки даже без изменений. Лекарство — усреднить несколько замеров. Это та логика, которую ты будешь применять почти к каждому датчику:
# Та же логика на Python: усреднение зашумлённых показаний датчика
def smooth(readings, window=5):
result = []
buffer = []
for r in readings:
buffer.append(r)
if len(buffer) > window:
buffer.pop(0) # держим окно последних N замеров
result.append(round(sum(buffer) / len(buffer)))
return result
noisy = [500, 540, 480, 520, 510, 700, 505, 495, 515, 500]
print("сырое: ", noisy)
print("сглажено: ", smooth(noisy, window=5))
Запусти — одиночный выброс 700 после усреднения почти исчезает. Так датчик перестаёт «дёргаться».
Частые ошибки
- Читают аналоговый датчик как цифровой (или наоборот) — и удивляются, почему «не работает».
- Забывают делитель напряжения для резистивных датчиков — пин плавает.
- Доверяют одному замеру — и ловят шум. Усредняй.
Best practices
- Первым делом узнай у датчика тип сигнала: аналоговый, цифровой вкл/выкл или по протоколу (I2C/OneWire).
- Для резистивных датчиков держи под рукой резистор 10 кОм для делителя.
- Почти всегда усредняй аналоговые показания скользящим окном — данные станут стабильнее.
Протоколы: I2C и OneWire в двух словах
Кроме «простых» аналоговых и цифровых датчиков есть умные, которые общаются по специальным протоколам — это как мини-язык для разговора чипов по проводам. Самый частый — I2C: всего два провода (SDA — данные, SCL — тактирование), и на них можно повесить сразу несколько устройств, у каждого свой адрес. По I2C работают дисплеи, датчики давления, часы реального времени. Другой — OneWire: один провод данных, по нему общаются, например, температурные датчики DS18B20.
Хорошая новость: тебе почти никогда не придётся реализовывать эти протоколы вручную. На каждый популярный датчик есть библиотека, которая прячет всю сложность: ты вызываешь sensor.read() и получаешь готовое число, а библиотека сама дёргает провода по правилам протокола. Поэтому при покупке нового датчика первым делом ищи его библиотеку и пример — это сэкономит часы. Принцип «датчик переводит физику в сигнал» остаётся, меняется лишь способ доставки этого сигнала плате.
Итоги
Датчик переводит физику в напряжение. Аналоговые — через делитель и analogRead, цифровые — через digitalRead или протокол. Шум лечится усреднением. С этой картой в голове разберём конкретные датчики — начнём со света.