Самый маленький BLE модуль E104-BT05 на TLSR8266

pvvx

Активный участник сообщества
Основной кусок с ADC участвовавший в тесте:
Код:
/*
* adc.c test
*
*  Created on: 19.11.2019
*      Author: pvvx
*/
#include "../../proj/tl_common.h"
#include "../../proj/drivers/adc_8266.h"
#define ADC_AUTO_MODE_EN    1

void init_adc(void) {

    /**set adc clock and enable adc clock**/
    adc_SetClkFreq(ADC_CLK_4M);

    WriteAnalogReg(0x88,0x0f);// select 192M clk output
    WriteAnalogReg(0x05,0x60);// power on pll
    WriteAnalogReg(0x06,0xfe);// power on sar

    /**select the input channel**/
    adc_AnaChSet(ADC_CHN_D5);
    /**set the adc's mode**/
    adc_AnaModeSet(SINGLEEND);
    /**set the reference voltage**/
    adc_RefVoltageSet(ADC_REF_VOL_1V3); // ADC_REF_VOL_1V3, ADC_REF_VOL_AVDD
    /**set resolution**/
    adc_ResSet(ADC_SAMPLING_RES_14BIT);
    /**set sample cycle**/
    adc_SampleTimeSet(ADC_SAMPLING_CYCLE_24);
#if ADC_AUTO_MODE_EN
    reg_adc_period_chn0 = 1000;    // CLK CPU / 1000 = 48 kHz
    // enable auto mode
    reg_adc_ctrl = FLD_ADC_CHNM_AUTO_EN | MASK_VAL(FLD_ADC_DONE_SIGNAL, ADC_DONE_SIGNAL_FALLING); // = 0x88
#else
    // enable manual mode
    reg_adc_ctrl = MASK_VAL(FLD_ADC_AUD_MODE, 2); // = 0x20
#endif
}


unsigned int cmd_adc(unsigned short *odata, unsigned char *idata) {
    unsigned int i;
    unsigned char smp_cycle = idata[1] & 7;
    unsigned int smp_count = idata[2] | (idata[3] << 8);
    if(smp_count > (USB_CDC_MAX_RX_BLK_SIZE - 4)/2)
        smp_count = (USB_CDC_MAX_RX_BLK_SIZE - 4)/2;
    odata[0] = 0x5a | (smp_cycle << 8);
    odata[1] = (unsigned short)smp_count;
    adc_SampleTimeSet(smp_cycle);
    for(i=0; i < smp_count; i++){
#if ADC_AUTO_MODE_EN
        while(!(reg_adc_chn0_input & 1));
        while(reg_adc_chn0_input & 1);
        odata[i+2] = reg_adc_dat_byp_outp & 0x3FFF;// read data
#else
        reg_adc_chn1_outp = FLD_ADC_CHN_MANU_START;  // Set a run signal,start to run adc
        sleep_us(5);   // wait for data
        odata[i+2] = reg_adc_dat_byp_outp & 0x3FFF;// read data
#endif
    }
    return ((smp_count + 2)<<1);
}
 

pvvx

Активный участник сообщества
@aloika - специально для вас пример в 'app inventor':
upload_2019-11-23_3-5-56.png
upload_2019-11-23_3-6-6.pngupload_2019-11-23_3-10-4.png
Включает и выключает синенькие светодиодики на родной прошивке (AT) ET104-BT05 :) :)
 

pvvx

Активный участник сообщества
@aloika - вы ещё в другой теме спрашивали, как сделать web страницу с BLE.
Вот простой пример, с тем-же модулем и его дурной 'AT', основной js :
JavaScript:
'use strict';

let ledCharacteristic = null;
let poweredOn = false;

function strtoarr(str) {
    var arr = [];
    for(let i=0; i<str.length; i++) arr.push(str.charCodeAt(i));
    return Uint8Array.from(arr); 
}  

function onConnected() {
    document.querySelector('.connect-button').classList.add('hidden');
    document.querySelector('.color-buttons').classList.remove('hidden');
    document.querySelector('.power-button').classList.remove('hidden');
    let data = strtoarr('AT+AUTH=123456');
    ledCharacteristic.writeValue(data)
        .catch(err => console.log('Error when writing AUTH! ', err));
    poweredOn = true;
}

function onDisconnected() {
    document.querySelector('.connect-button').classList.remove('hidden');
    document.querySelector('.color-buttons').classList.add('hidden');
    document.querySelector('.power-button').classList.add('hidden');
}


function connect() {
    console.log('Requesting Bluetooth Device...');
    navigator.bluetooth.requestDevice(
        {
//            filters: [{ services: ['0000fff0-0000-1000-8000-00805f9b34fb'] }]
            filters: [{ services: [0xfff0] }]
        })
        .then(device => {
            console.log('> Found ' + device.name);
            console.log('Connecting to GATT Server...');
            device.addEventListener('gattserverdisconnected', onDisconnected)
            return device.gatt.connect();
        })
        .then(server => {
            console.log('Getting Service 0xFFF0 - Device control...');
            return server.getPrimaryService(0xFFF0);
        })
        .then(service => {
            console.log('Getting Characteristic 0xFFF3 - AT control...');
            return service.getCharacteristic(0xFFF3);
        })
        .then(characteristic => {
            console.log('All ready!');
            ledCharacteristic = characteristic;
            onConnected();
        })
        .catch(error => {
            console.log('Argh! ' + error);
        });
}

function powerOn() {
  let data = strtoarr('AT+IO2=1');
  return ledCharacteristic.writeValue(data)
      .catch(err => console.log('Error when powering on! ', err))
      .then(() => {
          poweredOn = true;
          toggleButtons();
      });
}

function powerOff() {
  let data = strtoarr('AT+IO2=0');
  return ledCharacteristic.writeValue(data)
      .catch(err => console.log('Error when switching off! ', err))
      .then(() => {
          poweredOn = false;
          toggleButtons();
      });
}

function togglePower() {
    if (poweredOn) {
        powerOff();
    } else {
        powerOn();
    }
}

function toggleButtons() {
    Array.from(document.querySelectorAll('.color-buttons button')).forEach(function(colorButton) {
      colorButton.disabled = !poweredOn;
    });
    document.querySelector('.mic-button button').disabled = !poweredOn;
}

function sleep(milliseconds) {
    let timeStart = new Date().getTime();
    while (true) {
      let elapsedTime = new Date().getTime() - timeStart;
      if (elapsedTime > milliseconds) break;
    }
}

function setColor(red, green, blue) {
    let rdata = strtoarr('AT+PWM1='+red);
    ledCharacteristic.writeValue(rdata)
        .catch(err => console.log('Error when writing R value! ', err));
    sleep(300);
    let gdata = strtoarr('AT+PWM2='+green);
    ledCharacteristic.writeValue(gdata)
        .catch(err => console.log('Error when writing G value! ', err));
    sleep(300);
    let bdata = strtoarr('AT+PWM3='+blue);
    return ledCharacteristic.writeValue(bdata)
        .catch(err => console.log('Error when writing B value! ', err));
}

function red() {
    return setColor(100, 0, 0)
        .then(() => console.log('Color set to Red'));
}

function green() {
    return setColor(0, 99, 0)
        .then(() => console.log('Color set to Green'));
}

function blue() {
    return setColor(0, 0, 100)
        .then(() => console.log('Color set to Blue'));
}

function listen() {
    annyang.start({ continuous: true });
}
Основа взята тут urish/web-lightbulb

Полный пробный код приложен:
 

Вложения

pvvx

Активный участник сообщества
Выглядит это так:
Жмем 'Connect', выбираем совместимое устройство:
upload_2019-11-23_15-5-34.png
Подключаемся и тыкаем кнопочки, которые переключают выводы IO2, PWM0,PWM1,PWM2 (см исходники):
upload_2019-11-23_15-7-53.png
Упрощено до предела, чтоб как пример...
 

pvvx

Активный участник сообщества
Подача 'AT' команд:
0x41,0x54,0x2B,0x49,0x42,0x43,0x4E,0x55,0x55,0x49,0x44,0x3D,0xaa,0xaf,0xb0,0xc2,0x87,0x3d,0x4d,0xfd,0x95,0xcf,0x1b,0x53,0x38,0x07,0x9a,0xb2 // AT+IBCNUUID aaafb0c2-873d-4dfd-95cf-1b5338079ab2 OpenUUID - Login or register
0x41,0x54,0x2B,0x49,0x42,0x43,0x4D,0x41,0x4A,0x4F,0x52,0x3D,0x00,0x01 // AT+IBCMAJOR 1
0x41,0x54,0x2B,0x49,0x42,0x43,0x4D,0x49,0x4E,0x4F,0x52,0x3D,0x00,0x01 // AT+IBCMINOR 1
Превращает модуль в iButton. Можно дать ещё 'AT+SLEEP'.
upload_2019-11-23_16-15-26.png
 

pvvx

Активный участник сообщества
В прошивке e104-b05-tb есть бага - не ставится уровень передачи маяка iBeacon. Команда AT+IBCTXPWR (Query and Set iBeacon RSSI command) устанавливает всегда +80 дБ, в независимости от параметра. Трогать её нельзя или патчить посылку в записи Flash по адресу 0x79000.
Но напрограмить в SDK Telink свою прошивку проще. Можно и напрограмить и Eddystone с шифром/ключами...
 

aloika

Active member
Упрощено до предела, чтоб как пример...
Да, посмотрел, очень здорово. Жаль, что на iOS не работает (и вроде как не собираются даже, у них свой путь). На винде тоже не работает (нужна определенная сборка винды, есть надежда, что заработает в будущем). Андроид оказался самым прогрессивным.
 

pvvx

Активный участник сообщества
Да, посмотрел, очень здорово. Жаль, что на iOS не работает (и вроде как не собираются даже, у них свой путь). На винде тоже не работает (нужна определенная сборка винды, есть надежда, что заработает в будущем). Андроид оказался самым прогрессивным.
Картинки работающего Chrome - это из windows 10. Так что всё пашет в 'вынь'.
В комп воткнут USB-BT какой-то самый дешевый с али... Но тут надо глядеть какой правильно работает со стандартными дровами и стеком BLE от мелкомягких.
Я заказывал с али несколько разных, но правильно работает только один :)
Тип чипа тут только 50% - ещё какая прошивка...
 

aloika

Active member
В комп воткнут USB-BT какой-то самый дешевый с али... Но тут надо глядеть какой правильно работает со стандартными дровами и стеком BLE от мелкомягких.
Я заказывал с али несколько разных, но правильно работает только один :)
А, у меня-то вообще никакого нет, вот и не работает поэтому. А на андроиде пытается соединиться с девайсом.
 

pvvx

Активный участник сообщества
В городских магазинах вообще USB-BT-BLE брелки полный отстой...
Более менее на данном чипе:
CSR8510 A10 MSFT100 sm.jpg
Ловит тут дома к половине сотни всяких устройств BT/BLE...


А типа такие:
BARROT_BR8041A01 sm.jpg
Это ужасть... ловит всего пару ближних BT/BLE...
 

pvvx

Активный участник сообщества
В общем CSR8510 (A10 MSFT100) - более менее. Вышли ещё какие-то новые CSR (имею в виду брелки), но мне они пока не попались...
А прикидывается он
Device Description : Mediatek Bluetooth Adaptor
Device ID : USB\VID_0A12&PID_0001\6&17CC36&0&20
Hardware IDs : USB\VID_0A12&PID_0001&REV_8891 USB\VID_0A12&PID_0001
 

pvvx

Активный участник сообщества
iButton было бы очень интересно на BLE. Но в ворота ставить андроид :).
Зачем? Просто масенький чип BLE.
А Android при наличии маяка не блокируется, что удобно. Дома при маяке не надо вводить пин код или елозить отпечатком пальца...
Host на TLSR8266 нельзя изобразить?
Клиент и сервер без проблем.
TLSR8266 имеет обычный приемо-передатчик BT4.2 1 и 2 Mbits/s. В SDK Telink есть примеры и клиента и сервера и одновременно...
 

pvvx

Активный участник сообщества
??? там вроде в попугаях 0x00 - 0xFF
да, но надо где-то -48 дБ, чтобы правильно было. -50, как у Apple меток не то. TLSR орет громче и дальше...
После AT+IBCTXPWR, если прыгать с бубном, то выйдет в прошивке 0xСF, что значит -49 дБ. И лучше больше ничего не трогать.
Но это значение не годится - всё читающее метку будет врать расстояние, т.к. сигнал больше.
 

pvvx

Активный участник сообщества
Бага такая:
Передаем 41 54 2B 49 42 43 54 58 50 57 52 3D CE, что равно 'AT+IBCTXPWR=',-48.
Получаем при запросе и в пакете:
AT+IBCTXPWR?
+OK=P // = 2B 4F 4B 3D 50 0D 0A
И при записи любого значения получаем 0x50. Программы маяков показывают +80 дБ :)
Всё - после этого +80дБ не изничтожить. Я просто перешивал в flash сохраненную запись :
upload_2019-11-23_23-0-38.png
После этого, если сбрасывать питание на модуле или ещё чего, то там будет 0xCF. :mad:
 
Сверху Снизу