Категории

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

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

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

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

Что нужно

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

Датчики 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 — это проще всего.

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

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

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

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

Комментарии

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

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

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

Важно: Блог-эксперимент

Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


кто я | книга | контакты

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