HB, OTA etc
This commit is contained in:
85
esp32/main/ds18b20.cpp
Normal file
85
esp32/main/ds18b20.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user