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. 调试备忘录-SWD协议解析

    目录--点击可快速直达 目录 写在前面 1  SWD协议简介 2  SWD物理层协议解析 2.1  SWD通信时序分析 2.2  SWD 寄存器简介 2.2.1  DP寄存器 2.2.2  AP寄存器 ...

  2. nginx 的访问日志切割

    1. 高级用法–使用 nginx 本身来实现 当 nginx 在容器里,把 nginx 日志挂载出来的时候,我们发现就不适合再使用 kill -USR1 的方式去分割日志这时候当然就需要从 nginx ...

  3. Python+Selenium学习笔记11 - python官网的tutorial - 定义函数

    1 def f(a, L=[]): 2 L.append(a) 3 return L 4 5 print f(5) 6 print f(2) 输出 1 def f(a, L=None): 2 if L ...

  4. checkbox,select,radio 选取值,设定值,回显值

    获取一组radio被选中项的值var item = $('input[@name=items][@checked]').val();获取select被选中项的文本var item = $(" ...

  5. noip模拟5[string·matrix·big·所驼门王的宝藏]

    怎么说呢这一场考得还算可以呢 拿了120pts,主要是最后一个题灵光开窍,想起来是tarjan,然后勉勉强强拿了40pts,本来是可以拿满分的,害 没事考完了就要反思 这场考试我心态超好,从第一个题开 ...

  6. java IO教程《四》

    properties使用 什么是Properties? Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置 ...

  7. TensorFlow反向传播算法实现

    TensorFlow反向传播算法实现 反向传播(BPN)算法是神经网络中研究最多.使用最多的算法之一,用于将输出层中的误差传播到隐藏层的神经元,然后用于更新权重. 学习 BPN 算法可以分成以下两个过 ...

  8. jvm相关自我总结和 VisualVM工具的使用

    idea 二个工具: jclasslib Hexview jdk监控工具 VisualVM工具的使用: https://www.ibm.com/developerworks/cn/java/j-lo- ...

  9. Redis 面试题 - 收藏版 (持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  10. 深入理解Spring的两大特征(IOC和AOP)

    一.spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很 ...