86 lines
2.0 KiB
C++
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;
|
|
}
|
|
|