• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Автоматический сбор данных. Поругайте реализацию и расскажите о подводных камнях..

Потребовалось сделать такую штуку:

В нескольких помещениях одного здания, далеко друг от друга, установлены контрольные устройства - станции.
Они читают инфу с одного двух датчиков (скажем температуры в помещении и уровня освещенности), делают снимки камерой, возможно пишут видео если есть повод. остальное время спят.
Один, два раза в день мимо станций проходит охранник с еще одним девайсом в кармане, назовем его накопитель. На этот накопитель должна _автоматически_ переписываться информация со станций.
Когда охранник возвращается на свой пост, данные с накопителя, также автоматически, списываются на комп.
В силу особенностей проекта все девайсы беспроводные и с питанием от батарей.

Как я это себе вижу.

Станции однозначно на esp32-cam. накопитель скорее всего тоже(?). Ибо надо писать видео и делать фото да и встроенная SDCARD тут в тему.

01) В дежурном режиме все устройства спят.
02) просыпаются раз в xx секунд.
03) Проснувшись - поднимают ble, ждут xx секунд, пытаясь между собой законнектится. если коннекта не было засыпают снова, GOTO 01
04) В случае если к станции запрошен коннект - она поднимает WIFI веб-сервер.
05) Накопитель получив ответ от станции выкачивает к себе все нужные ему данные по Wifi.
06) Дает команду станции уснуть и засыпает сам.
07) GOTO 01


Поругайте плиз выбор комплектующих и сам алгоритм работы.
 

pvvx

Активный участник сообщества
ESP32 в режиме BLE потребляет значительно более чем постоянно соединенный с роутером любой современный SoC с WiFi6.
Переключение ESP32 на BLE экономию батареи не даст -> вам придется использовать батареи от Теслы.
 
RTL штука интересная, но не для "станции", а для "накопителя". Надо только будет туда SDCARD приделывать и писать ее поддержку
 
Там где это будет стоять, 4G сеть скорее всего будет недоступна(как и любая другая), да и камера это не основная функция.
TLSR это хорошо, у меня их кучка с предыдущего проекта осталась(и с пяток термометров), но они из коробки не умеют снимать видео и фото и работать с внешними накопителями.

Безусловно можно разобраться как все это делается и переписать(написать с нуля) нужные библиотеки, но:
- во-первых это займет кучу времени на которое мне не дадут денег. Напомню я специалист по прототипам и макетам, а не по окончательному продукту.

- во-вторых, как я понимаю, прокачать большой объем данных (скажем видео) через BT довольно проблематично. Время которое наш гипотетический "охранник" находится возле "станции" ограничивается максимум парой минут. Если бы не это обстоятельство вполне можно было бы использовать в качестве "станции" и "накопителя" tlsr приделав к ним sdcard. Ну а для фото и видео tlsr бы "будила" по необходимости esp32-cam.
 
Разобрался с BLE обменом между двумя esp32,
С клиента (esp32-cam) на сервер (esp32) команды уходят, в ответ отрабатывают нотификашионы сервера и клиент их получает .

Сервис станции публикует две характеристики:
Объявлены они так

C:
pchCmd = pService->createCharacteristic(chCmd_UUID,BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE);
pchCmd->setCallbacks(new MyCmd());
pchCmd->addDescriptor(new BLE2902());
  
pchLastPhoto=pService->createCharacteristic(chLastPhoto_UUID,
                      BLECharacteristic::PROPERTY_READ   
                      | BLECharacteristic::PROPERTY_WRITE  
                      | BLECharacteristic::PROPERTY_NOTIFY 
                      | BLECharacteristic::PROPERTY_INDICATE
                    );
pchLastPhoto->addDescriptor(new BLE2902());
1) pchCmd - получающая от клиента команды на запуск того или иного функционала. В качестве примера "shoot" - сделай фото, на данный момент просто инкрементирует количество фоток с попутной выдачей нотификации .

C:
class MyCmd: public BLECharacteristicCallbacks
{
   void onWrite(BLECharacteristic *pCharacteristic)
   {
      std::string v = pCharacteristic->getValue();
      String cmd= v.c_str();
      if(cmd=="shoot")
      {
           pictureNumber=pictureNumber+1;
           String sp = String(pictureNumber);
           //pchLastPhoto->setValue((uint8_t*)&pictureNumber, 4);
           pchLastPhoto->setValue((uint8_t*)sp.c_str(),sp.length());
           pchLastPhoto->notify();
      }
   }
};
2) pchLastPhoto - возвращает количество имеющихся фоток. BLECharacteristic имхо у нее дофига объявлено(?) но тут я играю по чужим нотам, скопировано из примера.

Следующий на очереди блок который должен по команде клиента передать на него файлы с SD-карты воткнутой в станцию.
Передавать мы будем примерно 2Мб. В связи с чем возник довольно провокационный вопрос, Что мне лучше использовать для этой передачи?

1) Bluetooth Serial
2) Esp-now
3) Wifi c веб-сокетами?
.. еще какой то механизм про который я еще не прочитал? :)

Подскажите плииз. Склоняюсь к первому, тогда можно впоследствии перейти на TLSR, но не уверен что хватит скорости. эти 2 Мб нам надо протолкнуть за 1 минуту.
 

pvvx

Активный участник сообщества
Подскажите плииз. Склоняюсь к первому, тогда можно впоследствии перейти на TLSR, но не уверен что хватит скорости. эти 2 Мб нам надо протолкнуть за 1 минуту.
BLE 4.0 (TLSR8266) имеет поток примерно как UART 115200 bit/c.
На картинке туда и обратно (TX и RX, полу-дуплекс) - по 1966 SPS:

BLE 5.0 (TLSR8269/825x) раза в полтора более и устойчивей - Аппаратный RF буфер приема-передачи во много раз более -> один пакет к полкилобайта...
 
Сверху Снизу