Возникло желание сделать портативное устройство, которое можно повесить на ключи и при необходимости их найти.
Перепробовал несколько вариантов 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)
Оставить комментарий
Пока нет комментариев. Будьте первым!