Files
iot_skeleton/esp32/main/ds18b20.cpp
2026-04-22 20:11:55 +03:00

86 lines
2.0 KiB
C++

#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;
}