#include "ds18b20.h" extern "C" { #include "onewire_bus.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" } static const char *TAG = "ds18b20"; static onewire_bus_handle_t bus; uint8_t ds_crc8(const uint8_t *data, int len) { uint8_t crc = 0; for (int i = 0; i < len; i++) { uint8_t inbyte = data[i]; for (int j = 0; j < 8; j++) { uint8_t mix = (crc ^ inbyte) & 0x01; crc >>= 1; if (mix) crc ^= 0x8C; inbyte >>= 1; } } return crc; } void ds18b20_init(gpio_num_t pin) { onewire_bus_config_t bus_config = {}; bus_config.bus_gpio_num = pin; onewire_bus_rmt_config_t rmt_config = {}; rmt_config.max_rx_bytes = 10; ESP_ERROR_CHECK(onewire_new_bus_rmt(&bus_config, &rmt_config, &bus)); ESP_LOGI(TAG, "OneWire bus initialized"); } float ds18b20_read() { uint8_t data[9]; uint8_t buf[4] = {0x4E, 0, 0, 0x3F}; // 10-bit (0x3F) // reset ESP_ERROR_CHECK(onewire_bus_reset(bus)); // SKIP ROM (один датчик) uint8_t cmd = 0xCC; ESP_ERROR_CHECK(onewire_bus_write_bytes(bus, &cmd, 1)); //ESP_ERROR_CHECK(onewire_bus_write_bytes(bus, buf, 4)); // CONVERT T cmd = 0x44; ESP_ERROR_CHECK(onewire_bus_write_bytes(bus, &cmd, 1)); vTaskDelay(pdMS_TO_TICKS(750)); // reset снова ESP_ERROR_CHECK(onewire_bus_reset(bus)); // SKIP ROM cmd = 0xCC; ESP_ERROR_CHECK(onewire_bus_write_bytes(bus, &cmd, 1)); // READ SCRATCHPAD cmd = 0xBE; ESP_ERROR_CHECK(onewire_bus_write_bytes(bus, &cmd, 1)); ESP_ERROR_CHECK(onewire_bus_read_bytes(bus, data, 9)); ESP_LOGI(TAG, "RAW: %02X %02X %02X %02X %02X %02X %02X %02X | CRC %02X", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]); uint8_t crc = ds_crc8(data, 8); if (crc != data[8]) { ESP_LOGW(TAG, "CRC error"); } int16_t raw = (data[1] << 8) | data[0]; return raw / 16.0f; }