Arduino

ИК-приёмник, лазерный модуль и датчик пламени/дыма

1 просмотров

Введение

Три разнородных, но объединённых темой «детектирования на расстоянии без физического контакта» модуля — ИК-приёмник (приём сигналов от пультов дистанционного управления), лазерный модуль (источник узконаправленного света для различных применений), и датчик пламени/газовой эмиссии (обнаружение огня или определённых типов газов).

Концепция

ИК-приёмник принимает модулированный инфракрасный сигнал от обычных бытовых пультов дистанционного управления (телевизоров, кондиционеров) — каждая кнопка пульта кодирует уникальную последовательность импульсов согласно одному из нескольких распространённых протоколов (NEC, наиболее частый среди дешёвых пультов из таких наборов), и готовые библиотеки декодируют эту последовательность в понятный числовой код команды. Лазерный модуль — простой источник узкого, мощного светового луча, обычно используемый в паре с фоторезистором или фотодиодом на принимающей стороне для построения «светового барьера» (обнаружение пересечения луча, аналогично оптическому разрывному датчику, но на большее расстояние). Датчик пламени (обычно на основе ИК-чувствительного фотодиода, реагирующего на специфичное для открытого огня инфракрасное излучение) и датчик газовой эмиссии (обычно MQ-серии, реагирующий на изменение электрического сопротивления чувствительного элемента в присутствии определённых газов) — оба дают простой аналоговый или цифровой сигнал, пропорциональный/превышающий пороговое значение обнаруживаемого явления.

Пример кода

// ИК-приёмник — декодирование команд пульта через библиотеку IRremote
#include <IRremote.hpp>

const int IR_RECEIVE_PIN = 11;

void setup() {
    Serial.begin(9600);
    IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
}

void loop() {
    if (IrReceiver.decode()) {
        Serial.print("IR_CODE:");
        Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);

        // Пример обработки конкретных, заранее известных кодов кнопок пульта
        switch (IrReceiver.decodedIRData.decodedRawData) {
            case 0xFF6897: // конкретный код кнопки "1" для часто встречающегося в наборах пульта
                Serial.println("Кнопка 1 нажата");
                break;
            default:
                break;
        }

        IrReceiver.resume(); // подготовка к приёму следующей команды
    }
}
// Лазерный модуль и приёмный фоторезистор — простой световой барьер
const int LASER_PIN = 8;
const int RECEIVER_PIN = A0;
const int BEAM_BROKEN_THRESHOLD = 200; // ниже этого значения — луч прерван, требует калибровки

void setupLaserBarrier() {
    pinMode(LASER_PIN, OUTPUT);
    digitalWrite(LASER_PIN, HIGH); // лазер постоянно включён
}

void loopLaserBarrier() {
    int receivedLight = analogRead(RECEIVER_PIN);
    if (receivedLight < BEAM_BROKEN_THRESHOLD) {
        Serial.println("EVENT:BEAM_BROKEN"); // объект пересёк луч
    }
}
// Датчик пламени и газовый датчик эмиссии — пороговое обнаружение
const int FLAME_DIGITAL_PIN = 4;
const int GAS_ANALOG_PIN = A2;
const int GAS_THRESHOLD = 400; // требует калибровки для конкретного типа обнаруживаемого газа

void checkSafety() {
    bool flameDetected = !digitalRead(FLAME_DIGITAL_PIN); // часто LOW при обнаружении пламени
    int gasLevel = analogRead(GAS_ANALOG_PIN);

    if (flameDetected) {
        Serial.println("ALERT:FLAME_DETECTED");
    }
    if (gasLevel > GAS_THRESHOLD) {
        Serial.println("ALERT:GAS_DETECTED");
    }
}

Пояснения к коду

IrReceiver.decode()/decodedRawData показывают, что библиотека IRremote полностью абстрагирует низкоуровневую расшифровку временных интервалов ИК-импульсов в готовый, числовой код команды — конкретное значение этого кода для каждой кнопки нужно определить эмпирически для конкретного используемого пульта (через простой тестовый скетч, выводящий полученный код в Serial при нажатии каждой кнопки), поскольку коды не стандартизированы между разными производителями пультов. BEAM_BROKEN_THRESHOLD и аналогичные пороги в примерах с лазером, пламенем и газом — все требуют индивидуальной калибровки в реальных условиях использования, что является общей темой, повторяющейся практически для каждого аналогового порогового датчика этого расширенного набора.

Подводные камни

  • Направление лазерного модуля непосредственно в глаза человека или животного даже непреднамеренно — несмотря на относительно низкую мощность большинства лазерных модулей из обучающих наборов, прямое попадание лазерного луча в глаз может вызвать дискомфорт или, для более мощных модулей, реальное повреждение зрения; при работе с любыми лазерными модулями стоит соблюдать базовую осторожность направления луча, аналогичную обращению с лазерными указками.
  • Использование дешёвого датчика пламени для критичных систем пожарной безопасности без понимания его реальных ограничений — модули такого типа из общих хобби-наборов обычно не сертифицированы как средства пожарной безопасности, могут давать ложные срабатывания от других источников интенсивного ИК-излучения (прямой солнечный свет, некоторые виды ламп) и пропускать реальное возгорание в определённых условиях; для образовательных/хобби-проектов мониторинга такой датчик подходит, но не должен заменять сертифицированные пожарные детекторы в любом сценарии, где реальная безопасность людей зависит от надёжного обнаружения.
  • Использование газового датчика серии MQ без понимания, что разные модели этой серии чувствительны к разным типам газов (MQ-2 — горючие газы/дым, MQ-7 — угарный газ, и так далее), и без прогрева датчика перед использованием (большинству датчиков MQ-серии требуется заметное время прогрева встроенного нагревательного элемента после включения питания, обычно от десятков секунд до нескольких минут, прежде чем показания становятся стабильными и осмысленными) — использование показаний сразу после включения питания, без должного времени прогрева, даёт неточные, нестабильные значения.
  • Подключение лазерного модуля непосредственно к GPIO-пину без учёта потребляемого тока, аналогично общим подводным камням про токоограничение из основного Arduino-цикла — хотя большинство лазерных модулей из обучающих наборов рассчитаны на прямое подключение к стандартным цифровым пинам Arduino, для модулей с более высокой потребляемой мощностью стоит проверить документацию конкретного модуля и при необходимости использовать транзисторный ключ или модуль с собственным регулятором, аналогично подходу с реле для более мощных нагрузок.