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

релейщик

✩✩✩✩✩✩✩
26 Июл 2022
2
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
357
564
С таким лучше на почту или в issue, я заглядываю на форум очень редко

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

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

Nitrogenium

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

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

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

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

poty

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

Nitrogenium

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

poty

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

релейщик

✩✩✩✩✩✩✩
26 Июл 2022
2
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
14
1
@релейщик, А какие провода вы собралсь сэкономить?
Я позволю себе немного пояснить, но когда вы читаете "таблетку" от замка, тоже DS... это одно, там читается ЕЕPROM. И в датчеке DS18B20 EPPROM, так же читается без проблем, именно "паразитным" питанием. А расчет температуры требует именно, нормального питания. Во всяком сдучам об этом именно и сказано в даташите.

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

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

poty

★★★★★★✩
19 Фев 2020
2,957
886
@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
14
1
@poty, Всё верно, вывод мк без проблем выдаст нужные милиамперметры, можно обойтись и без транзистора. Главное чтобы он выдал их в обход резистору, которым поддтянута шина 1-wire к питанию. Да и о чём тут спорить? Можно же проверить! Я честно, не,знаю :)
 

ASM

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

Boroda22

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

ASM

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