↩️ На главную

BLE Сигнализация на ESP32 с датчиками для кемпинга

16.12.2025 | Статья из категории: Безопасность

Суперэкономичная сигнализация для кемпинга

Цель: создать автономную систему охраны периметра лагеря с питанием от прикуривателя. Используем 10 шт. REDMOND RSM-41S — BLE-датчики движения с питанием от CR123A. Центр — ESP32 как BLE-сканер и хаб. При срабатывании — уведомление на телефон.

Что нужно

  • ESP32 (любая версия с BLE: DevKitC, Node32s и т.п.)
  • 10 шт. датчиков REDMOND RSM-41S
  • USB-кабель + адаптер 12V → 5V (для прикуривателя)
  • Мобильное приложение (самописное или через BLE-сканер)
  • Arduino IDE или PlatformIO

Как это работает

Датчики REDMOND RSM-41S не подключаются к ESP32 как периферия. Они работают в режиме BLE-рекламы (advertising) и периодически шлют пакеты: «Я — датчик движения, и я сработал!».

ESP32 находится в режиме BLE-сканера. Он ловит рекламные пакеты, фильтрует по MAC-адресу и содержимому, и при обнаружении события движения — отправляет уведомление.

⚠️ Важно: REDMOND-датчики не имеют стандартного GATT-сервиса. Всё общение — через advertising-пакеты. Нужно декодировать их payload вручную.

Поиск и идентификация датчиков

У каждого датчика — уникальный BLE MAC-адрес. Чтобы не путать 10 штук, нужно:

  1. Включить все датчики рядом с ESP32.
  2. Запустить режим сканирования и записать MAC-адреса.
  3. Сопоставить MAC с физическим номером (наклеить метку: «Север-1», «Юг-3» и т.д.)

Пример: MAC a4:c1:38:12:34:56 → датчик у палатки.

Код для ESP32 (Arduino)

Используем библиотеку NimBLE-Arduino — она легче и стабильнее стандартной BLE-библиотеки.

#include <NimBLEDevice.h>

// Сопоставление MAC → название
struct Sensor {
  uint8_t mac[6];
  const char* name;
};

Sensor sensors[] = {
  {{0xA4, 0xC1, 0x38, 0x12, 0x34, 0x56}, "Север"},
  {{0xA4, 0xC1, 0x38, 0xAB, 0xCD, 0xEF}, "Юг"},
  // ... добавь остальные 8
};

const int sensorCount = sizeof(sensors) / sizeof(Sensor);

void scanCallback(NimBLEScanResults results) {
  for (int i = 0; i < results.getCount(); i++) {
    NimBLEAdvertisedDevice device = results.getDevice(i);
    const uint8_t* mac = device.getAddress().getNative();

    // Ищем совпадение по MAC
    for (int s = 0; s < sensorCount; s++) {
      if (memcmp(mac, sensors[s].mac, 6) == 0) {
        // Анализируем advertising-данные
        std::string data = device.getManufacturerData();
        if (!data.empty()) {
          // REDMOND кладёт флаг движения в байт [4] (пример!)
          // Нужно исследовать: включи датчик и посмотри hex-дамп
          if (data.length() > 4 && (data[4] & 0x01)) {
            Serial.printf("🚨 Сработал датчик: %s (%s)\n", sensors[s].name, device.getAddress().toString().c_str());
            sendNotification(sensors[s].name);
          }
        }
        break;
      }
    }
  }
}

void sendNotification(const char* sensorName) {
  // Варианты:
  // 1. Включить светодиод или зуммер
  // 2. Отправить BLE-уведомление на телефон
  // 3. Сохранить в лог на microSD
  // 4. Отправить по Bluetooth Serial (если телефон подключён)
}

void setup() {
  Serial.begin(115200);
  BLEDevice::init("");
  NimBLEScan* pScan = BLEDevice::getScan();
  pScan->setActiveScan(false); // пассивный скан — меньше энергии
  pScan->setInterval(97);      // интервал сканирования (ms)
  pScan->setWindow(30);        // окно (должно быть <= interval)
  pScan->setAdvertisedDeviceCallbacks(new NimBLEAdvertisedDeviceCallbacks() {
    void onResult(NimBLEAdvertisedDevice* device) override {
      // Не используем — обрабатываем пачкой в scanCallback
    }
  });
  pScan->start(0, scanCallback, false); // бесконечный скан
}

void loop() {
  delay(1000);
}

Уведомление на телефон

Варианты:

  1. ESP32 как BLE-сервер: телефон подключается к ESP32 и получает уведомления через GATT-характеристику.
  2. Bluetooth Serial (BLE UART): ESP32 шлёт строку вида ALERT:Север, а телефон читает как COM-порт.
  3. Простое мобильное приложение на MIT App Inventor или Thunkable — принимает BLE-данные и показывает popup.

Рекомендую начать с BLE UART — это проще всего.

Энергопотребление

  • ESP32 в режиме BLE-сканирования: ~60–90 мА
  • При питании от прикуривателя — безопасно 12–24 ч
  • Можно добавить deep sleep, но тогда теряется реалтайм. Не рекомендуется для сигнализации.

Что делать дальше

  1. Собери 2 датчика + ESP32.
  2. Запусти скан и посмотри raw-рекламные пакеты REDMOND через Serial.
  3. Определи, какой байт отвечает за "движение".
  4. Напиши простое Android-приложение (или используй nRF Connect для тестов).
  5. Упакуй всё в коробку с USB-разъёмом — готово к поездке!

Удачи в реализации! Когда появятся силы — система уже будет почти готова 😉




Категории:

Категории

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Посетителей сегодня: 0
о блоге | карта блога

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA