• Система автоматизации с открытым исходным кодом на базе 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 очень нравится таким "разработчикам", для описания способностей которых идеально подходит цитата из анекдота: "Чукча не читатель, Чукча - писатель!"
 
Сверху Снизу