树莓派连接STH30获取温度湿度

博客介绍了i2ctool和smbus的安装,若pip install无法安装smbus2且不翻墙,可从官网下载源代码自行build。还给出了相关代码,如设置命令和读取数据的函数。同时介绍了STH30的单次采样和循环采样模式,以及对应模式的命令。

首先需要先安装i2ctool和smbus

安装说明

然后现在有了smbus2,上官网,如果pip install 装不上又不翻墙,就上官网上下源代码自己build。

代码简单如下,设置命令都用write_i2c_block_data(地址,命令高8位,命令低8位)

read_i2c_block_data(地址,0x00,读取长度一般是6)

STH30有两种模式,单次采样和循环采样模式。示例代码是循环采样模式。如果是单次采样,就是发一次采样命令,再读一次6byte的数据。也即一次write命令,一次read命令,所用命令如下图。

图1 单次采样模式命令

图2 循环采样模式命令

from smbus2 import SMBusWrapper #引入相关类
txtfile=open('mydb.txt','w')
with SMBusWrapper(1) as bus:#打开i2c
    bus.write_i2c_block_data(0x44,0x23,[0x22])#我这个STH30的默认地址是0X44,本命令写入0X2322命令,意思是设置为每秒采样4次,精确水平是中等
    time.sleep(0.016)#给STH30一点时间
    bus.write_i2c_block_data(0x44,0xe0,[0x00])#开始采样
    time.sleep(0.016)
    mycount=16
    while(mycount>0):
        data=bus.read_i2c_block_data(0x44,0x00,6)#读取采样结果
        temperature=data[0]*256+data[1]
        celsius = -45 + (175 * temperature / 65535.0)
        humidity = 100 * (data[3] * 256 + data[4]) / 65535.0
        txtfile.write(str(celsius)+','+str(humidity)+'\n')        
        time.sleep(0.25)
        mycount=mycount-1
    bus.write_i2c_block_data(0x44,0x30,[0x93])#中止循环采样模式
    time.sleep(0.016)
    bus.write_i2c_block_data(0x44,0x30,[0xa2])#STH30软重启
    time.sleep(0.016)
txtfile.close()

 

使用STM32固件库读取STH30温度数据可以按照以下步骤进行: ### 1. 初始化I2C接口 配置STM32的I2C接口,使其能够与STH30进行通信。以下是初始化I2C的示例代码: ```c #include "stm32fxxx.h" void I2C_Configuration(void) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能I2C和GPIO时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // 配置I2C引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); // 将引脚连接到I2C功能 GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); // 配置I2C参数 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStructure); // 使能I2C I2C_Cmd(I2C1, ENABLE); } ``` ### 2. 读取STH30温度数据 通过I2C接口向STH30发送命令,读取温度数据。以下是读取温度数据的示例代码: ```c #define STH30_ADDR 0x44 uint8_t cmd[2] = {0x2C, 0x06}; // 发送测量命令 uint8_t data[6]; // 发送测量命令 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, STH30_ADDR << 1, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, cmd[0]); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, cmd[1]); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1, ENABLE); // 等待测量完成 Delay(100); // 读取数据 I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, STH30_ADDR << 1, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); for(int i = 0; i < 6; i++) { if(i == 5) { I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); } while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); data[i] = I2C_ReceiveData(I2C1); } I2C_AcknowledgeConfig(I2C1, ENABLE); // 解析温度数据 uint16_t temp_raw = (data[0] << 8) | data[1]; float temperature = -45 + (175 * (float)temp_raw / 65535); ``` ### 3. 主函数调用 在主函数中调用上述初始化和读取函数,实现温度数据的读取。示例代码如下: ```c int main(void) { I2C_Configuration(); while (1) { // 读取温度数据 // 上述读取温度数据的代码可以放在这里 // 可以添加延时,避免频繁读取 Delay(1000); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值