Антипотеряшка для ключей на базе esp32-c6 super mini

Возникло желание сделать портативное устройство, которое можно повесить на ключи и при необходимости их найти.

Перепробовал несколько вариантов ESP32, делал даже на esp8266, но там нет bluetooth, поэтому приходилось подключаться к wi-fi телефона и через геолокацию google выдавать координаты местоположения брелка. При такой схеме заряжать устройство нужно пару раз в день, при аккумуляторе на 500 мАч, что не очень удобно и не практично. Вариант с ESP32 (тот самый классический devmodule v1-v4) тоже особо живучестью не отличается, плюс размеры устройства не подходят, чтобы называться "брелком". Заказал себе esp32-s3, хорошая плата, одна из самых лучших в зоопарке ESP, поддерживает ble, много памяти и много других штук. Но кушает тоже много, даже в режиме deep sleep, и размеры её, в скупе с аккумулятором, не очень подходят для брелка.
Тогда полез интернет и нашел esp32-c3 super mini. Да, подумал я, мне это подходит. После того, как пришла плата, был написан скетч и нужно это дело засунуть в корпус. Соответственно, нужно зарядить аккумулятор, беру плату TP4056 и нужен стабилизатор на 3.3v, иначе при прямом питании плата ведет себя нестабильно и может перегореть. Опять же, увеличение размеров и компонентов. Случайно на маркетплейсе нашел ESP32-C6 super mini, там уже есть пины для питания батареи. И это то, что мне нужно! Современные протоколы от ble 5, wi-fi 6, а также matter и treads! но использовать я буду, в данном проекте, только ble (beacon). Описывать почему так не вижу смысла, каждый делает своё

#include <NimBLEDevice.h>
#include <NimBLEBeacon.h>
#include <esp_sleep.h>

// ======================
// CONFIG
// ======================

#define DEVICE_NAME "AntiLossKeychain"
#define BEACON_UUID "e05d97db-ac97-4974-8389-7db0d821e6e5"

#define MAJOR 1
#define MINOR 1
#define MEASURED_POWER -59

#define ADV_INTERVAL_MS 300

// баланс режим
#define ADV_TIME_MS 2000
#define SLEEP_SECONDS 12

// anti-loss
#define SEARCH_INTERVAL 10
#define SEARCH_TIME_MS 4000

RTC_DATA_ATTR uint32_t bootCount = 0;

NimBLEAdvertising* advertising;

// ======================
// start beacon
// ======================

void startBeacon(int txPower){

    NimBLEDevice::setPower(txPower);

    NimBLEBeacon beacon;

    beacon.setManufacturerId(0x004C);
    beacon.setProximityUUID(NimBLEUUID(BEACON_UUID));

    beacon.setMajor(MAJOR);
    beacon.setMinor(MINOR);

    beacon.setSignalPower(MEASURED_POWER);

    NimBLEAdvertisementData advData;
    advData.setFlags(0x06);

    std::string beaconData(
        (char*)&beacon.getData(),
        sizeof(NimBLEBeacon::BeaconData)
    );

    advData.setManufacturerData(beaconData);

    advertising = NimBLEDevice::getAdvertising();

    advertising->setAdvertisementData(advData);

    uint16_t interval = ADV_INTERVAL_MS / 0.625;

    advertising->setMinInterval(interval);
    advertising->setMaxInterval(interval);

    advertising->start();
}

// ======================
// SETUP
// ======================

void setup(){

    Serial.begin(115200);

    bootCount++;

    NimBLEDevice::init(DEVICE_NAME);

    // Long Range PHY
    NimBLEDevice::setDefaultPhy(
        BLE_HCI_LE_PHY_CODED,
        BLE_HCI_LE_PHY_CODED
    );

    // ======================
    // anti-loss burst
    // ======================

    if(bootCount % SEARCH_INTERVAL == 0){

        startBeacon(ESP_PWR_LVL_P9);
        delay(SEARCH_TIME_MS);
        advertising->stop();
    }

    // ======================
    // normal advertising
    // ======================

    startBeacon(ESP_PWR_LVL_P3);

    delay(ADV_TIME_MS);

    advertising->stop();

    NimBLEDevice::deinit(true);

    // ======================
    // sleep
    // ======================

    esp_sleep_enable_timer_wakeup((uint64_t)SLEEP_SECONDS * 1000000ULL);
    esp_deep_sleep_start();
}

void loop(){}

Код работает так:
Каждые ~2–3 минуты:

4 секунды — максимальная мощность (+9 dBm) телефон гарантированно “подхватывает” устройство Автономность: ≈ 1 – 1.5 месяца (300 mAh)

2 секунды - beacon работает 12 секунд - sleep т.е. цикл работы 12 секунд

В плане добавить делитель напряжения, чтобы видеть через gatt сервисы заряд аккумулятора
в итоге получилось вот такое устройство размером всего в 3,2 см, и высотой 1 см

Комментарии (0)

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

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