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 数据线 ...
随机推荐
- 如何正确地使用RecyclerView.ListAdapter
默认是在一个fragment中实现RecyclerView. private inner class CrimeAdapter() : ListAdapter<Crime, CrimeHolde ...
- fragment不适用binding的加载视图方法
abstract class BaseFragment :Fragment(){ override fun onCreateView( inflater: LayoutInflater, contai ...
- 使用BeautifulSoup高效解析网页,再也不用担心睡不着觉了
BeautifulSoup是一个可以从 HTML 或 XML 文件中提取数据的 Python 库 那需要怎么使用呢? 首先我们要安装一下这个库 1.pip install beautifulsoup4 ...
- ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心
作者:Grey 原文地址:ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 很多程序往 ...
- AlexeyAB DarkNet YOLOv3框架解析与应用实践(三)
AlexeyAB DarkNet YOLOv3框架解析与应用实践(三) ImageNet分类 您可以使用Darknet为1000级ImageNet挑战赛分类图像.如果你还没有安装Darknet,你应该 ...
- Ascend Pytorch算子功能验证
Ascend Pytorch算子功能验证 编写测试用例 以add算子为例,测试脚本文件命名为:add_testcase.py.以下示例仅为一个简单的用例实现,具体算子的实现,需要根据算子定义进行完整的 ...
- vulhub-struct2-s2-005
0x00 漏洞原理 s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码).O ...
- 解决使用Git找不到.ssh文件夹的办法
解决使用Git找不到.ssh文件夹的办法 首先生成git密钥 git config --global user.name "你的名字(最好是中文全名)" git config -- ...
- WordPress安装篇(4):YUM方式安装LNMP并部署WordPress
YUM方式安装软件的优点就是简单.方便.快捷,本文介绍在Linux上如何使用YUM方式快速安装LNMP并部署WordPress.使用Linux CentOS 7.9 + Nginx 1.18 + My ...
- [Azure DevOps] 使用 Inno Setup 制作桌面软件安装包
1. 桌面应用程序的 CI/CD 桌面应用程序的 CI/CD 过程和网站有一些不同,毕竟桌面应用程序的"部署"只是将安装包分发到目标位置,连应用商店都不用上,根据公司的管理流程可以 ...