Глиф Учебники

Урок 8. Датчики и библиотеки

Курс «Arduino» · урок 8 из 10 · 5 минут чтения

Датчик превращает что-то из окружающего мира — расстояние, температуру, свет, движение — в сигнал, который плата может прочитать. Для многих датчиков уже написаны библиотеки — готовый код, который берёт на себя общение с датчиком. В этом уроке — оба пути: датчик без библиотек и датчик с библиотекой.

Какие бывают датчики

По тому, как они передают данные, датчики делятся на несколько видов:

ВидКак читаетсяПримеры
Да или нет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.

HC-SR04 VCC Trig Echo GND Trig — команда от платы: импульс Echo — ответ датчика 5V 9 10 GND Arduino Uno звук эхо препятствие
Датчик HC-SR04 подключён четырьмя проводами: VCC к 5V, Trig к выводу 9, Echo к выводу 10, GND к GND; звук уходит к препятствию и возвращается эхом.

Измерение такое: на Trig подают импульс 10 микросекунд, датчик посылает звук и выставляет на Echo импульс HIGH, длина которого равна времени полёта звука туда и обратно. Функция pulseIn измеряет эту длину в микросекундах.

Arduino
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.

Trig вывод 9 10 мкс Echo вывод 10 pulseIn(ECHO, HIGH, 30000) 1166 мкс — звук туда и обратно 1166 × 0,0343 / 2 ≈ 20,0 см
Импульс 10 мкс на Trig запускает измерение, Echo держит HIGH, пока звук летит туда и обратно; pulseIn меряет 1166 мкс, это около 20,0 см.

Что такое библиотека

С некоторыми датчиками общаться сложно: их протокол требует точных до микросекунды импульсов и проверки контрольных сумм. Писать такой код самому долго, поэтому берут библиотеку — набор готовых функций. Подключают её строкой #include в начале скетча, а пользуются объектами и функциями, которые она даёт.

Часть библиотек уже есть в Arduino IDE: Servo для сервоприводов, Wire для шины I2C, SPI, EEPROM. Остальные ставятся через менеджер библиотек (Library Manager):

  1. Откройте его: значок с книгами на панели слева или Sketch → Include Library → Manage Libraries….
  2. Наберите в поиске название датчика, например DHT.
  3. Выберите нужную библиотеку и нажмите 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. Скетч:

Arduino
#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(" %");
}

Разбор:

Другой популярный датчик температуры — DS18B20, он работает по шине 1-Wire и бывает в герметичной гильзе на проводе. Как подключить его и DHT22 — в справке Как подключить датчик температуры.

Шина I2C

Многие датчики и дисплеи подключаются по I2C — шине из двух проводов: SDA (данные) и SCL (такт). На Uno и Nano это выводы A4 (SDA) и A5 (SCL), у Uno R3 они продублированы отдельными гнёздами возле AREF. На одну шину можно повесить несколько устройств: у каждого свой адрес — число вроде 0x27 или 0x76, по которому к нему обращаются. Работу с шиной берёт на себя встроенная библиотека Wire. Пример устройства на I2C — в справке Как подключить дисплей LCD 1602 по I2C.

Arduino Uno A4 · SDA A5 · SCL библиотека Wire SDA — данные SCL — такт дисплей LCD 1602 адрес 0x27 датчик адрес 0x76 питание 5V и GND — каждому
Шина I2C: провода SDA с вывода A4 и SCL с вывода A5 идут ко всем устройствам сразу, дисплей и датчик различаются адресами 0x27 и 0x76.

Коротко

Проверьте себя

1. Как плата узнаёт расстояние от датчика HC-SR04?
2. Эхо длилось 583 мкс. Какое это расстояние?
3. Как поставить библиотеку для датчика?
4. На каких выводах Arduino Uno находится шина I2C?