Умный дом всегда тогда , когда есть у вас вода,
газ , три фазы , отопленье, есть где душ и вдохновенье (туалет).
Кухни может и не БЫТЬ - если тёще рядом жить. 😏
Мудры дом уже тогда, когда есть у вас средства,
что оценят все затраты ,и режимы вам дадут,
всё почистят и помоют и болеть вам не дадут. 😑
Так же может быть защита от пожаров,
затоплений, обрушений и вторжений? 🙄
- современные условия позволяют использовать датчики , которые можно подключить к ЧИП- ам , которые обеспечивают подключение без проводной сети wifi, bluetooth.😜
Любая система - совокупность взаимосвязей возможностей, которые обеспечивают задачи согласно архитектуре и ТТХ?😎
ВВОДНЫЕ упрощённо:
Датчик bmp180 широко известен. Но примера по espressif нового не отыскал. Есть пример по esp-idf (это как бы ядро), а на него надевается потом панцирь , КОТОРЫЙ ТАМ с клещами, хвостами, кучей ножек, крылышками и получается ЖУЧАРА = комплект программных средство обеспечения разработки алгоритма для Чипа. 🎃
Естественно в силу модернизации панциря и ядра могут быть несоответствия и это печально, а и никак не даёт результат и тогда АРДУИНА рулит.👍
Итак проверим реальность использования espressif для обеспечения схемы
- материал для этого можно взять тут. Можно в поисковике ИНЕТА набрать "bmp180 esp-ide", что тоже даст материал для изучения и ПОЗНАНИЯ. 😙
за основу берём материал для esp-ide взятый тут
✔Для этого используем
- esp32 s nodemcu v1.3 (150<цена<800 яндекс маркет) или подобный
- espressif v3.00 .... v5.22 (0<цена<0 espressif.com)
- ПК ddr3 8 /128 2.5Ггц. (5т<цена<10т ) tehnosell.ru
- Advanced IP Scanner (0< <0) на просторах интернета, можно другой аналог.
- Hercules (0< <0) на просторах интернет скачать, а можно другой аналог.
- bmp180 (150<цена<800 яндекс маркет) или подобный
ЗАПУСТИМ espressif.
Создадим новый проект по двум пунктам.
Другой вариант создания нового проекта. Ниже укажем имя проекта и вид камня.
Выше по пунктам. исходник проекута тут далее правой кнопкой вызовем создание файла ниже
создадим файл. введем ниже указанный код ы него.
#include <math.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "driver/i2c.h"
#include "esp_log.h"
#include "bmp180.h"
static const char* TAG = "BMP180 I2C Driver";
#define ACK_CHECK_EN 0x1 // I2C master will check ack from slave
#define ACK_CHECK_DIS 0x0 // I2C master will not check ack from slave
#define ACK_VAL 0x0 // I2C ack value
#define NACK_VAL 0x1 // I2C nack value
#define BMP180_ADDRESS 0x77 // I2C address of BMP180
#define BMP180_ULTRA_LOW_POWER 0
#define BMP180_STANDARD 1
#define BMP180_HIGH_RES 2
#define BMP180_ULTRA_HIGH_RES 3
#define BMP180_CAL_AC1 0xAA // Calibration data (16 bits)
#define BMP180_CAL_AC2 0xAC // Calibration data (16 bits)
#define BMP180_CAL_AC3 0xAE // Calibration data (16 bits)
#define BMP180_CAL_AC4 0xB0 // Calibration data (16 bits)
#define BMP180_CAL_AC5 0xB2 // Calibration data (16 bits)
#define BMP180_CAL_AC6 0xB4 // Calibration data (16 bits)
#define BMP180_CAL_B1 0xB6 // Calibration data (16 bits)
#define BMP180_CAL_B2 0xB8 // Calibration data (16 bits)
#define BMP180_CAL_MB 0xBA // Calibration data (16 bits)
#define BMP180_CAL_MC 0xBC // Calibration data (16 bits)
#define BMP180_CAL_MD 0xBE // Calibration data (16 bits)
#define BMP180_CONTROL 0xF4 // Control register
#define BMP180_DATA_TO_READ 0xF6 // Read results here
#define BMP180_READ_TEMP_CMD 0x2E // Request temperature measurement
#define BMP180_READ_PRESSURE_CMD 0x34 // Request pressure measurement
static int16_t ac1; static int16_t ac2; static int16_t ac3; static uint16_t ac4;
static uint16_t ac5; static uint16_t ac6; static int16_t b1; static int16_t b2;
static int16_t mb; static int16_t mc; static int16_t md;
static uint8_t oversampling = BMP180_ULTRA_HIGH_RES;
static esp_err_t bmp180_master_write_slave(i2c_port_t i2c_num, uint8_t* data_wr, size_t size)
{ i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd);
i2c_master_write_byte(cmd, ( BMP180_ADDRESS << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN);
i2c_master_write(cmd, data_wr, size, ACK_CHECK_EN); i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd); return ret;
} //////////////////////////////////////////
static esp_err_t bmp180_write_reg(i2c_port_t i2c_num, uint8_t reg, uint8_t cmd)
{ uint8_t data_wr[] = {reg, cmd};
esp_err_t err = bmp180_master_write_slave(i2c_num, data_wr, 2);
if (err != ESP_OK) { ESP_LOGE(TAG, "Write [0x%02x] = 0x%02x failed, err = %d", reg, cmd, err); } return err;
}////////////////////////////////////////////
static esp_err_t bmp180_master_read_slave(i2c_port_t i2c_num, uint8_t* data_rd, size_t size)
{ if (size == 0) { return ESP_OK; }
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd);
i2c_master_write_byte(cmd, ( BMP180_ADDRESS << 1 ) | I2C_MASTER_READ, ACK_CHECK_EN);
if (size > 1) { i2c_master_read(cmd, data_rd, size - 1, ACK_VAL); }
i2c_master_read_byte(cmd, data_rd + size - 1, NACK_VAL); i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd); return ret;
} //////////////////////////////////////////////////////
static esp_err_t bmp180_read_int16(i2c_port_t i2c_num, uint8_t reg, int16_t* value)
{ esp_err_t err = bmp180_master_write_slave(i2c_num, ®, 1);
if (err == ESP_OK) { uint8_t data_rd[2] = {0};
err = bmp180_master_read_slave(i2c_num, data_rd, 2);
if (err == ESP_OK) { *value = (int16_t) ((data_rd[0] << 8) | data_rd[1]); }
} if (err != ESP_OK) { ESP_LOGE(TAG, "Read [0x%02x] int16 failed, err = %d", reg, err);
} return err;
}///////////////////////////////////////////////////////////
static esp_err_t bmp180_read_uint16(i2c_port_t i2c_num, uint8_t reg, uint16_t* value)
{ esp_err_t err = bmp180_master_write_slave(i2c_num, ®, 1);
if (err == ESP_OK) { uint8_t data_rd[2] = {0};
err = bmp180_master_read_slave(i2c_num, data_rd, 2);
if (err == ESP_OK) { *value = (uint16_t) ((data_rd[0] << 8) | data_rd[1]);}
}
if (err != ESP_OK) { ESP_LOGE(TAG, "Read [0x%02x] uint16 failed, err = %d", reg, err);}
return err;
} //////////////////////////////////////
static esp_err_t bmp180_read_uint32(i2c_port_t i2c_num, uint8_t reg, uint32_t* value)
{ esp_err_t err = bmp180_master_write_slave(i2c_num, ®, 1);
if (err == ESP_OK) { uint8_t data_rd[3] = {0};
err = bmp180_master_read_slave(i2c_num, data_rd, 3);
if (err == ESP_OK) {
*value = (uint32_t) ((data_rd[0] << 16) | (data_rd[1] << 8) | data_rd[2]); }
}
if (err != ESP_OK) { ESP_LOGE(TAG, "Read [0x%02x] uint16 failed, err = %d", reg, err);}
return err;
}//////////////////////////////////////////////////////////////////
static esp_err_t bmp180_read_uncompensated_temperature(int16_t* temp)
{ esp_err_t err = bmp180_write_reg(I2C_NUM_0, BMP180_CONTROL, BMP180_READ_TEMP_CMD);
if (err == ESP_OK) { TickType_t xDelay = 5 / portTICK_PERIOD_MS;
if (xDelay == 0) { xDelay = 1; } vTaskDelay(xDelay);
err = bmp180_read_int16(I2C_NUM_0, BMP180_DATA_TO_READ, temp);
} if (err != ESP_OK) {
ESP_LOGE(TAG, "Read uncompensated temperature failed, err = %d", err);
} return err;
}///////////////////////////////////////////////////////
static esp_err_t bmp180_calculate_b5(int32_t* b5)
{ int16_t ut; int32_t x1, x2;
esp_err_t err = bmp180_read_uncompensated_temperature(&ut);
if (err == ESP_OK) { x1 = ((ut - (int32_t) ac6) * (int32_t) ac5) >> 15;
x2 = ((int32_t) mc << 11) / (x1 + md); *b5 = x1 + x2;
} else { ESP_LOGE(TAG, "Calculate b5 failed, err = %d", err);}
return err;
}//////////////////////////////////////////////////////
static uint32_t bmp180_read_uncompensated_pressure(uint32_t* up)
{
esp_err_t err = bmp180_write_reg(I2C_NUM_0, BMP180_CONTROL, BMP180_READ_PRESSURE_CMD + (oversampling << 6));
if (err == ESP_OK) {
TickType_t xDelay = (2 + (3 << oversampling)) / portTICK_PERIOD_MS;
if (xDelay == 0) { xDelay = 1; } vTaskDelay(xDelay);
err = bmp180_read_uint32(I2C_NUM_0, BMP180_DATA_TO_READ, up);
if (err == ESP_OK) { *up >>= (8 - oversampling); }
} if (err != ESP_OK) {
ESP_LOGE(TAG, "Read uncompensated pressure failed, err = %d", err);
} return err;
} //////////////////////////////////////////////////
esp_err_t bmp180_read_temperature(float* temperature)
{ int32_t b5; esp_err_t err = bmp180_calculate_b5(&b5);
if (err == ESP_OK) { *temperature = ((b5 + 8) >> 4) / 10.0;
} else { ESP_LOGE(TAG, "Read temperature failed, err = %d", err);}
return err;
}//////////////////////////////////////////////////
esp_err_t bmp180_read_pressure(uint32_t* pressure)
{ int32_t b3, b5, b6, x1, x2, x3, p; uint32_t up, b4, b7; esp_err_t err;
err = bmp180_calculate_b5(&b5);
if (err == ESP_OK) { b6 = b5 - 4000; x1 = (b2 * (b6 * b6) >> 12) >> 11;
x2 = (ac2 * b6) >> 11; x3 = x1 + x2;
b3 = (((((int32_t)ac1) * 4 + x3) << oversampling) + 2) >> 2;
x1 = (ac3 * b6) >> 13; x2 = (b1 * ((b6 * b6) >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (uint32_t)(x3 + 32768)) >> 15;
err = bmp180_read_uncompensated_pressure(&up);
if (err == ESP_OK) { b7 = ((uint32_t)(up - b3) * (50000 >> oversampling));
if (b7 < 0x80000000) { p = (b7 << 1) / b4; } else { p = (b7 / b4) << 1; }
x1 = (p >> 8) * (p >> 8); x1 = (x1 * 3038) >> 16; x2 = (-7357 * p) >> 16;
p += (x1 + x2 + 3791) >> 4; *pressure = p; }
} if (err != ESP_OK) { ESP_LOGE(TAG, "Pressure compensation failed, err = %d", err);}
return err;
}///////////////////////////////////////////////////
esp_err_t bmp180_read_altitude(uint32_t reference_pressure, float* altitude)
{uint32_t absolute_pressure;
esp_err_t err = bmp180_read_pressure(&absolute_pressure);
if (err == ESP_OK) { *altitude = 44330 * (1.0 - powf(absolute_pressure / (float) reference_pressure, 0.190295));
} else { ESP_LOGE(TAG, "Read altitude failed, err = %d", err); }
return err;
}///////////////////////////////////////////////
esp_err_t bmp180_init(int pin_sda, int pin_scl)
{esp_err_t err; i2c_config_t conf; conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = pin_sda; conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_io_num = pin_scl; conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = 100000; conf.clk_flags = 0;
err = i2c_param_config(I2C_NUM_0, &conf);
if (err != ESP_OK) {
ESP_LOGE(TAG, "I2C driver configuration failed with error = %d", err);
return ESP_ERR_BMP180_NOT_DETECTED; }
i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0);
if (err != ESP_OK) {
ESP_LOGE(TAG, "I2C driver installation failed with error = %d", err);
return ESP_ERR_BMP180_NOT_DETECTED; }
ESP_LOGI(TAG, "I2C master driver has been installed.");
uint8_t reg = 0x00;
err = bmp180_master_write_slave(I2C_NUM_0, ®, 1);
if (err != ESP_OK) {
ESP_LOGE(TAG, "BMP180 sensor not found at 0x%02x", BMP180_ADDRESS);
return ESP_ERR_BMP180_NOT_DETECTED; }
ESP_LOGI(TAG, "BMP180 sensor found at 0x%02x", BMP180_ADDRESS);
err = bmp180_read_int16(I2C_NUM_0, BMP180_CAL_AC1, &ac1);
err |= bmp180_read_int16(I2C_NUM_0, BMP180_CAL_AC2, &ac2);
err |= bmp180_read_int16(I2C_NUM_0, BMP180_CAL_AC3, &ac3);
err |= bmp180_read_uint16(I2C_NUM_0, BMP180_CAL_AC4, &ac4);
err |= bmp180_read_uint16(I2C_NUM_0, BMP180_CAL_AC5, &ac5);
err |= bmp180_read_uint16(I2C_NUM_0, BMP180_CAL_AC6, &ac6);
err |= bmp180_read_int16(I2C_NUM_0, BMP180_CAL_B1, &b1);
err |= bmp180_read_int16(I2C_NUM_0, BMP180_CAL_B2, &b2);
err |= bmp180_read_int16(I2C_NUM_0, BMP180_CAL_MB, &mb);
err |= bmp180_read_int16(I2C_NUM_0, BMP180_CAL_MC, &mc);
err |= bmp180_read_int16(I2C_NUM_0, BMP180_CAL_MD, &md);
if (err != ESP_OK) {
ESP_LOGE(TAG, "BMP180 sensor calibration read failure, err = %d", err);
return ESP_ERR_BMP180_CALIBRATION_FAILURE; }
ESP_LOGI(TAG, "AC1: %d, AC2: %d, AC3: %d, AC4: %d, AC5: %d, AC6: %d", ac1, ac2, ac3, ac4, ac5, ac6);
ESP_LOGI(TAG, "B1: %d, B2: %d, MB: %d, MC: %d, MD: %d", b1, b2, mb, mc, md);
return ESP_OK;
}
//////////////////////////////////////////////////////////////////////////
Далее выполним пуyкты - создадим файл bmp180.h
Вводим код в него ниже указанный
#ifndef BMP180_H
#define BMP180_H
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
#define ESP_ERR_BMP180_BASE 0x30000
#define ESP_ERR_TOO_SLOW_TICK_RATE (ESP_ERR_BMP180_BASE + 1)
#define ESP_ERR_BMP180_NOT_DETECTED (ESP_ERR_BMP180_BASE + 2)
#define ESP_ERR_BMP180_CALIBRATION_FAILURE (ESP_ERR_BMP180_BASE + 3)
esp_err_t bmp180_init(int pin_sda, int pin_scl);
esp_err_t bmp180_read_temperature(float* temperature);
esp_err_t bmp180_read_pressure(uint32_t* pressure);
esp_err_t bmp180_read_altitude(uint32_t reference_pressure, float* altitude);
#ifdef __cplusplus
}
#endif
#endif // BMP180_H
В файл main.c вводим код ниже
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "bmp180.h"
static const char *TAG = "BMP180 I2C Read";
#define REFERENCE_PRESSURE 101325l
#define I2C_PIN_SDA 21
#define I2C_PIN_SCL 22
void bmp180_task(void *pvParameter)
{ while(1) { esp_err_t err; uint32_t pressure;
float altitude; float temperature; err = bmp180_read_pressure(&pressure);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Reading of pressure from BMP180 failed, err = %d", err);
} err = bmp180_read_altitude(REFERENCE_PRESSURE, &altitude);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Reading of altitude from BMP180 failed, err = %d", err);
} err = bmp180_read_temperature(&temperature);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Reading of temperature from BMP180 failed, err = %d", err);
}
/*ESP_LOGI(TAG, "Pressure %d Pa, Altitude %.1f m, Temperature : %.1f degC", pressure, altitude, temperature);*/
ESP_LOGI(TAG, "Pressure %li Pa, Altitude %.1f m, Temperature : %.1f degC", pressure, altitude, temperature);
vTaskDelay(1000 / portTICK_PERIOD_MS);}
}/////////////////////////////////////////////
void app_main()
{ esp_err_t err; err = bmp180_init(I2C_PIN_SDA, I2C_PIN_SCL);
if(err == ESP_OK){
xTaskCreate(&bmp180_task, "bmp180_task", 1024*4, NULL, 5, NULL);
} else { ESP_LOGE(TAG, "BMP180 init failed with error = %d", err);}
}
далее допишем как показано ниже
Сохраняем и на компиляцию= отладку пункт 1 ниже.
отладка выявила ошибки))) устраним поискав причину в ИНЕТЕ!!!!
набрав portTICK_RATE_MS и тут хихи правим код меняя на portTICK_PERIOD_MS . Снова на отладку пункт1)))
после пункта 1 - отладки
Запустим утилиту hercules
Выполним пункты 3 штуки . Наблюдаем.
Подведем датчик к лампочке или к батареи и увидим изменение показаний!😜
Значит данные идут и осталось их рихтовать .🚩 ВАЖНО Обычно беру лёд с холодильника и ложу туда градусник ртутный и датчик, и списываю показания периодически как надо в таблицу при таянии льда и сравниваю градусник с датчиком до стабилизации комнатной. На основе построенного графиков ввожу поправки по углу нарастания и коррекции на ноль.
ПРОСТО упростим и добавим 275'C )))
- В функции void bmp180_task(void *pvParameter) доработаем
///Было
ESP_LOGI(TAG, "Pressure %li Pa, Altitude %.1f m, Temperature : %.1f degC", pressure, altitude, temperature);
//СТАЛО
ESP_LOGI(TAG, "Pressure %li Pa, Altitude %.1f m, Temperature : %.1f degC", pressure, altitude, temperature+275);
На отладку и прошивку потом запустить HERCULES.и увидеть.
СПОНСОР ООО АК ПРАВОВОЕ СОТРУДНИЧЕСТВО.
ранее actel,RU
БЛОКИ ПИТАНИЯ И ОБОРУДОВАНИЕ ИСПОЛЬЗОВАЛИСЬ OWEN,RU