I2C

优质
小牛编辑
131浏览
2023-12-01

通过 I2C 设备读取温湿度传感器 aht10 的温湿度数据

通过 I2C 设备读取温湿度传感器 aht10 的温湿度数据

源码

/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-15 misonyo first implementation. *//* * 程序清单:这是一个 I2C 设备使用例程 * 例程导出了 i2c_aht10_sample 命令到控制终端 * 命令调用格式:i2c_aht10_sample i2c1 * 命令解释:命令第二个参数是要使用的I2C总线设备名称,为空则使用默认的I2C总线设备 * 程序功能:通过 I2C 设备读取温湿度传感器 aht10 的温湿度数据并打印*/#include <rtthread.h>#include <rtdevice.h>#define AHT10_I2C_BUS_NAME "i2c1" /* 传感器连接的I2C总线设备名称 */#define AHT10_ADDR 0x38 /* 从机地址 */#define AHT10_CALIBRATION_CMD 0xE1 /* 校准命令 */#define AHT10_NORMAL_CMD 0xA8 /* 一般命令 */#define AHT10_GET_DATA 0xAC /* 获取数据命令 */static struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */static rt_bool_t initialized = RT_FALSE; /* 传感器初始化状态 *//* 写传感器寄存器 */static rt_err_t write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data){ rt_uint8_t buf[3]; struct rt_i2c_msg msgs; buf[0] = reg; //cmd buf[1] = data[0]; buf[2] = data[1]; msgs.addr = AHT10_ADDR; msgs.flags = RT_I2C_WR; msgs.buf = buf; msgs.len = 3; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; }}/* 读传感器寄存器数据 */static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint8_t *buf){ struct rt_i2c_msg msgs; msgs.addr = AHT10_ADDR; msgs.flags = RT_I2C_RD; msgs.buf = buf; msgs.len = len; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; }}static void read_temp_humi(float *cur_temp, float *cur_humi){ rt_uint8_t temp[6]; write_reg(i2c_bus, AHT10_GET_DATA, 0); /* 发送命令 */ read_regs(i2c_bus, 6, temp); /* 获取传感器数据 */ /* 湿度数据转换 */ *cur_humi = (temp[1] << 12 | temp[2] << 4 | (temp[3] & 0xf0) >> 4) * 100.0 / (1 << 20); /* 温度数据转换 */ *cur_temp = ((temp[3] & 0xf) << 16 | temp[4] << 8 | temp[5]) * 200.0 / (1 << 20) - 50;}static void aht10_init(const char *name){ rt_uint8_t temp[2] = {0, 0}; /* 查找I2C总线设备,获取I2C总线设备句柄 */ i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); if (i2c_bus == RT_NULL) { rt_kprintf("can't find %s device!\n", name); } else { write_reg(i2c_bus, AHT10_NORMAL_CMD, temp); rt_thread_mdelay(400); temp[0] = 0x08; temp[1] = 0x00; write_reg(i2c_bus, AHT10_CALIBRATION_CMD, temp); rt_thread_mdelay(400); initialized = RT_TRUE; }}static void i2c_aht10_sample(int argc, char *argv[]){ float humidity, temperature; char name[RT_NAME_MAX]; humidity = 0.0; temperature = 0.0; if (argc == 2) { rt_strncpy(name, argv[1], RT_NAME_MAX); } else { rt_strncpy(name, AHT10_I2C_BUS_NAME, RT_NAME_MAX); } if (!initialized) { /* 传感器初始化 */ aht10_init(name); } if (initialized) { /* 读取温湿度数据 */ read_temp_humi(&temperature, &humidity); rt_kprintf("read aht10 sensor humidity : %d.%d %%\n", (int)humidity, (int)(humidity * 10) % 10); rt_kprintf("read aht10 sensor temperature: %d.%d \n", (int)temperature, (int)(temperature * 10) % 10); } else { rt_kprintf("initialize sensor failed!\n"); }}/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(i2c_aht10_sample, i2c aht10 sample);