Цель: создать автономную систему охраны периметра лагеря с питанием от прикуривателя. Используем 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-адресу и содержимому, и при обнаружении события движения — отправляет уведомление.
Поиск и идентификация датчиков
У каждого датчика — уникальный BLE MAC-адрес. Чтобы не путать 10 штук, нужно:
- Включить все датчики рядом с ESP32.
- Запустить режим сканирования и записать MAC-адреса.
- Сопоставить 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);
}
Уведомление на телефон
Варианты:
- ESP32 как BLE-сервер: телефон подключается к ESP32 и получает уведомления через GATT-характеристику.
- Bluetooth Serial (BLE UART): ESP32 шлёт строку вида
ALERT:Север, а телефон читает как COM-порт. - Простое мобильное приложение на MIT App Inventor или Thunkable — принимает BLE-данные и показывает popup.
Рекомендую начать с BLE UART — это проще всего.
Энергопотребление
- ESP32 в режиме BLE-сканирования: ~60–90 мА
- При питании от прикуривателя — безопасно 12–24 ч
- Можно добавить deep sleep, но тогда теряется реалтайм. Не рекомендуется для сигнализации.
Что делать дальше
- Собери 2 датчика + ESP32.
- Запусти скан и посмотри raw-рекламные пакеты REDMOND через Serial.
- Определи, какой байт отвечает за "движение".
- Напиши простое Android-приложение (или используй nRF Connect для тестов).
- Упакуй всё в коробку с USB-разъёмом — готово к поездке!
Удачи в реализации! Когда появятся силы — система уже будет почти готова 😉
Комментарии
Пока нет комментариев. Будьте первым!