• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Самый маленький 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:
 
Сверху Снизу