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

TLSR8251 + LCD + термометр = LYWSD03MMC XIAOMI Bluetooth термометр

pvvx

Активный участник сообщества
И вроде всё стабилизировалось. Хорошо смотреть по счетчику номера передачи встроенного в рекламу:
1676815852202.png
Кроме прогулок для измерения расстояний и прочих операций над данным испытуемым видимых пропусков приема нет. Даже на этом ужасном USB-BT5.0 адаптере с USB1.1, среди роя моих BLE и WiFi...
 

sL0n1k

Member
Видимо опять не читали функционал прошивки...

Вариант 1:

В TelinkMiFlasher.html измените строку :
const MAX_RF_TX_Power = false;
на
const MAX_RF_TX_Power = true;
изображение

Вариант 2:

В Google Chrome:
изображение
изображение


Далее при соединении с термометром с установками более +3дБ (VANT) будет всегда доступно это переключение.
Это всё сделано для защиты от детей, орущих что у них не работает термометр или быстро умирает батарейка.
В реальности, даже на более-менее свежей батарейке CR2032 переключение на +10дБ вызовет невозможность найти или соединиться с термометром, т.к. RF-TX переключается напрямую к батарейке, а итоговый сигнал становиться меньше, чем -20дБ из-за просадок..

А RPi выкиньте в помойку.
Вот это тестировалось с нормальной батарейкой? (+8.13 хотя бы)
Это работает стабильно?
Есть картинка как сильно потребляет ?
 

sL0n1k

Member
Еще тогда такой незатейливый вопрос: в SDK есть поддержка IR (инфракрасного)?
 

pvvx

Активный участник сообщества
Вот это тестировалось с нормальной батарейкой? (+8.13 хотя бы)
Возрастание тока четко соответствует отдаваемой мощности в RF TX - прямая зависимость.
CR2032 более +3дБм уже не тянет (кроме совершенно новой, ещё не использованной), и далее это уже не BLE (ранее было общепринято, что категория/лейбочка BLE - это импульсные токи до 15 мА от 3В)
При 0 дБм - TX + работа CPU = 6..8 мА.
А при +10дБм, это вроде 25..32 мА.
 

pvvx

Активный участник сообщества
Точный ток зависит от напряжения, т.к. имеется DC-DC на 1.2В и передатчик до +3дБм питается от него. А на более - переключается на входное напряжение.
У батарейки CR2032 уже приводилось, какие провалы напряжения происходят и что это всё, без конденсаторов, станет сбоить уже при TX +0дБм:


И если поставить +10дБм, то напряжение у CR2032 будет падать ниже ограничения BOR чипа в 1.8В.
Для нормального использования CR2032, до 0% разряда, расчет очень прост - Это источник на 3В с внутренним сопротивлением около 100 Ом при +25С.

3В - 100 Ом * 0.025 A = 0.5 В - какой дБм будет у чипа при питании от 0.5 В вместо 3 В c установкой "+10 дБм"? :unsure:

Еще тогда такой незатейливый вопрос: в SDK есть поддержка IR (инфракрасного)?
Кто такое "поддержка"?
У чипа есть IR. Закрыты только либы стека BLE/ZigBee и описания части регистров RF.
 

pvvx

Активный участник сообщества
@sL0n1k - как проверка LE Long Range - удалась?
т.е. чуда c Long Range не будет - можете расходиться))
Зачем нам чудо?
Всё и так на USB-BT RTL адаптере без всяких торчащих антенн успешно работает на расстояния из домов в сараи и прочие постройки на имеющихся у обычных граждан размерах участков (до 500 метров со стенами каркасников).
Частичные выпадения приема рекламы на больших расстояниях есть, но это не критично. И они в основном, от медленной шины адаптера и его внутреннего кода. Да и местные BLE ему перебивают коллизиями прием дальних.
1677260517278.png
 

pvvx

Активный участник сообщества
Это -106 дБм приема по смарту в месте работы адаптера USB-BT (сам этот адаптер очень криво показывает RSSI).
 

pvvx

Активный участник сообщества
Добавлена программка, для приема и разбора BLE рекламы (Питон) в Windows и т.д.
Test program of used Bluetooth Advertising formats provided by Ircama.
 

sL0n1k

Member
Google Web Bluetooth API вообще сдвинуть невозможно, как и Windows и MACOS. Там всё связанное с BLE запущено изначально и даже думать не стоит.
@sL0n1k - если это как-то возможно, киньте какой пример на Android для работы с Coded PHY. Правда времени на какие-то разработки приложений под Android у меня через несколько дней уже не будет - есть свои большие делишки...
Дело в том, что не нужно предпринимать никаких специальных усилий или действий для использования Coded Phy в андроиде.
Просто скажите какой Phy использовать с помощью метода setPhy(). В остальном все абсолютно также как и для обычных каналов.
Насколько я помню, Anroid Studio изобилует примерами для работы с BLE, но если хотите посмотреть что-то более профессиональное, то Cypress (теперь это Infineon) в свое время выкладывал в публичный доступ CySmart, не знаю насколько это свежая ссылка, вот https://github.com/Infineon/airoc-connect-android.

Что касается моего приложения, то вряд ли оно представляет для кого-то академический интерес в плане BLE, там может и есть несколько интересных идей, но это скорее связано с ООП, чем с BLE (в частности внешний полиморфизм). Поэтому публиковать исходный код просто нет смысла - там все стандартно (для qt).
 

pvvx

Активный участник сообщества
Дело в том, что не нужно предпринимать никаких специальных усилий или действий для использования Coded Phy в андроиде.
Просто скажите какой Phy использовать с помощью метода setPhy(). В остальном все абсолютно также как и для обычных каналов.
Это всё я знаю. Но как-то теперь надо начать писать на Android... а большого желания нет, пока не доработаны другие уже вышедшие варианты термометров...

Для сканирования расширенных рекламных пакетов необходимо вызвать settings.setLegacy(false) при настройке параметров сканирования. У нас есть пример этого в исходном коде nRF Toolbox:
https://github.com/NordicSemiconduc.../nrftoolbox/scanner/ScannerFragment.java#L241
Класс ScanSettings также имеет функцию setPhy, позволяющую вам решить, какой phy следует использовать для сканирования. Вы можете увидеть реализацию этой функции здесь:
https://github.com/NordicSemiconduc...id/support/v18/scanner/ScanSettings.java#L494


Источник

И ещё надо побороть Windows. Хотя там и объявлен BT5.1, но API найти не выходит.

А код переключения в API Bluez через btmgmt приводит к зависанию всего в HA :) Хотя запрос
Код:
            hci_phys = btmgmt_sync.send('GetPHYConfiguration', idx)
            # 9 LE1MTX
            #10 LE1MRX
            #11 LE2MTX
            #12 LE2MRX
            #13 LECODEDTX
            #14 LECODEDRX
            sup_phy = bool((hci_phys.cmd_response_frame.supported_phys & 0x6600) == 0x6600);
            if sup_phy is not True:
                _LOGGER.warning(
                    "hci%i (%s) no BT5.0 capabilities.",
                    idx,
                    hci_info.cmd_response_frame.address
                )
            #else:
                #new_hci_phys = int(hci_phys.cmd_response_frame.selected_phys | 0x6000);
                #if new_hci_phys != hci_phys.cmd_response_frame.selected_phys:
                    #hci_phys = btmgmt_sync.send('SetPHYConfiguration', idx, new_hci_phys)
                    #_LOGGER.warning(hci_phys)
                    #time.sleep(3)
Отрабатывается.
 

pvvx

Активный участник сообщества
А в интерфейсе сканирования Bluez нету установок primary_hpy, есть только упоминания secondary_phy. И не вылечен connect с ext.adv. (Хотя Windows молчком соединяется с Coded PHY по ext.adv в Coded PHY аж в Web API Chrome, но не работает сканирование ext.adv в Coded PHY в Chrome)
Т.е. Linux совсем больна.
 

pvvx

Активный участник сообщества
Дело в том, что не нужно предпринимать никаких специальных усилий или действий для использования Coded Phy в андроиде.
Ещё какие сверх усилия требуются, т.к. потребуется описывать interleaved сканирование...
А в том-же Linuх достаточно переключить адаптер в режим BT5.0. (Но это сделать непросто :))
 

sL0n1k

Member
Ещё какие сверх усилия требуются, т.к. потребуется описывать interleaved сканирование...
А в том-же Linuх достаточно переключить адаптер в режим BT5.0. (Но это сделать непросто :))
Тут надо смотреть спецификацию раздел HCI. Скорее всего это одной командой делается
 

pvvx

Активный участник сообщества
Тут надо смотреть спецификацию раздел HCI. Скорее всего это одной командой делается
Команды HCI давно известны и указано как это сделать.
Но у многих HA работает в docker и доступ к адаптеру только через dbus, прописанный к этой виртуальной машине... а там бац и Bluez и кранты.
 

pvvx

Активный участник сообщества
Адаптеру вообще всё пофиг - ему необходимо разгребать буфер, принятый по DMA от RF. А для приема указывается всего начальный фильтр и частота.
rf_access_code_comm(ACCESS_CODE); - это фильтр начала сообщения
ACCESS_CODE для BLE свой и единый.
Далее всё программное - разбор буфера и кодировки, с отбросом вариантов по CRC в разных точках принятого фрейма.

Пример, не полный
Код:
#if            RF_FAST_MODE_2M
    #if            RF_LONG_PACKET_EN
        #define        RF_PACKET_LENGTH_OK(p)        (p[0] == p[12]+13)
        #define        RF_PACKET_CRC_OK(p)            ((p[p[0]+3] & 0x51) == 0x40)
    #else
        #define        RF_PACKET_LENGTH_OK(p)        (p[0] == (p[12]&0x3f)+15)
        #define        RF_PACKET_CRC_OK(p)            ((p[p[0]+3] & 0x51) == 0x40)
    #endif
#elif        RF_FAST_MODE_1M
    #define        RF_BLE_PACKET_LENGTH_OK(p)                ( *((unsigned int*)p) == p[5]+13)                //dma_len must 4 byte aligned
    #define        RF_BLE_PACKET_CRC_OK(p)                    ((p[*((unsigned int*)p) + 3] & 0x01) == 0x0)

    #if (1) // support RF RX/TX MAX data Length: 251byte
        #define        RF_PACKET_LENGTH_OK(p)                (MAKE_U16(p[1], p[0]) == p[5]+13)
        #define        RF_PACKET_CRC_OK(p)                    ((p[MAKE_U16(p[1], p[0])+3] & 0x01) == 0x0)
    #else
        #define        RF_PACKET_LENGTH_OK(p)                (p[0] == p[5]+13)
        #define        RF_PACKET_CRC_OK(p)                    ((p[p[0]+3] & 0x01) == 0x0)
    #endif
#else
#define        RF_PACKET_LENGTH_OK(p)        (p[0] == p[12]+13)
#define        RF_PACKET_CRC_OK(p)            ((p[p[0]+3] & 0x51) == 0x10)
#endif

#define        RF_PACKET_1M_LENGTH_OK(p)        (p[0] == p[5]+13)
#define        RF_PACKET_2M_LENGTH_OK(p)        (p[0] == (p[12]&0x3f)+15)
#define    RF_ZIGBEE_PACKET_LENGTH_OK(p)                (p[0]  == p[4]+9)
#define    RF_ZIGBEE_PACKET_CRC_OK(p)                   ((p[p[0]+3] & 0x51) == 0x10)
#define    RF_ZIGBEE_PACKET_RSSI_GET(p)                 (p[p[0]+2])
#define    RF_ZIGBEE_PACKET_TIMESTAMP_GET(p)               (p[p[0]-4] | (p[p[0]-3]<<8) | (p[p[0]-2]<<16) | (p[p[0]-1]<<24))
#define    RF_ZIGBEE_PACKET_PAYLOAD_LENGTH_GET(p)          (p[4])
#define    RF_NRF_ESB_PACKET_LENGTH_OK(p)                  (p[0] == (p[4] & 0x3f) + 11)
#define    RF_NRF_ESB_PACKET_CRC_OK(p)                     ((p[p[0]+3] & 0x01) == 0x00)
#define    RF_NRF_ESB_PACKET_RSSI_GET(p)                   (p[p[0]+2])
#define    RF_NRF_SB_PACKET_PAYLOAD_LENGTH_GET(p)          (p[0] - 10)
#define    RF_NRF_SB_PACKET_CRC_OK(p)                      ((p[p[0]+3] & 0x01) == 0x00)
#define    RF_NRF_SB_PACKET_CRC_GET(p)                     ((p[p[0]-8]<<8) + p[p[0]-7]) //Note: here assume that the MSByte of CRC is received first
#define    RF_NRF_SB_PACKET_RSSI_GET(p)                    (p[p[0]+2])
#define    RF_NRF_ESB_PACKET_TIMESTAMP_GET(p)          (p[p[0]-4] | (p[p[0]-3]<<8) | (p[p[0]-2]<<16) | (p[p[0]-1]<<24))
#define    RF_NRF_SB_PACKET_TIMESTAMP_GET(p)           (p[p[0]-4] | (p[p[0]-3]<<8) | (p[p[0]-2]<<16) | (p[p[0]-1]<<24))

#define    rf_aoa_aod_iq_data_offset(p)                    (p[5]+10)

rf_start_stx2rx (ble_tx_packet, clock_time()+16*TX_DELAY_US);
        while(1)
        {
            if(tx_state==1)//tx
            {
                tx_state = 0;
                tx_cnt++;
            }
            else if(rx_state==1)//rx
            {
                if(RF_BLE_PACKET_CRC_OK(rx_packet)&&RF_BLE_PACKET_LENGTH_OK(rx_packet))
                rx_cnt++;
                break;

            }
            else if(timeout_state==1)//time out
            {
                timeout_cnt++;
                break;
            }
И приемник принимает практически всегда, т.к. начального фильтра не хватает отсеять шум.
 

pvvx

Активный участник сообщества
На nrf24l01 без проблем принять и передать BLE, но там ограничена длина буфера у RF.
Это и есть отличие чипов BT5 от BT4. + качество приемника.
 
Сверху Снизу