├── docs └── conn2.png ├── .gitattributes ├── library.properties ├── examples └── thermistor │ └── thermistor.ino ├── keywords.txt ├── .github └── workflows │ └── tg-send.yml ├── src ├── GyverNTC.cpp └── GyverNTC.h ├── LICENSE ├── README_EN.md └── README.md /docs/conn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GyverLibs/GyverNTC/HEAD/docs/conn2.png -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=GyverNTC 2 | version=1.5.5 3 | author=AlexGyver 4 | maintainer=AlexGyver 5 | sentence=Simple library for NTC thermistors 6 | paragraph=Simple library for NTC thermistors 7 | category=Sensors 8 | url=https://github.com/GyverLibs/GyverNTC 9 | architectures=* 10 | -------------------------------------------------------------------------------- /examples/thermistor/thermistor.ino: -------------------------------------------------------------------------------- 1 | // подключение: GND --- термистор --- A0 --- 10к --- 5V 2 | #include 3 | GyverNTC therm(0, 10000, 3435); 4 | // серый 4300, проводной 3950 5 | 6 | void setup() { 7 | Serial.begin(9600); 8 | } 9 | 10 | void loop() { 11 | Serial.print("Temperature "); 12 | Serial.print(therm.getTempAverage()); 13 | Serial.println(" *C"); 14 | delay(500); 15 | } 16 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For GyverNTC 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | GyverNTC KEYWORD1 9 | 10 | ####################################### 11 | # Methods and Functions (KEYWORD2) 12 | ####################################### 13 | 14 | getTemp KEYWORD2 15 | getTempAverage KEYWORD2 16 | computeTemp KEYWORD2 17 | config KEYWORD2 18 | setPin KEYWORD2 19 | NTC_compute KEYWORD2 20 | 21 | ####################################### 22 | # Constants (LITERAL1) 23 | ####################################### 24 | -------------------------------------------------------------------------------- /.github/workflows/tg-send.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Telegram Message 3 | on: 4 | release: 5 | types: [published] 6 | jobs: 7 | build: 8 | name: Send Message 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: send telegram message on push 12 | uses: appleboy/telegram-action@master 13 | with: 14 | to: ${{ secrets.TELEGRAM_TO }} 15 | token: ${{ secrets.TELEGRAM_TOKEN }} 16 | disable_web_page_preview: true 17 | message: | 18 | ${{ github.event.repository.name }} v${{ github.event.release.tag_name }} 19 | ${{ github.event.release.body }} 20 | https://github.com/${{ github.repository }} 21 | -------------------------------------------------------------------------------- /src/GyverNTC.cpp: -------------------------------------------------------------------------------- 1 | #include "GyverNTC.h" 2 | 3 | // сигнал АЦП, (R резистора / R термистора), B термистора, t термистора, разрешение АЦП 4 | float NTC_computeRR(float analog, float baseDiv, uint16_t B, uint8_t t, uint8_t res) { 5 | if (analog <= 0 || isnan(analog)) return INFINITY; 6 | analog = baseDiv / ((float)((1 << res) - 1) / analog - 1.0f); 7 | analog = (log(analog) / B) + 1.0f / (t + 273.15f); 8 | return (1.0f / analog - 273.15f); 9 | } 10 | 11 | // сигнал АЦП, R резистора, B термистора, t термистора, R термистора, разрешение АЦП 12 | float NTC_compute(float analog, uint32_t R, uint16_t B, uint8_t t, uint32_t Rt, uint8_t res) { 13 | return NTC_computeRR(analog, (float)R / Rt, B, t, res); 14 | } 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 AlexGyver 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/GyverNTC.h: -------------------------------------------------------------------------------- 1 | /* 2 | Библиотека для работы с NTC термисторами по закону Стейнхарта-Харта 3 | Документация: 4 | GitHub: https://github.com/GyverLibs/GyverNTC 5 | Возможности: 6 | - Установка параметров термистора 7 | - Получение температуры 8 | - Встроенное усреднение 9 | 10 | AlexGyver, alex@alexgyver.ru 11 | https://alexgyver.ru/ 12 | MIT License 13 | 14 | Версии: 15 | v1.0 - релиз 16 | v1.1 - небольшая оптимизация, повышение точности 17 | v1.2 - оптимизация, поддержка 100к термисторов 18 | v1.3 - поддержка АЦП с разной битностью 19 | v1.4 - исправлена критическая ошибка! 20 | v1.5 - добавлена отдельная функция для расчёта 21 | */ 22 | 23 | #ifndef _GyverNTC_h 24 | #define _GyverNTC_h 25 | #include 26 | 27 | // вычисление без класса, не хранит константы в памяти 28 | // сигнал АЦП, (R резистора / R термистора), B термистора, t термистора, разрешение АЦП 29 | float NTC_computeRR(float analog, float baseDiv, uint16_t B, uint8_t t = 25, uint8_t res = 10); 30 | 31 | // сигнал АЦП, R резистора, B термистора, t термистора, R термистора, разрешение АЦП 32 | float NTC_compute(float analog, uint32_t R, uint16_t B, uint8_t t = 25, uint32_t Rt = 10000, uint8_t res = 10); 33 | 34 | class GyverNTC { 35 | public: 36 | // подключение: GND --- Rt --- ADC --- R --- VCC 37 | 38 | GyverNTC() {} 39 | 40 | // пин, R резистора, B термистора, t термистора, R термистора, разрешение АЦП 41 | GyverNTC(uint8_t pin, uint32_t R, uint16_t B, uint8_t t = 25, uint32_t Rt = 10000, uint8_t res = 10) { 42 | config(R, B, t, Rt); 43 | setPin(pin, res); 44 | } 45 | 46 | // настроить термистор: R резистора, B термистора, t термистора, R термистора 47 | void config(uint32_t R, uint16_t B, uint8_t t = 25, uint32_t Rt = 10000) { 48 | _beta = B; 49 | _tempBase = t; 50 | _baseDivRes = (float)R / Rt; 51 | } 52 | 53 | // настроить пин и разрешение АЦП 54 | void setPin(uint8_t pin, uint8_t res = 10) { 55 | _pin = pin; 56 | _res = res; 57 | } 58 | 59 | // прочитать температуру с пина 60 | float getTemp() { 61 | return computeTemp(analogRead(_pin), _res); 62 | } 63 | 64 | // прочитать усреднённую температуру с пина, можно указать к-во усреднений 65 | float getTempAverage(uint8_t samples = 20) { 66 | uint16_t aver = 0; 67 | for (uint8_t i = 0; i < samples; i++) aver += analogRead(_pin); 68 | return computeTemp((float)aver / samples, _res); 69 | } 70 | 71 | // получить температуру из сигнала АЦП, можно указать разрешение АЦП 72 | float computeTemp(float analog, uint8_t res = 10) { 73 | return NTC_computeRR(analog, _baseDivRes, _beta, _tempBase, res); 74 | } 75 | 76 | private: 77 | uint8_t _res = 10; 78 | uint8_t _pin = 0; 79 | uint16_t _beta = 3435; 80 | uint8_t _tempBase = 25; 81 | float _baseDivRes = 1.0; 82 | }; 83 | #endif -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | This is an automatic translation, may be incorrect in some places. See sources and examples! 2 | 3 | # Gyverntc 4 | Library for working with NTC Termistors according to the law of Steinhart-Hart 5 | - Installation of the parameters of thermistor 6 | - Obtaining temperature 7 | - Built -in averaging 8 | - support for different resolutions of ADC 9 | 10 | ## compatibility 11 | Compatible with all arduino platforms (used arduino functions) 12 | 13 | ## Content 14 | - [installation] (# Install) 15 | - [initialization] (#init) 16 | - [use] (#usage) 17 | - [Example] (# Example) 18 | - [versions] (#varsions) 19 | - [bugs and feedback] (#fedback) 20 | 21 | 22 | ## Installation 23 | - The library can be found by the name ** gyverntc ** and installed through the library manager in: 24 | - Arduino ide 25 | - Arduino ide v2 26 | - Platformio 27 | - [download the library] (https://github.com/gyverlibs/gyverntc/archive/refs/heads/main.zip) .Zip archive for manual installation: 28 | - unpack and put in * C: \ Program Files (X86) \ Arduino \ Libraries * (Windows X64) 29 | - unpack and put in * C: \ Program Files \ Arduino \ Libraries * (Windows X32) 30 | - unpack and put in *documents/arduino/libraries/ * 31 | - (Arduino id) Automatic installation from. Zip: * sketch/connect the library/add .Zip library ... * and specify downloaded archive 32 | - Read more detailed instructions for installing libraries [here] (https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%BD%D0%BE%BE%BE%BED0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA) 33 | ### Update 34 | - I recommend always updating the library: errors and bugs are corrected in the new versions, as well as optimization and new features are added 35 | - through the IDE library manager: find the library how to install and click "update" 36 | - Manually: ** remove the folder with the old version **, and then put a new one in its place.“Replacement” cannot be done: sometimes in new versions, files that remain when replacing are deleted and can lead to errors! 37 | 38 | 39 | 40 | ## initialization 41 | ! [Scheme] (https://github.com/gyverlibs/gyverntc/blob/main/docs/conn2.png) 42 | Connection: GND - RT - ADC - R - VCC 43 | - RT - thermistor 44 | - R - ballast resistor 45 | 46 | `` `CPP 47 | Gyverntc therm;// empty designer 48 | 49 | Gyverntc therm (uint8_t pin, uint32_t r, uint16_t b, uint8_t t = 25, uint32_t rt = 10000, uint8_t res = 10); 50 | // PIN - analog PIN to which the termistor is connected 51 | // r - resistance of a ballast resistor, ohm 52 | // B-beta-coefficient of thermistor (see Datashit) [number in the region of 1000-5000] 53 | // t - the basic temperature of the termistor, Celsius degrees (see Datashit) [usually 25 degrees] 54 | // RT - resistance of thermistor at the base temperature, ohm (see Datashit) 55 | // res - resolution of ADC, bit.By default 10 56 | `` ` 57 | 58 | 59 | ## Usage 60 | ### Class 61 | 62 | `` `CPP 63 | // Configure the termistor: R resistor, b termistor, t termistor, r termistor 64 | Void Config (Uint32_t R, Uint16_t B, Uint8_t T = 25, Uint32_T RT = 10000); 65 | 66 | // configure PIN and resolution of ADC 67 | VOID setpin (uint8_t pin, uint8_t res = 10); 68 | 69 | // Read the temperature with PIN 70 | Float gettemp (); 71 | 72 | // Read the average temperature from the pin, you can indicate the value of 73 | Float Gettempaverage (Uint8_t Samples = 20); 74 | 75 | // get the temperature from the ADC signal, you can specify the resolution of the ADC 76 | Float Computetemp (Float ANALOG, UINT8_T Res = 10); 77 | `` ` 78 | 79 | ## direct calculation 80 | 81 | `` `CPP 82 | // signal ACP, (R resistor / r termistoRA), b termistor, t termistor, resolution of ADC 83 | Float ntc_compute (Float analog, Float basediv, uint16_t b, uint8_t t = 25, uint8_t res = 10); 84 | 85 | // signal ADC, R resistor, B termistor, t thermistor, R termistor, ACP resolution 86 | Float ntc_compute (Float analog, uint32_t r, uint16_t b, uint8_t t = 25, uint32_t RT = 10000, uint8_t res = 10); 87 | `` ` 88 | 89 | 90 | ## Example 91 | The rest of the examples look at ** Examples **! 92 | `` `CPP 93 | #include 94 | Gyverntc Therm (0, 10000, 3435); 95 | 96 | VOID setup () { 97 | Serial.Begin (9600); 98 | } 99 | 100 | VOID loop () { 101 | Serial.print ("Temperature"); 102 | Serial.print 103 | Serial.println (" *c"); 104 | Delay (500); 105 | } 106 | `` ` 107 | 108 | ### several termistors 109 | It is not necessary to make its own instance of the class for each termistor, just specify the pin before the measurement: 110 | 111 | `` `CPP 112 | #include 113 | Gyverntc therm; 114 | 115 | VOID setup () { 116 | Serial.Begin (9600); 117 | Therm.config (1000, 3435); 118 | } 119 | 120 | VOID loop () { 121 | Therm.setpin (0); 122 | Serial.print ("TEMP (PIN 0):"); 123 | Serial.print 124 | Serial.println (" *c"); 125 | Delay (500); 126 | 127 | Therm.Setpin (2); 128 | Serial.print ("TEMP (PIN 2):"); 129 | Serial.print 130 | Serial.println (" *c"); 131 | Delay (500); 132 | } 133 | `` ` 134 | 135 | 136 | ## versions 137 | - V1.0 138 | - V1.1 - slight optimization, increasing accuracy 139 | - V1.2 - optimization, support of 100k termistors 140 | - v1.3 - support for different resolutions of ADC 141 | - V1.4 - A critical error is fixed! 142 | - V1.5 - A separate function for calculation is added 143 | 144 | 145 | ## bugs and feedback 146 | Create ** Issue ** when you find the bugs, and better immediately write to the mail [alex@alexgyver.ru] (mailto: alex@alexgyver.ru) 147 | The library is open for refinement and your ** pull Request ** 'ow! 148 | 149 | 150 | When reporting about bugs or incorrect work of the library, it is necessary to indicate: 151 | - The version of the library 152 | - What is MK used 153 | - SDK version (for ESP) 154 | - version of Arduino ide 155 | - whether the built -in examples work correctly, in which the functions and designs are used, leading to a bug in your code 156 | - what code has been loaded, what work was expected from it and how it works in reality 157 | - Ideally, attach the minimum code in which the bug is observed.Not a canvas of a thousand lines, but a minimum code -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![latest](https://img.shields.io/github/v/release/GyverLibs/GyverNTC.svg?color=brightgreen)](https://github.com/GyverLibs/GyverNTC/releases/latest/download/GyverNTC.zip) 2 | [![PIO](https://badges.registry.platformio.org/packages/gyverlibs/library/GyverNTC.svg)](https://registry.platformio.org/libraries/gyverlibs/GyverNTC) 3 | [![Foo](https://img.shields.io/badge/Website-AlexGyver.ru-blue.svg?style=flat-square)](https://alexgyver.ru/) 4 | [![Foo](https://img.shields.io/badge/%E2%82%BD%24%E2%82%AC%20%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%82%D1%8C-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B0-orange.svg?style=flat-square)](https://alexgyver.ru/support_alex/) 5 | [![Foo](https://img.shields.io/badge/README-ENGLISH-blueviolet.svg?style=flat-square)](https://github-com.translate.goog/GyverLibs/GyverNTC?_x_tr_sl=ru&_x_tr_tl=en) 6 | 7 | [![Foo](https://img.shields.io/badge/ПОДПИСАТЬСЯ-НА%20ОБНОВЛЕНИЯ-brightgreen.svg?style=social&logo=telegram&color=blue)](https://t.me/GyverLibs) 8 | 9 | # GyverNTC 10 | Библиотека для работы с NTC термисторами по закону Стейнхарта-Харта 11 | - Установка параметров термистора 12 | - Получение температуры 13 | - Встроенное усреднение 14 | - Поддержка разного разрешения АЦП 15 | 16 | ### Совместимость 17 | Совместима со всеми Arduino платформами (используются Arduino-функции) 18 | 19 | ## Содержание 20 | - [Установка](#install) 21 | - [Инициализация](#init) 22 | - [Использование](#usage) 23 | - [Пример](#example) 24 | - [Версии](#versions) 25 | - [Баги и обратная связь](#feedback) 26 | 27 | 28 | ## Инициализация 29 | ![scheme](https://github.com/GyverLibs/GyverNTC/blob/main/docs/conn2.png) 30 | Подключение: GND -- Rt -- ADC -- R -- VCC 31 | - Rt - термистор 32 | - R - балластный резистор 33 | 34 | ```cpp 35 | GyverNTC therm; // пустой конструктор 36 | 37 | GyverNTC therm(uint8_t pin, uint32_t R, uint16_t B, uint8_t t = 25, uint32_t Rt = 10000, uint8_t res = 10); 38 | // pin - аналоговый пин, к которому подключен термистор 39 | // R - сопротивление балластного резистора, Ом 40 | // B - бета-коэффициент термистора (см. даташит) [число в районе 1000-5000] 41 | // t - базовая температура термистора, градусов Цельсия (см. даташит) [обычно 25 градусов] 42 | // Rt - сопротивление термистора при базовой температуре, Ом (см. даташит) 43 | // res - разрешение АЦП, бит. По умолчанию 10 44 | ``` 45 | 46 | 47 | ## Использование 48 | ### Класс 49 | 50 | ```cpp 51 | // настроить термистор: R резистора, B термистора, t термистора, R термистора 52 | void config(uint32_t R, uint16_t B, uint8_t t = 25, uint32_t Rt = 10000); 53 | 54 | // настроить пин и разрешение АЦП 55 | void setPin(uint8_t pin, uint8_t res = 10); 56 | 57 | // прочитать температуру с пина 58 | float getTemp(); 59 | 60 | // прочитать усреднённую температуру с пина, можно указать к-во усреднений 61 | // не рекомендуется использовать больше 20 усреднений, это бессмысленно. используйте внешний фильтр 62 | float getTempAverage(uint8_t samples = 20); 63 | 64 | // получить температуру из сигнала АЦП, можно указать разрешение АЦП 65 | float computeTemp(float analog, uint8_t res = 10); 66 | ``` 67 | 68 | ### Прямой расчёт 69 | 70 | ```cpp 71 | // сигнал АЦП, (R резистора / R термистора), B термистора, t термистора, разрешение АЦП 72 | float NTC_compute(float analog, float baseDiv, uint16_t B, uint8_t t = 25, uint8_t res = 10); 73 | 74 | // сигнал АЦП, R резистора, B термистора, t термистора, R термистора, разрешение АЦП 75 | float NTC_compute(float analog, uint32_t R, uint16_t B, uint8_t t = 25, uint32_t Rt = 10000, uint8_t res = 10); 76 | ``` 77 | 78 | 79 | ## Пример 80 | Остальные примеры смотри в **examples**! 81 | ```cpp 82 | #include 83 | GyverNTC therm(0, 10000, 3435); 84 | 85 | void setup() { 86 | Serial.begin(9600); 87 | } 88 | 89 | void loop() { 90 | Serial.print("Temperature "); 91 | Serial.print(therm.getTempAverage()); 92 | Serial.println(" *C"); 93 | delay(500); 94 | } 95 | ``` 96 | 97 | ### Несколько термисторов 98 | Необязательно делать на каждый термистор свой экземпляр класса, достаточно указать пин перед измерением: 99 | 100 | ```cpp 101 | #include 102 | GyverNTC therm; 103 | 104 | void setup() { 105 | Serial.begin(9600); 106 | therm.config(10000, 3435); 107 | } 108 | 109 | void loop() { 110 | therm.setPin(0); 111 | Serial.print("Temp (pin 0): "); 112 | Serial.print(therm.getTempAverage()); 113 | Serial.println(" *C"); 114 | delay(500); 115 | 116 | therm.setPin(2); 117 | Serial.print("Temp (pin 2): "); 118 | Serial.print(therm.getTempAverage()); 119 | Serial.println(" *C"); 120 | delay(500); 121 | } 122 | ``` 123 | 124 | 125 | ## Версии 126 | - v1.0 127 | - v1.1 - небольшая оптимизация, повышение точности 128 | - v1.2 - оптимизация, поддержка 100к термисторов 129 | - v1.3 - поддержка разного разрешения АЦП 130 | - v1.4 - исправлена критическая ошибка! 131 | - v1.5 - добавлена отдельная функция для расчёта 132 | - v1.5.4 - нормальная работа при перегреве (нулевой сигнал АЦП) - функция вернёт float inf 133 | 134 | 135 | 136 | ## Установка 137 | - Библиотеку можно найти по названию **GyverNTC** и установить через менеджер библиотек в: 138 | - Arduino IDE 139 | - Arduino IDE v2 140 | - PlatformIO 141 | - [Скачать библиотеку](https://github.com/GyverLibs/GyverNTC/archive/refs/heads/main.zip) .zip архивом для ручной установки: 142 | - Распаковать и положить в *C:\Program Files (x86)\Arduino\libraries* (Windows x64) 143 | - Распаковать и положить в *C:\Program Files\Arduino\libraries* (Windows x32) 144 | - Распаковать и положить в *Документы/Arduino/libraries/* 145 | - (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив 146 | - Читай более подробную инструкцию по установке библиотек [здесь](https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA) 147 | ### Обновление 148 | - Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи 149 | - Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить" 150 | - Вручную: **удалить папку со старой версией**, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам! 151 | 152 | 153 | ## Баги и обратная связь 154 | При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [alex@alexgyver.ru](mailto:alex@alexgyver.ru) 155 | Библиотека открыта для доработки и ваших **Pull Request**'ов! 156 | 157 | При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать: 158 | - Версия библиотеки 159 | - Какой используется МК 160 | - Версия SDK (для ESP) 161 | - Версия Arduino IDE 162 | - Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде 163 | - Какой код загружался, какая работа от него ожидалась и как он работает в реальности 164 | - В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код 165 | --------------------------------------------------------------------------------