Немного пожеланий. Завел бы переменную где хранится последний статус датчика, сейчас sensor.readTemp() это не чтение переменной а обмен на шине. Добавил режим паразитного питания. например как то так
Еще заметил, если не проверяется контрольная сумма и один датчик на шине зачем читать 9 байт? просто как идея
Спасибо Вам за вашу работу!
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;
}
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