Урок 8. Датчики и библиотеки
Датчик превращает что-то из окружающего мира — расстояние, температуру, свет, движение — в сигнал, который плата может прочитать. Для многих датчиков уже написаны библиотеки — готовый код, который берёт на себя общение с датчиком. В этом уроке — оба пути: датчик без библиотек и датчик с библиотекой.
Какие бывают датчики
По тому, как они передают данные, датчики делятся на несколько видов:
| Вид | Как читается | Примеры |
|---|---|---|
| Да или нет | digitalRead, как кнопка | датчик движения, датчик наклона, геркон |
| Напряжение | analogRead | фоторезистор, потенциометр, датчик влажности почвы |
| Длина импульса | pulseIn | ультразвуковой датчик расстояния HC-SR04 |
| Цифровой обмен | библиотека | DHT11 и DHT22, DS18B20, датчики и дисплеи на шине I2C |
Датчики чаще продаются модулями — на маленькой плате с нужными резисторами и подписанными выводами: VCC (питание), GND, OUT или DATA (сигнал). Перед подключением посмотрите в описании модуля, от какого напряжения он работает: от 5 В или только от 3,3 В. Модуль на 3,3 В, подключённый к 5 В, может сгореть.
Датчик расстояния HC-SR04 — без библиотеки
HC-SR04 измеряет расстояние ультразвуком, как летучая мышь: посылает короткий звук и ждёт эхо. У него четыре вывода: VCC → 5V, GND → GND, Trig → вывод 9, Echo → вывод 10.
Измерение такое: на Trig подают импульс 10 микросекунд, датчик посылает звук и выставляет на Echo импульс HIGH, длина которого равна времени полёта звука туда и обратно. Функция pulseIn измеряет эту длину в микросекундах.
const int TRIG = 9;
const int ECHO = 10;
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH); // импульс 10 мкс запускает измерение
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long duration = pulseIn(ECHO, HIGH, 30000); // ждать эхо не дольше 30 мс
if (duration == 0) {
Serial.println("Нет эха");
} else {
float cm = duration * 0.0343 / 2;
Serial.print(cm);
Serial.println(" см");
}
delay(200);
}Откуда формула: звук при 20 °C проходит 343 м/с = 0,0343 см за микросекунду, а путь он проделывает дважды — до препятствия и назад, поэтому результат делят на 2. Например, эхо длиной 1166 мкс: 1166 × 0,0343 / 2 ≈ 20,0 см. Третий аргумент pulseIn — сколько ждать эха; если его нет, функция возвращает 0. Подробнее о подключении и ошибках датчика — в справке Как подключить датчик расстояния HC-SR04.
Что такое библиотека
С некоторыми датчиками общаться сложно: их протокол требует точных до микросекунды импульсов и проверки контрольных сумм. Писать такой код самому долго, поэтому берут библиотеку — набор готовых функций. Подключают её строкой #include в начале скетча, а пользуются объектами и функциями, которые она даёт.
Часть библиотек уже есть в Arduino IDE: Servo для сервоприводов, Wire для шины I2C, SPI, EEPROM. Остальные ставятся через менеджер библиотек (Library Manager):
- Откройте его: значок с книгами на панели слева или Sketch → Include Library → Manage Libraries….
- Наберите в поиске название датчика, например
DHT. - Выберите нужную библиотеку и нажмите Install. Если ей нужны другие библиотеки, IDE предложит поставить и их — согласитесь на установку всех.
У почти каждой библиотеки есть примеры: File → Examples, в списке ниже — раздел с именем библиотеки. Начинайте с примера: он показывает, как подключить датчик и какие функции вызывать. Подробнее — в справке Как установить библиотеку в Arduino IDE.
Датчик температуры DHT11 — с библиотекой
DHT11 измеряет температуру и влажность воздуха. Он недорогой и неточный: около ±2 °C. Его старший брат DHT22 точнее и шире по диапазону. Подключение модуля: + или VCC → 5V, − или GND → GND, OUT или DATA → вывод 2. Если у вас голый датчик с четырьмя ножками, а не модуль, между DATA и VCC нужен резистор 10 кОм.
Поставьте через менеджер библиотек DHT sensor library (автор — Adafruit) вместе с зависимой библиотекой Adafruit Unified Sensor. Скетч:
#include <DHT.h>
const int DHT_PIN = 2;
DHT dht(DHT_PIN, DHT11); // для DHT22 второй аргумент — DHT22
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
delay(2000); // датчик медленный: не чаще раза в 1–2 секунды
float h = dht.readHumidity();
float t = dht.readTemperature(); // градусы Цельсия
if (isnan(h) || isnan(t)) { // NaN — «не число»: чтение не удалось
Serial.println("Ошибка чтения датчика");
return; // выйти из loop и попробовать в следующий раз
}
Serial.print("Температура: ");
Serial.print(t);
Serial.print(" °C, влажность: ");
Serial.print(h);
Serial.println(" %");
}Разбор:
#include <DHT.h>подключает библиотеку.DHT dht(DHT_PIN, DHT11);создаёт объектdht— «датчик на выводе 2, модель DHT11». Дальше все действия идут через него:dht.begin(),dht.readTemperature().- При ошибке связи библиотека возвращает особое значение NaN, и
isnanего ловит. Частые причины — проводDATAне на том выводе или слишком частые опросы.
Другой популярный датчик температуры — DS18B20, он работает по шине 1-Wire и бывает в герметичной гильзе на проводе. Как подключить его и DHT22 — в справке Как подключить датчик температуры.
Шина I2C
Многие датчики и дисплеи подключаются по I2C — шине из двух проводов: SDA (данные) и SCL (такт). На Uno и Nano это выводы A4 (SDA) и A5 (SCL), у Uno R3 они продублированы отдельными гнёздами возле AREF. На одну шину можно повесить несколько устройств: у каждого свой адрес — число вроде 0x27 или 0x76, по которому к нему обращаются. Работу с шиной берёт на себя встроенная библиотека Wire. Пример устройства на I2C — в справке Как подключить дисплей LCD 1602 по I2C.
Коротко
- Датчики бывают «да/нет», аналоговые, импульсные и цифровые; модуль на 3,3 В нельзя питать от 5 В.
- HC-SR04: импульс на
Trig, длина ответа наEchoчерезpulseIn, расстояние = время × 0,0343 / 2 см. - Библиотеки ставят через Library Manager и подключают строкой
#include; начинать удобно с примеров. - DHT11 читается библиотекой DHT sensor library не чаще раза в 1–2 секунды; ошибка чтения — NaN.
- I2C — два провода
SDAиSCL(A4иA5на Uno и Nano), у каждого устройства свой адрес.