static const char *TAG = "i2c-temp";
static unsigned char sht30_buf[6]={0};
static float g_temp=0.0, g_rh=0.0; /**
* I2C主机初始化
*/
static esp_err_t i2c_master_init(void)
{
int i2c_master_port = I2C_MASTER_NUM;
i2c_config_t conf;
conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = IO_SENSOR_SDA;
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_io_num = IO_SENSOR_SCL;
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = I2C_MASTER_FREQ_HZ;
i2c_param_config(i2c_master_port, &conf);
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
} /*
* 初始化sht30
* _________________________________________________________________
* | start | slave_addr + wr_bit + ack | write 1 byte + ack | stop |
* --------|---------------------------|---------------------|------|
*/
int sht30_init(void)
{
int ret;
//配置SHT30的寄存器
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄
i2c_master_start(cmd); // 启动I2C
i2c_master_write_byte(cmd, SHT30_WRITE_ADDR << 1 | WRITE_BIT, ACK_CHECK_EN); // 发地址+写+检查ack
i2c_master_write_byte(cmd, CMD_FETCH_DATA_H, ACK_CHECK_EN); // 发数据高8位+检查ack
i2c_master_write_byte(cmd, CMD_FETCH_DATA_L, ACK_CHECK_EN); // 发数据低8位+检查ack
i2c_master_stop(cmd); // 停止I2C
ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 100 / portTICK_RATE_MS); //I2C发送
i2c_cmd_link_delete(cmd); //删除I2C句柄
return ret; } /*
* sht30校验算法
* @param[in] pdata :需要校验的数据
* @param[in] nbrOfBytes :需要校验的数据长度
* @retval int :校验值
*/
unsigned char SHT3X_CalcCrc(unsigned char *data, unsigned char nbrOfBytes)
{
unsigned char bit; // bit mask
unsigned char crc = 0xFF; // calculated checksum
unsigned char byteCtr; // byte counter
unsigned int POLYNOMIAL = 0x131; // P(x) = x^8 + x^5 + x^4 + 1 = 100110001 // calculates 8-Bit checksum with given polynomial
for(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++) {
crc ^= (data[byteCtr]);
for(bit = 8; bit > 0; --bit) {
if(crc & 0x80) {
crc = (crc << 1) ^ POLYNOMIAL;
} else {
crc = (crc << 1);
}
}
}
return crc;
} /*
* sht30数据校验
* @param[in] pdata :需要校验的数据
* @param[in] nbrOfBytes :需要校验的数据长度
* @param[in] checksum :校验的结果
* @retval int :0成功,其他失败
*/
unsigned char SHT3X_CheckCrc(unsigned char *pdata, unsigned char nbrOfBytes, unsigned char checksum)
{
unsigned char crc;
crc = SHT3X_CalcCrc(pdata, nbrOfBytes);// calculates 8-Bit checksum
if(crc != checksum)
{
return 1;
}
ESP_LOGI(TAG, "error crc:,%d", crc);
return 0;
} /**
* 获取sht30温湿度
* ______________________________________________________________________________________
* | start | slave_addr + rd_bit + ack | read 1 byte + ack | read 1 byte + nack | stop |
* --------|---------------------------|--------------------|--------------------|------|
*/
int sht30_get_value(void)
{
ESP_LOGI(TAG, "begin sht30 get value");
int ret;
//配置SHT30的寄存器
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); //新建操作I2C句柄
i2c_master_start(cmd); //启动I2C
i2c_master_write_byte(cmd, SHT30_WRITE_ADDR << 1 | READ_BIT, ACK_CHECK_EN); //发地址+读+检查ack
i2c_master_read_byte(cmd, &sht30_buf[0], ACK_VAL); //读取数据+回复ack
i2c_master_read_byte(cmd, &sht30_buf[1], ACK_VAL); //读取数据+回复ack
i2c_master_read_byte(cmd, &sht30_buf[2], ACK_VAL); //读取数据+回复ack
i2c_master_read_byte(cmd, &sht30_buf[3], ACK_VAL); //读取数据+回复ack
i2c_master_read_byte(cmd, &sht30_buf[4], ACK_VAL); //读取数据+回复ack
i2c_master_read_byte(cmd, &sht30_buf[5], NACK_VAL); //读取数据+不回复ack
i2c_master_stop(cmd); //停止I2C
ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 100 / portTICK_RATE_MS); //I2C发送
if(ret!=ESP_OK)
{
return ret;
}
i2c_cmd_link_delete(cmd); //删除I2C句柄
//校验读出来的数据,算法参考sht30 datasheet
if( (!SHT3X_CheckCrc(sht30_buf,2,sht30_buf[2])) && (!SHT3X_CheckCrc(sht30_buf+3,2,sht30_buf[5])) )
{
ret = ESP_OK;//成功
}
else
{
ret = 1;
}
ESP_LOGI(TAG, "ret:%d",ret);
return ret;
} static void i2c_temp_task(void *arg)
{
ESP_LOGI(TAG, "begin temp task");
while (1) {
//获取温湿度
if(sht30_get_value()==ESP_OK)
{
//算法参考sht30 datasheet
g_temp =( ( ( (sht30_buf[0]*256) +sht30_buf[1]) *175 )/65535.0 -45 );
g_rh = ( ( (sht30_buf[3]*256) + (sht30_buf[4]) )*100/65535.0) ;
ESP_LOGI("SHT30", "temp:%4.2f ℃ \r\n", g_temp); // ℃打印出来是乱码,所以用C
ESP_LOGI("SHT30", "hum:%4.2f %%RH \r\n", g_rh);
}
vTaskDelay(6000/portTICK_RATE_MS);
}
vTaskDelete(NULL);
} void i2c_temp_start(void)
{
ESP_LOGI(TAG, "start get temperature and humidity");
ESP_ERROR_CHECK(i2c_master_init());
sht30_init();
vTaskDelay(500/portTICK_RATE_MS);
xTaskCreate(i2c_temp_task, "i2c_temp_task", 1024 * 2, (void *)0, 10, NULL);
}

ESP32S2获取sht30温湿度的更多相关文章

  1. 带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例

    转载请以链接形式注明文章来源,MicroPythonQQ交流群:157816561,公众号:MicroPython玩家汇 历来关于温湿度的检测都是没有间断过的,这次我们继续检测温湿度,同样还是使用DH ...

  2. 2022年写的香橙派 OrangePi Zero 用python获取dht11温度和湿度

    感谢网上资料和个人的不放弃,终于方便的解决了香橙派 OrangePi Zero用python获取dht11温湿度的问题. 网上关于香橙派的资料比起树莓派真是少之又少,现在香橙派zero能干的活暂时也只 ...

  3. 树莓派 基于Web的温度计

    前言:家里的树莓派吃灰很久,于是拿出来做个室内温度展示也不错. 板子是model b型. 使用Python开发,web框架是flask,温度传感器是ds18b20 1 硬件连接 ds18b20的vcc ...

  4. ZigBee毕设

    毕设题目: —————————————————————————————————————————————————————————————————————————————— 基于Zigbee的智能家居监测 ...

  5. 基于uFUN开发板和扩展板的联网校准时钟

    项目概述 上周在uFUN试用群里看到管理员说试用活动快结束了,要抓紧完成评测总结,看大家的评测总结也都写了,我也不能落后啊!正好最近做的扩展板到手了,于是赶紧进行调试,做了一个不用校准的时钟,时钟这种 ...

  6. 对之前IoT项目的完善

    博文有点长,因为是两个大项目(四个小项目)放一起了,不过都很适合新手小白(有源程序的情况),也可以再接 OLED 屏,就是前几篇博客的操作 一.esp8266 读取 DHT11 数据并通过微信小程序发 ...

  7. OneNET麒麟座应用开发之三:获取温湿度数据

    对于大气环境监测来说温湿度也是重要的指标.原本计划使用SHT15来采集温湿度数据,不过在OneNET麒麟开发板上,我们发现已经集成有SHT20温湿度传感器,于是我们就使用它了.如下图的红框处: 我们还 ...

  8. ARM-LINUX自动采集温湿度传感器数据

    开机root自动登录 如果想在超级终端输入回车,登录后执行,则可以在/etc/profile中加入命令: 如果实现开机自动登录,在/etc/inittab中修改,每个开发板修改的方式可能都不同. ht ...

  9. [Micropython]TPYBoard v202 v102+v202 家庭无线温湿度检测

     一.实验器件 1.TPYBoard v102 1块 2.TPYBoard v202 1块 3.Nokia 5110LCD显示屏 1块 4.DHT11温湿度传感器 1个 5.micro USB 数据线 ...

随机推荐

  1. Ajax向服务器端发送请求

    Ajax向服务器端发送请求 Ajax的应用场景 页面上拉加载更多数据 列表数据无刷新分页 表单项离开焦点数据验证 搜索框提示文字下拉列表 Ajax运行原理 Ajax 相当于浏览器发送请求与接收响应的代 ...

  2. 拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 最近接个任务,用webhook做了个代码提交监听功能,就是有人 ...

  3. [论文阅读笔记] LouvainNE Hierarchical Louvain Method for High Quality and Scalable Network Embedding

    [论文阅读笔记] LouvainNE: Hierarchical Louvain Method for High Quality and Scalable Network Embedding 本文结构 ...

  4. Django(50)drf异常模块源码分析

    异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_exception(exc) 源码分析 我们点击handle_exception跳转,查看该 ...

  5. 可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读

    可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读 Visual Deprojection: Probabilistic Recovery of Collapsed Dimensions 论文链接: ...

  6. AIoT开放平台及应用

    AIoT开放平台及应用 阿里AIoT开放平台,是阿里云IoT面向开发者的能力接入渠道,开发者可以在这里完成能力的申请.开通.部署.配置和集成开发等一些列工作.这些能力并不的独立交付,而是通过关联到行业 ...

  7. nvGRAPH API参考分析(一)

    nvGRAPH API参考分析(一) 本文通过描述nvGRAPH库函数的输入/输出参数,数据类型和错误代码来指定其行为. 1.    返回值nvgraphStatus_t 除以下内容外,所有nvGRA ...

  8. KITTI数据集上MaskRCNN检测效果示例

    KITTI数据集上MaskRCNN检测效果示例 在Semantic Instance Segmentation Evaluation中,MaskRCNN性能效果排名第一. Test Image 0 I ...

  9. 看懂redis配置文件

    看懂redis 配置文件: https://blog.csdn.net/liqingtx/article/details/60330555 redis 数据库缓存双写一致性解决方案: https:// ...

  10. 【NX二次开发】Block UI 指定平面

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...