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

BLE модули TB-04/TB-03F (TLSR8253F512)

pvvx

Активный участник сообщества
В main() есть
C:
int deepRetWakeUp = pm_is_MCU_deepRetentionWakeup();  //MCU deep retention wakeUp
и эти - DEEP_ANA_REG0 ... DEEP_ANA_REG10. Но часть занята системой и не вся занятость описана в доках к SDK - в разных вариантах - разное...
 

Slacky

Member
У 8258 есть внутренний температурный сенсор.

The TLSR8258 integrates a temperature sensor and it’s used in combination with the SAR ADC to detect real-time temperature

Есть где-то пример, как его использовать?
 

jura_lcd

New member
У 8258 есть внутренний температурный сенсор.

The TLSR8258 integrates a temperature sensor and it’s used in combination with the SAR ADC to detect real-time temperature

Есть где-то пример, как его использовать?
Попробуйте так.
void adc_temp_init(void)
{
adc_set_chn_enable_and_max_state_cnt(ADC_MISC_CHN, 2);//enable the mic channel and set max_state_cnt
adc_set_state_length(240, 10); //set R_max_mc=240,R_max_s=10
adc_set_ref_voltage(ADC_VREF_1P2V);//set channel Vref,
adc_set_vref_vbat_divider(ADC_VBAT_DIVIDER_OFF);//set Vbat divider select,
adc_set_ain_channel_differential_mode(TEMSENSORP, TEMSENSORN);
adc_set_resolution(RES14);
adc_set_tsample_cycle(SAMPLING_CYCLES_6);
adc_set_ain_pre_scaler(ADC_PRESCALER_1);//adc scaling factor is 1 or 1/8
//enable temperature sensor
analog_write(0x00, (analog_read(0x00)&0xef));
}

unsigned short adc_temp_result(void)
{
unsigned short adc_temp_value = 0;
adc_sample_and_get_result();
adc_temp_value = 579-((adc_code * 840)>>13);
return adc_temp_value;
}

Могут быть не точности пример для 8278 но должно работать..
 

Slacky

Member
Попробуйте так.
void adc_temp_init(void)

Могут быть не точности пример для 8278 но должно работать..
Спасибо, нашел где поглядеть. Но не работает. Не могу понять вот здесь.

Оригинальная из adc_base_init()
adc_set_ain_channel_differential_mode(ADC_MISC_CHN, gpio_num, GND);

Такая должна стать. Но в оригинальной используется номер GPIO, а тут что?
adc_set_ain_channel_differential_mode(ADC_MISC_CHN, TEMSENSORP, TEMSENSORN);

По даташиту там два диода на два канала, positive и negative. Канал - это что? Два разных GPIO?
 

Slacky

Member
Спасибо, нашел где поглядеть. Но не работает. Не могу понять вот здесь.
Добился каких-то значений (до этого ноль adc_code всегда возвращал).

Код:
adc_sample_and_get_result: 176, adc_code: 154
temperature: 564
adc_sample_and_get_result: 176, adc_code: 154
temperature: 564
adc_sample_and_get_result: 176, adc_code: 154
temperature: 564
adc_sample_and_get_result: 175, adc_code: 153
temperature: 564
Осталось понять, реагирует он на изменение температуры и как это привести в более менее разумное значение ...
 

Slacky

Member
Добился каких-то значений (до этого ноль adc_code всегда возвращал).
Взял у жены фен. Вроде реагирует.
Код:
adc_sample_and_get_result: 176, adc_code: 154
temperature: 564
adc_sample_and_get_result: 174, adc_code: 152
temperature: 564
adc_sample_and_get_result: 175, adc_code: 153
temperature: 564
adc_sample_and_get_result: 167, adc_code: 146
temperature: 565
adc_sample_and_get_result: 161, adc_code: 141
temperature: 565
adc_sample_and_get_result: 159, adc_code: 139
temperature: 565
adc_sample_and_get_result: 158, adc_code: 138
temperature: 565
adc_sample_and_get_result: 158, adc_code: 138
temperature: 565
adc_sample_and_get_result: 158, adc_code: 138
temperature: 565
adc_sample_and_get_result: 149, adc_code: 130
temperature: 566
adc_sample_and_get_result: 148, adc_code: 129
temperature: 566
adc_sample_and_get_result: 148, adc_code: 129
temperature: 566
adc_sample_and_get_result: 150, adc_code: 131
temperature: 566
adc_sample_and_get_result: 149, adc_code: 130
temperature: 566
adc_sample_and_get_result: 151, adc_code: 132
temperature: 566
adc_sample_and_get_result: 150, adc_code: 131
temperature: 566
adc_sample_and_get_result: 135, adc_code: 118
temperature: 567
adc_sample_and_get_result: 135, adc_code: 118
temperature: 567
adc_sample_and_get_result: 133, adc_code: 116
temperature: 568
adc_sample_and_get_result: 133, adc_code: 116
temperature: 568
adc_sample_and_get_result: 133, adc_code: 116
temperature: 568
adc_sample_and_get_result: 138, adc_code: 121
temperature: 567
adc_sample_and_get_result: 145, adc_code: 127
temperature: 566
adc_sample_and_get_result: 121, adc_code: 106
temperature: 569
adc_sample_and_get_result: 159, adc_code: 139
temperature: 565
adc_sample_and_get_result: 161, adc_code: 141
temperature: 565
Но нужно сказать, что между вроде бы логичными данными, проскакивают "левые" значения
Код:
adc_sample_and_get_result: 177, adc_code: 155
temperature: 564
adc_sample_and_get_result: 175, adc_code: 153
temperature: 564
adc_sample_and_get_result: 176, adc_code: 154
temperature: 564
adc_sample_and_get_result: 122, adc_code: 107
temperature: 569
adc_sample_and_get_result: 122, adc_code: 107
temperature: 569
adc_sample_and_get_result: 121, adc_code: 106
temperature: 569
adc_sample_and_get_result: 122, adc_code: 107
temperature: 569
adc_sample_and_get_result: 176, adc_code: 154
temperature: 564
adc_sample_and_get_result: 176, adc_code: 154
temperature: 564
 

Slacky

Member
В общем вроде получилось, но нужно привести в читаемый вид выдаваемых данных по температуре.

C:
s32 getTemperatureCb(void *arg) {

    u16 temperature = adc_temp_result();

    printf("temperature: %d\r\n", temperature);


    return 0;
}

void adc_temp_init() {

    adc_init();

    adc_power_on_sar_adc(1);

    adc_set_vref_vbat_divider(ADC_VBAT_DIVIDER_OFF);//set Vbat divider select,
    adc_set_ain_chn_misc(TEMSENSORP, TEMSENSORN);
    adc_set_ain_pre_scaler(ADC_PRESCALER_1);//adc scaling factor is 1 or 1/8

    //enable temperature sensor
    analog_write(0x00, (analog_read(0x00)&0xef));
}

extern u8 adc_code;

static u16 adc_temp_result() {
    u16 adc_temp_value = 0;

    printf("adc_sample_and_get_result: %d, adc_code: %d\r\n", adc_sample_and_get_result(), adc_code);
    adc_temp_value = 579-((adc_code * 840)>>13);
    return adc_temp_value;
}
Запускаем таймер с callback функцией getTemperatureCb() раз в 5 секунд.

В середине данные поползли вверх - нагреваем феном.

Код:
adc_sample_and_get_result: 54, adc_code: 122
temperature: 567
adc_sample_and_get_result: 54, adc_code: 124
temperature: 567
adc_sample_and_get_result: 54, adc_code: 125
temperature: 567
adc_sample_and_get_result: 54, adc_code: 125
temperature: 567
adc_sample_and_get_result: 54, adc_code: 127
temperature: 566
adc_sample_and_get_result: 56, adc_code: 136
temperature: 566
adc_sample_and_get_result: 58, adc_code: 153
temperature: 564
adc_sample_and_get_result: 59, adc_code: 159
temperature: 563
adc_sample_and_get_result: 60, adc_code: 164
temperature: 563
adc_sample_and_get_result: 60, adc_code: 167
temperature: 562
adc_sample_and_get_result: 60, adc_code: 168
temperature: 562
adc_sample_and_get_result: 61, adc_code: 171
temperature: 562
adc_sample_and_get_result: 61, adc_code: 170
temperature: 562
adc_sample_and_get_result: 61, adc_code: 171
temperature: 562
adc_sample_and_get_result: 60, adc_code: 168
temperature: 562
adc_sample_and_get_result: 61, adc_code: 172
temperature: 562
adc_sample_and_get_result: 61, adc_code: 172
temperature: 562
adc_sample_and_get_result: 61, adc_code: 172
temperature: 562
adc_sample_and_get_result: 60, adc_code: 168
temperature: 562
adc_sample_and_get_result: 58, adc_code: 154
temperature: 564
adc_sample_and_get_result: 57, adc_code: 145
temperature: 565
adc_sample_and_get_result: 56, adc_code: 141
temperature: 565
adc_sample_and_get_result: 56, adc_code: 137
temperature: 565
adc_sample_and_get_result: 56, adc_code: 135
temperature: 566
adc_sample_and_get_result: 55, adc_code: 134
temperature: 566
adc_sample_and_get_result: 56, adc_code: 135
temperature: 566
adc_sample_and_get_result: 55, adc_code: 134
temperature: 566
adc_sample_and_get_result: 55, adc_code: 133
temperature: 566
adc_sample_and_get_result: 55, adc_code: 134
temperature: 566
adc_sample_and_get_result: 55, adc_code: 132
temperature: 566
adc_sample_and_get_result: 55, adc_code: 134
temperature: 566
Понятно, что формула из adc_temp_result() не подходит. Нужно что-то придумать ...
 

jura_lcd

New member
Да расчет температуры у 8278 и 8258 будет разный , формулы чутка отличаються.
У 8278 в качестве датчика температуры транзистор , а у 8258 два диода, судя из даташита..
1690432867494.png1690432867494.png
 

Slacky

Member
На форуме телинка кто-то интересовался, как на 825х использовать внутренний датчик температуры. Они его отправили в примеры driver_sdk_825x. Но! Там есть примеры только для B80 и B87. Для B85 примеров нет. В общем я по аналогии сделал, только немного поигрался в прескаллер, взял не 1, а 1F8, так как в других вариантах возвращалось число меньше 130. Ну и в процессе проверки с феном и нагревом немного подкорректировал коэффициент с 0.51 на 0.58. В таком варианте температура возвращается более менее с близким к реальныму значением. Большая точность не нужна, нужно отследить критичное повышение температуры, например возгорание.

C:
void adc_temp_init() {

    drv_adc_init();
    adc_set_resolution(ADC_MISC_CHN, RES14);
    adc_set_vref_chn_misc(ADC_VREF_1P2V);
    adc_set_ain_channel_differential_mode(ADC_MISC_CHN, TEMSENSORP, TEMSENSORN);
    adc_set_vref_vbat_divider(ADC_VBAT_DIVIDER_OFF);//set Vbat divider select,
    adc_set_ain_pre_scaler(ADC_PRESCALER_1F8);

    drv_adc_enable(ON);

    //enable temperature sensor
//    analog_write(0x00, (analog_read(0x00)&0xef));
    analog_write(0x07, analog_read(0x07)&0xEF);
}


static u16 adc_temp_result() {
    u16 adc_temp_value;
    u32 adc_data = 0;

    adc_data = drv_get_adc_data();

    if (adc_data > 255) adc_data = 255;

    adc_temp_value = ((adc_data*100 - 130*100)/58 - 40) * 100 ;
    adc_temp_value |= (adc_data*100 - 130*100)%58;

    return adc_temp_value;
}
 

selevo

Member
Так я не понял почему нету ещё этих плат в ArduinoIDE?
Надо выкладывать, без поддержки на первом этапе.

Общественный разум сам осилит. Всё остальное.
Надо двигать, надо развивать. Современные методы и технологии.
 

pvvx

Активный участник сообщества
Так я не понял почему нету ещё этих плат в ArduinoIDE?
Причины описаны ранее, но вы так и не поняли :cry:
Для TLSR82xx нет компилятора C++.
Надо выкладывать, без поддержки на первом этапе.
Arduino не поддерживает концепцию малопотребляющих устройств.
Общественный разум сам осилит. Всё остальное.
Надо двигать, надо развивать. Современные методы и технологии.
Как раз "общественный разум" и прочие "сообщества" ничего и никогда не осилили. Это начинает работать только тогда, когда кто-то один или двое предоставят всё готовое за свой счет и смогут осилить массу негатива от лемингов.
У меня есть за вечер накаляканный Arduino для TLSR82xx. Он скриптом переводит начальный "С++" в СИ и далее собирает... Картинки и логи были выложены ранее, но публиковать не собираюсь. И так по поддерживаемым темам негатива хватает :p
 

pvvx

Активный участник сообщества
Слепил тут на TB-03F датчик бака воды из нержавейки на 125 литров на чердаке в мастерской. Пол года вроде полет нормальный…

Там функций много:
* другой TB-03F следит за насосом со скважины (ток насоса, перегрев, напряжение сети, холостой ход)
* другой TB-03F ристует графический пульт управления, контролирует насос повышения давления и мелкий бойллер горячей воды (30 литров, сухой тен), включает малый экстренный подогрев бака зимой (до +7..8С, не более, чтобы черти в баке не завелись или не замерзла, т.к. вода со скважины идет +5..8С в любое время года).

Вся информация поступает и в HA, но основная работа системы из BLE автономна, т.к. надежность HA очень сомнительная.
1693354519588.png

Сам датчик бака построен на:
1693354725610.png
https://aliexpress.ru/item/1005001844371737.html
1693354738845.png
https://aliexpress.ru/item/1005003332355961.html
+ датчик влажности и температуры (AHT25) под теплоизоляцией у труб (бак на неотапливаемом чердаке)
+ датчик температуры воды (TMP36)

По контактному поплавковому датчику постоянно производится подкалибровка китайского датчика давления, показывающего уровень воды. Точность на 100 литров выходит в пределах +-100 миллилитров (стакан). Китайский датчик давления сильно колбасит от температуры. Это не стал калибровать – зима покажет нужно или нет, т.к. чувствительности (менее миллилитра) и точности (ухода от изменений температуры и давления) пока и так достаточно.
1693354561704.png
Для таких как selevo - Для публикаций требуется содействие – кто будет заниматься поддержкой и т.д… Это займет по несколько часов в день :p
 

pvvx

Активный участник сообщества
@selevo подсчитаем затраченное время. Возьмем только бак с датчиками и трубопроводы.

На выбор и заказ деталек на Али, Яндекс Маркет и т.д. ушло примерно 1 час. Плюс получение бака, комплектации труб и прочего – ещё 1 час (требовалась поездка в пунк выдачи, в соседнем поселке).
На сборку, установку труб и теплоизоляцию бака – 1 день
На сброку/пайку блока, запихивание в корпус и всякую проводку к нему, включая написание программы – ещё 1 день.
Для публикации только этой части потребуется ещё 1 день. Для ответов и посылок “пользователей” – от 30 минут в сутки в течении пары лет, если проект им зайдет.
Теперь ясно причины?
 

pvvx

Активный участник сообщества
@selevo - Тем более “проектов” у меня много.

К примеру, вот ожидающий (тупо времени нет) сборки:

Контроль холодильника. Беда у большинства холодильников в сельской местности. Из-за кратковременного отключения электричества у них горят компрессоры. Пусковое устройство не отрабатывает. Точнее как повезет – у нас ни один пока не накрылся в течении 10 лет, но у соседей вылетело по 2 и более за этот срок. И что интересно – чаше всего с пусковыми устройствами типа с термоконтактом по току (“Реле пускозащитное компрессора для холодильника, типа РКТ-N”). А так-же в холодильниках нет никакой диагностики, а на дачи люди берут самые дешевые...

Пока имеется простое решение – подключаете холодильник через примерно такую фигню:
1693359381553.png
В ней настраиваете макс ток в 1.2..2.5A (по пусковой мощности холодильника) и время допуска превышения до 2 сек. Паузу отключения на 2..3 минуты (чтобы таблетка пуска остыла). Ну и прочии ограничения по напряжению. Тогда у компрессора нет возможности перегореть. Останется только возможность заклинить и износиться со временем.

Это не дает диагностику по хладагенту (утечке, перебору). Но тут всё тоже просто – нужен датчик рабочего тока с графиком. Если хладагента мало, то компрессор будет долго работать и спустая какое-то время после его страта будет достаточно хорошо падать потребляемая мощность. Ну обратная и трубка к компрессору не будет холодной. И наоборот – при лишнем хладагенте обратная трубка будет покрываться инеем и ток потребления так-же укажет…

К примеру совершенно новый “Холодильник Бирюса 118”, самый приемлимый дешман на сегодня (без учета повышения цен на холодильники на 30% на той неделе :)), но он мелкий.
На самом минимуме его "регулятора" (+9С в верхней камере и -23С в нижней).
1693359448219.png
Похоже, что не доложили "фриончика"...
Ну и можно отследить итоговую реальную, а не маркетинговую шизу о потреблении холодильником и температуры в камерах...
И ремонтники холодильников вас сожрут руганью и прочим негативом :)

Т.е. требуется перепрограммировать какую “Вумную розетку” за 700 руб с али… Но я не сторонник WiFi – по практики выходит, что c WiFi проблемммм выше крыши, особенно с ESP – нулевая надежность. На BLE чипе без всяких C++ проще и надежнее в несколько раз.
 

selevo

Member
Негатив не берётся из ниоткуда у него есть причины. И некоторые причины в авторах.
На STM8 и ch55x тоже нет полноценного бесплатного компилятора но прилепили
 

selevo

Member
Здесь были допущены некоторые фундаментальные ошибки. Нужно было начинать с грамотного описания для самостоятельного старта. А не хвастовства.

Вот проект Arduino поэтому и вырос, там начали как раз с грамотного описания самостоятельного старта.
 

pecherskih

Member
Негатив не берётся из ниоткуда у него есть причины. И некоторые причины в авторах.
На STM8 и ch55x тоже нет полноценного бесплатного компилятора но прилепили
Ну что тут поделаешь, наш pvvx таков как есть, другого не имеем :)
 

cryptozoy

Member
Вот проект Arduino поэтому и вырос, там начали как раз с грамотного описания самостоятельного старта.
Среда Arduino очень нравится таким "разработчикам", для описания способностей которых идеально подходит цитата из анекдота: "Чукча не читатель, Чукча - писатель!"
 
Сверху Снизу