microDS18B20 предложения к библиотеке

релейщик

✩✩✩✩✩✩✩
26 Июл 2022
3
0
Немного пожеланий. Завел бы переменную где хранится последний статус датчика, сейчас sensor.readTemp() это не чтение переменной а обмен на шине. Добавил режим паразитного питания. например как то так
C++:
Паразитное питание датчика
#ifdef __AVR__
#define MOW_CLI() uint8_t oldSreg = SREG; cli();
#define MOW_SEI() SREG = oldSreg
#define BUS_DOWN        digitalWrite(pin,LOW); pinMode(pin, OUTPUT)   
#define BUS_UP          digitalWrite(pin,HIGH); pinMode(pin, INPUT)   
#define BUS_FORCE_UP    digitalWrite(pin,HIGH); pinMode(pin, OUTPUT)   
#else
протестировал на ESP32, для других платформ хз
#define MOW_CLI()
#define MOW_SEI()
#define BUS_DOWN        digitalWrite(pin,LOW); pinMode(pin, OUTPUT)   
#define BUS_UP          pinMode(pin, INPUT_PULLUP)   
#define BUS_FORCE_UP    digitalWrite(pin,HIGH); pinMode(pin, OUTPUT) 
#endif

bool oneWire_reset(uint8_t pin) {
    BUS_DOWN;
    delayMicroseconds(600);
    BUS_UP;
    
    MOW_CLI();
    delayMicroseconds(60);
    bool pulse = digitalRead(pin);
    MOW_SEI();
    delayMicroseconds(500);
    return !pulse;
}

void oneWire_write(uint8_t data, uint8_t pin) {
    for (uint8_t i = 8; i; i--) {
        BUS_DOWN;
        MOW_CLI();
        if (data & 1) {
            delayMicroseconds(5);
            BUS_UP;
            delayMicroseconds(60);
        } else {
            delayMicroseconds(60);
            BUS_UP;
            delayMicroseconds(5);
        }
        MOW_SEI();
        data >>= 1;
    }
    BUS_FORCE_UP;
}

uint8_t oneWire_read(uint8_t pin) {
    uint8_t data = 0;
    BUS_UP;
    for (uint8_t i = 8; i; i--) {
        data >>= 1;
        MOW_CLI();
        BUS_DOWN;
        delayMicroseconds(2);
        BUS_UP;
        delayMicroseconds(8);
        if (digitalRead(pin)) data |= (1 << 7);
        delayMicroseconds(60);
        MOW_SEI();
    }
    return data;
}
Еще заметил, если не проверяется контрольная сумма и один датчик на шине зачем читать 9 байт? просто как идея
C++:
    bool readTemp(uint8_t idx = 0) {
        #if (DS_CHECK_CRC == true)
            #define NRDBYTE 9
        #else
            #define NRDBYTE 2
        #endif
        for (uint8_t i = 0; i < NRDBYTE; i++) {           // Считать RAM
Спасибо Вам за вашу работу!
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
570
С таким лучше на почту или в issue, я заглядываю на форум очень редко

sensor.readTemp() это не чтение переменной а обмен на шине
Все верно, в данном случае кешируется getTemp

зачем читать 9 байт?
Я обрабатываю все сценарии ошибок на линии, чтобы убедиться что датчик ответил корректно. Двух байт недостаточно для полноты картины, у кого-нибудь может взорваться бойлер из за этого)
 

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
27
2
Для паразитного питания датчика, шину данных нужно подтягивать напрямую к питанию, в период конвертации датчиком данных температуры.
Это предполагает, наличие транзистора, который и будет подтягивать шину в обход резистора 4.7K. В период конвертации. и/или чтения ROM.

#define BUS_DOWN digitalWrite(pin,LOW); pinMode(pin, OUTPUT)

Что это за жесть???? :) Зачем это? Вы считаете что код от этого короче станет?

Собсно и непонятно, а в чем заключается реализация паразитного питания???
 

poty

★★★★★★✩
19 Фев 2020
3,201
934
Это предполагает, наличие транзистора
питание датчика при измерении не превышает 1,5мА, поэтому транзистор легко заменяется переводом пина данных в режим выхода и в состояние HIGH. Конечно, если датчиков, скажем, больше 10-ка и они одновременно переводятся в измерение температуры, то потребуется транзистор.
 

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
27
2
@poty, не готов оспорить... В даташите советуют подтягивать линию данных в обход 4.7K резистора. На период расчета температуры, а в случае значения температуры выше 100 и вовсе советуют отказаться от паразитного питания. Но сей момент не проверял.
 

poty

★★★★★★✩
19 Фев 2020
3,201
934
@Nitrogenium, так на выходе МК те же транзисторы, просто есть ограничения на общее потребление тока МК и тока на один вывод. Если это всё соблюсти - разницы в применении "внутреннего" и "внешнего" транзистора нет никакой.
 

релейщик

✩✩✩✩✩✩✩
26 Июл 2022
3
0
#define BUS_DOWN digitalWrite(pin,LOW); pinMode(pin, OUTPUT)
Что это за жесть???? :) Зачем это? Вы считаете что код от этого короче станет?
Собсно и непонятно, а в чем заключается реализация паразитного питания???
Для экономии проводов. Код из первого поста работал, но с версией 5.2.0 Espressif32 ардуино все посыпалось, стало слишком долгое выполнение digitalwrite, и перестала работать библиотека для шима led.
В версии 5.3.0 led поправили.
Вместо ардуиновских функций работы с портами теперь использую это.
для esp32:
#define BUS_DOWN                               \
    gpio_set_direction(Pin, GPIO_MODE_OUTPUT); \
    gpio_set_level(Pin, 0);                    \
    gpio_pullup_dis(Pin)

#define BUS_UP                                \
    gpio_set_direction(Pin, GPIO_MODE_INPUT); \
    gpio_pullup_en(Pin)

#define BUS_POWER_ON        \
    gpio_set_level(Pin, 1); \
    gpio_set_direction(Pin, GPIO_MODE_OUTPUT)

#define BUS_POWER_OFF gpio_set_direction(Pin, GPIO_MODE_INPUT)
да и библиотеку для себя попроще для одного датчика переделал со старого проекта, но как сейчас понимаю, там надо было делать намного проще, так как для esp, для опроса датчика, проще создать задачу freertos чем делать автомат состояний, как сейчас у меня.
 

Вложения

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
27
2
@релейщик, А какие провода вы собралсь сэкономить?
Я позволю себе немного пояснить, но когда вы читаете "таблетку" от замка, тоже DS... это одно, там читается ЕЕPROM. И в датчеке DS18B20 EPPROM, так же читается без проблем, именно "паразитным" питанием. А расчет температуры требует именно, нормального питания. Во всяком сдучам об этом именно и сказано в даташите.

@Nitrogenium, так на выходе МК те же транзисторы, просто есть ограничения на общее потребление тока МК и тока на один вывод. Если это всё соблюсти - разницы в применении "внутреннего" и "внешнего" транзистора нет никакой.
Это ты сам так решил, в следствии того что тебе так показалось? Или ты это реально испытал? Ты не видишь разницы, между: подключить датчик к питанию напрямую или через резистор 7.5K?

Я чутка поясню, шина 1-wire, как например и шина I2C, работает по такому принципу, что в нормальном состоянии она подтянута, к питанию, через резистор 7.5K или 10K... Питаться, для передадачи данных EPPROM можно, (как это например работает с таблетко-ключом) , но питаться сквозь резистор, датчику для расчета температуры...
Ха! Да я и сам не знаю, не проверял :) Но пейсатели даташита к этому относятся крайне негативно :)
 

poty

★★★★★★✩
19 Фев 2020
3,201
934
@Nitrogenium, datasheet-ы тоже надо уметь читать. Что такое "нормальное состояние" I2C шины? Да и резисторы подтяжки в datasheet указаны 4,7кОм. Но я говорил не об этом.
when the DS18S20 is performing temperature conversions or copying data from the scratchpad memory to EEPROM, the operating current can be as high as 1.5mA. This current can cause an unacceptable voltage drop across the weak 1-Wire pullup resistor and is more current than can be supplied by CPP. To assure that the DS18S20 has sufficient supply current, it is necessary to provide a strong pullup on the 1-Wire bus whenever temperature conversions are taking place or data is being copied from the scratchpad to EEPROM. This can be accomplished by using a MOSFET to pull the bus directly to the rail as shown in Figure 6.
Вот что написано про паразитное питание. Замечу, что "can" - это не "must" и предполагает другие возможности. Т.е., если вывод 1-Wire μP перевести в состояние HIGH на время измерения температуры, то типичный процессор с лёгкостью выдаст 1,5мА, требующиеся для этой операции. Ограничения могут наступить тогда, когда даётся групповая команда, т.е. несколько датчиков на одной шине одновременно начинают измерение температуры (Skip ROM + Convert T) .
 
Изменено:

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
27
2
@poty, Всё верно, вывод мк без проблем выдаст нужные милиамперметры, можно обойтись и без транзистора. Главное чтобы он выдал их в обход резистору, которым поддтянута шина 1-wire к питанию. Да и о чём тут спорить? Можно же проверить! Я честно, не,знаю :)
 

ASM

★★★★★✩✩
26 Окт 2018
1,557
303
Есть кто сможет починить либу на новом сдк есп32?)
Судя по логам, не работает чтение
C++:
if (sensor.readTemp()) value = sensor.getTemp();
выдает ошибку)
если проверять
C++:
if (sensor.online())
то все ОК
 

Boroda22

★✩✩✩✩✩✩
23 Фев 2022
251
42
@ASM,может вы не ту библиотеку поставили ? sensor.readTemp() и sensor.getTemp() только у Гайвера на гитхабе
 

ASM

★★★★★✩✩
26 Окт 2018
1,557
303
@Boroda22, на странице даже есть надпись про это) а Алекс ответил, что не планирует в ближайшее время фиксить)
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
570
Вышла новая версия библиотеки, работает на ESP32
 

релейщик

✩✩✩✩✩✩✩
26 Июл 2022
3
0
Просто хочу поделиться своим опытом, может он ложный, не знаю. У меня нет времени вникать в программирование и даташиты. Когда делал проект на есп с массивом датчиков (около 64 штук), вылезла бяка https://forum.arduino.ru/t/esp32-gpio-vremyanki/12086
Помогло это
vTaskSuspendAll();
xTaskResumeAll();
в паре с cli/sei
Кстати, при работе с одним датчиком этот глюк ни как не проявлялся, вылез только в адресном режиме.
 

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
27
2
@poty,
@Nitrogenium, datasheet-ы тоже надо уметь читать. Что такое "нормальное состояние" I2C шины? Да и резисторы подтяжки в datasheet указаны 4,7кОм. Но я говорил не об этом.
У меня всё отлично работало изначально! Да вообщем и продолжает работать... Даташит я отлично читаю, что и другим советую.

Что такое нормальное состояние I2C шины? Быть подтянутым к плюсу ;) А где тут связь с One-wire шиной, соображай сам :)
 

poty

★★★★★★✩
19 Фев 2020
3,201
934

@Nitrogenium, а выдержку из datasheet, что я привёл, прочитали? Мои пояснения тоже? Тогда продолжайте дальше предполагать и сомневаться.
 

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
27
2
@poty,

Ты на своих пояснениях подключи датчик и напиши код для его чтения. Я же не против твоих пояснений :)

Может, когда ты попробуешь сам что-то написать, к тебе придет понимание, как например работают домфонные "таблетки", аналогичные датчики которые вообще питания не имеют и никаких 1.5 ампер никуда не выдают.

"Вот что написано про паразитное питание. Замечу, что "can" - это не "must" и предполагает другие возможности. Т.е., если вывод 1-Wire μP перевести в состояние HIGH на время измерения температуры, то типичный процессор с лёгкостью выдаст 1,5мА, требующиеся для этой операции."

Я знаю, всё что написано про паразитное питание и как оно работает.
 

poty

★★★★★★✩
19 Фев 2020
3,201
934
@Nitrogenium, посмотри библиотеку Гайвера GyverDS18 и знания превратятся в понимание: это уже реализовано и работает именно так, как я написал.