ESP32S2获取sht30温湿度
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温湿度的更多相关文章
- 带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
转载请以链接形式注明文章来源,MicroPythonQQ交流群:157816561,公众号:MicroPython玩家汇 历来关于温湿度的检测都是没有间断过的,这次我们继续检测温湿度,同样还是使用DH ...
- 2022年写的香橙派 OrangePi Zero 用python获取dht11温度和湿度
感谢网上资料和个人的不放弃,终于方便的解决了香橙派 OrangePi Zero用python获取dht11温湿度的问题. 网上关于香橙派的资料比起树莓派真是少之又少,现在香橙派zero能干的活暂时也只 ...
- 树莓派 基于Web的温度计
前言:家里的树莓派吃灰很久,于是拿出来做个室内温度展示也不错. 板子是model b型. 使用Python开发,web框架是flask,温度传感器是ds18b20 1 硬件连接 ds18b20的vcc ...
- ZigBee毕设
毕设题目: —————————————————————————————————————————————————————————————————————————————— 基于Zigbee的智能家居监测 ...
- 基于uFUN开发板和扩展板的联网校准时钟
项目概述 上周在uFUN试用群里看到管理员说试用活动快结束了,要抓紧完成评测总结,看大家的评测总结也都写了,我也不能落后啊!正好最近做的扩展板到手了,于是赶紧进行调试,做了一个不用校准的时钟,时钟这种 ...
- 对之前IoT项目的完善
博文有点长,因为是两个大项目(四个小项目)放一起了,不过都很适合新手小白(有源程序的情况),也可以再接 OLED 屏,就是前几篇博客的操作 一.esp8266 读取 DHT11 数据并通过微信小程序发 ...
- OneNET麒麟座应用开发之三:获取温湿度数据
对于大气环境监测来说温湿度也是重要的指标.原本计划使用SHT15来采集温湿度数据,不过在OneNET麒麟开发板上,我们发现已经集成有SHT20温湿度传感器,于是我们就使用它了.如下图的红框处: 我们还 ...
- ARM-LINUX自动采集温湿度传感器数据
开机root自动登录 如果想在超级终端输入回车,登录后执行,则可以在/etc/profile中加入命令: 如果实现开机自动登录,在/etc/inittab中修改,每个开发板修改的方式可能都不同. ht ...
- [Micropython]TPYBoard v202 v102+v202 家庭无线温湿度检测
一.实验器件 1.TPYBoard v102 1块 2.TPYBoard v202 1块 3.Nokia 5110LCD显示屏 1块 4.DHT11温湿度传感器 1个 5.micro USB 数据线 ...
随机推荐
- python 解析html网页
pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,使用方法: 代码如下: from pyquery import PyQuery as pq 1.可加载一段HTML字符串 ...
- MongoDB(13)- 查询操作返回指定的字段
插入测试数据 db.inventory.insertMany( [ { item: "journal", status: "A", size: { h: 14, ...
- GO学习-(26) Go语言操作mongoDB
Go语言操作mongoDB mongoDB是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库(NoSQL)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. ...
- Jmeter- 笔记1 - 理论知识
为什么不用loadrunner,lonadrunner免费最大并发用户50,再往上就要买license了. 性能输出结果不是bug 假如调试脚本没有出错,但运行脚本时,可能前期没有问题,但到后期偶尔/ ...
- TVM性能评估分析(四)
TVM性能评估分析(四) Figure 1. Efficient Privacy-Preserving ML Using TVM Figure 2. Motivation: Privacy-Pre ...
- 从PyTorch到ONNX的端到端AlexNet
从PyTorch到ONNX的端到端AlexNet 这是一个简单的脚本,可将Torchvision中定义的经过预训练的AlexNet导出到ONNX中.运行一轮推理Inference,然后将生成的跟踪模型 ...
- 短波红外(SWIR)相机camera
短波红外(SWIR)相机camera AVs Can't Drive Everywhere. Can TriEye's SWIR Camera Help? TriEye的短波红外(SWIR)摄像机能否 ...
- 转置卷积Transposed Convolution
转置卷积Transposed Convolution 我们为卷积神经网络引入的层,包括卷积层和池层,通常会减小输入的宽度和高度,或者保持不变.然而,语义分割和生成对抗网络等应用程序需要预测每个像素的值 ...
- jmeter的参数化实现
背景: 在实际的测试工作中,我们经常需要对多组不同的输入数据,进行同样的测试操作步骤,以验证我们的软件的功能.这种测试方式在业界称为数据驱动测试,而在实际测试工作中,测试工具中实现不同数据输入的过程称 ...
- springboot——修改html实时生效,不用重启tomca(idea版)
第一步: 在全局配置文件(application.properties)中禁用thymeleaf模板引擎的缓存,缓存是默认开启的 spring.thymeleaf.cache=false 第二步: 在 ...