ESP32介绍
esp32 是乐鑫出品的双核处理器,自带wifi和蓝牙,用于IOT领域,更多详情参考乐鑫官网
SHT20介绍
sht20 是一款温湿度传感器,广泛用于物联网行业,使用I2C通信协议
I2C介绍
2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。下面我们分别对 I2C协议的物理层及协议层进行讲解。
ESP32带硬件I2C,只要调用相关API即可,用起来非常简单。
问题
按照正常的协议进行调试,一直在读数据上出问题,使用了多种方式都不行
仔细检查SHT20的ds,发现如下说明:
进行数据测量的时候,未准备好的时候,没有ACK返回,这个时候就会失败。知道原因后处理就方便多了,这块等待知道读取到数据
/**
* @brief read data
* @param
* sensor
* tp
* rh
* @retval
* ESP_OK:
* ESP_ERR:
*/
esp_err_t iot_sht20_get_data(sht20_handle_t sensor, float* tp, float* rh)
{
uint8_t data[3];
sht20_dev_t* sens = (sht20_dev_t*) sensor;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
uint16_t tmp;
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (sens->dev_addr << 1) | WRITE_BIT, ACK_CHECK_EN);
if (tp)
i2c_master_write_byte(cmd, TEMP_MASUREMENT, ACK_CHECK_EN);
if (rh)
i2c_master_write_byte(cmd, HUMI_MASUREMENT, ACK_CHECK_EN);
i2c_master_stop(cmd);
int ret = iot_i2c_bus_cmd_begin(sens->bus, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
if (ret == ESP_FAIL) {
ESP_LOGE(TAG, "SNED WRITE ERROR\n");
return ESP_FAIL;
}
do {
// ets_delay_us(200 * 1000);
vTaskDelay(100 / portTICK_PERIOD_MS);
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (sens->dev_addr << 1) | READ_BIT, ACK_CHECK_EN);
i2c_master_read(cmd, data, 2, ACK_VAL);
i2c_master_read_byte(cmd, &data[2], NACK_VAL);
i2c_master_stop(cmd);
ret = iot_i2c_bus_cmd_begin(sens->bus, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
if (ret == ESP_FAIL) {
ESP_LOGE(TAG, "SEND READ ERROR \n");
}
}while (ret != ESP_OK);
tmp = (data[0] << 8) | (data[1]<<0);
tmp &= ~0x0003;
if (rh) {
*rh = ((float)tmp * 0.00190735)-6;
}
if (tp) {
*tp = ((float)tmp * 0.00268127)-46.85;
}
return ESP_OK;
}