stm32 硬I2C SHT30 驱动

SHT30 IIC_ADDRESS   0x44 

SHT30的测量较为简单,只需要一条指令即可测量

1.测量指令:uint8_t START_MEASUIRE_CMD[2] = { 0x2c, 0x06 };

2.读取指令:HAL_I2C_Master_Receive(&hi2c1, I2C_ADDRESS, rawData, 3, 0xFF);

3.计算结果

       

int main(void) {
	/* USER CODE BEGIN 1 */

	/* USER CODE END 1 */

	/* MCU Configuration--------------------------------------------------------*/

	/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
	HAL_Init();

	/* USER CODE BEGIN Init */

	/* USER CODE END Init */

	/* Configure the system clock */
	SystemClock_Config();

	/* USER CODE BEGIN SysInit */

	/* USER CODE END SysInit */

	/* Initialize all configured peripherals */
	MX_GPIO_Init();
	MX_I2C1_Init();
	MX_USART1_UART_Init();
	/* USER CODE BEGIN 2 */

	/* USER CODE END 2 */

	/* Infinite loop */
	/* USER CODE BEGIN WHILE */
//	uint8_t SOFT_RESET_CMD[2]={0x00,0x06};
//	HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS	, SOFT_RESET_CMD, 2, 0xff);
	HAL_Delay(80);


	char logdata[50];
	uint8_t rawData[6];
	float temperature, humidity;
	while (1) {
		uint8_t START_MEASUIRE_CMD[2] = { 0x2c, 0x06 };
		HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS, START_MEASUIRE_CMD, 2,0xff);
		HAL_Delay(80);
		HAL_I2C_Master_Receive(&hi2c1, I2C_ADDRESS, rawData, 3, 0xFF);

		uint16_t temRaw = (rawData[0] << 8 | rawData[1]);
		uint16_t humiRaw = (rawData[3] << 8 | rawData[4]);

		temperature = -45 + 175 * (temRaw / 65535.0);
		humidity = 100 * (humiRaw / 65535.0);

		int uartLength=sprintf(logdata,"temperature:%.2f   humidity:%.2f \r",temperature,humidity);

		HAL_UART_Transmit(&huart1, logdata, uartLength, 0xff);

		HAL_Delay(200);

		/* USER CODE END WHILE */

		/* USER CODE BEGIN 3 */
	}
	/* USER CODE END 3 */
}

uint16_t temRaw = (rawData[0] << 8 | rawData[1]);
        uint16_t humiRaw = (rawData[3] << 8 | rawData[4]);

        temperature = -45 + 175 * (temRaw / 65535.0);
        humidity = 100 * (humiRaw / 65535.0);

        int uartLength=sprintf(logdata,"temperature:%.2f   humidity:%.2f \r",temperature,humidity);

        HAL_UART_Transmit(&huart1, logdata, uartLength, 0xff);

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
声明:该设计资料来源于立创社区,仅供网友学习参考,不可用于商业用途。 基于STM32 的 USB温湿度计概述: 该USB温湿度计基于STM32F070F6P6 设计完成。STM32F070F6P6 是ST公司新出品不久的一款 ARM Cortex-M0芯片,内置 32 Kbytes Flash,6K SRAM,12Bit ADC,运行主频48MHZ,支持USB 2.0 SLAVE通信接口,更重要的是它是TSSOP20封装的! 曾经在立创商城上,有个SHT30温湿度计的方案验证板,但该设计有个麻烦的地方,那就是需要另外接串口装置才能观察到MCU测量得到的SHT30温湿度数据。为此本人,决定用带这款支持USB通讯功能的STM32F0x0超值系列ARM芯片--- STM32F070F6P6,结合温湿度传感器AM2320,制作一款USB温湿度计。 它使用很简单:直接插入PC机的USB端口,然后打开串口助手之类的软件,即可观察到现场的温湿度数据。通过这个制作,大家可以学习一下AM2320的I2C和单总线的驱动方法,还有如何使用ST的Cube MX软件来实现一个USB转串口(USB TO CDC)的通信设备。 系统构架图: 系统解说:本系统有二大部分组成,分别是:支持USB通信的ARM Cortex-M0主控芯片 STM32F070F6P6和AM2320数字式温湿度传感器。 视频演示: 作品亮点 ① 无需额外仪器装置,直插到PC后运行串口助手软件即可观察到实时的温湿度数据。 ② 采用引脚紧凑、低成本、同时支持USB通信的Cortex-M0 AMR STM32F070作为主控。 ③ 使用出厂时己校准数字信号输出的AM2320作为传感器单元。插件,极易好焊接! ④ 温度分辨率是: ±0.1度,精度±0.5度;湿度分辨率: ±0.1%RH,精度:±3%RH ⑤ 提供2种演示范例,支持单总线和标准I2C 两种通信方式来驱动AM2320传感器。 ⑥ 板上STM32F070的全部I/O都被引出,可当作一个低廉的最小系统板、开发板使用。 ⑦ 本方案验证板采用USB BUS总线供电,无需额外再提供电源。 原理图分为多个部分,逐个详见分析讲解,详见“相关文件”进行下载 USB温湿度计实物展示: 软件部分的描述 限于篇幅,这里不太方便展示全部代码,比如USB通信实现和单总线、I2C总线驱动温湿度传感器AM2320等等。需要指出的是,USB通信部分,本人直接采用了ST官方出品的STM32CubeMX软件,该软件是一个基于GUI界面配置软件,通过鼠标操作芯片的配置和功能,最终该软件即可自动产生初始化代码和一个应用程序框架范例。本电子制作就是使用这个默认生成的USB转串口(USB CDC协议)应用程序,然后添加相关的温湿度采集驱动完成的。 调试过程和应用实例 按前面提供的BOM清单,正常焊接完毕后,接着把HEX烧录到ARM STM32F070F6P6芯片,即可完成准备工作。随后,将USB电缆把该PCBA电路模块和电脑链接起来(如果Windows 系统提示需要安装驱动程序,那按默认位置按照即可)。最后,打开串口助手之类的软件,即可观察到现场的温度和湿度数据。 总结 STM32F070F6P6 是一个内置USB功能、性价比很高的芯片,结合AM2320实现了比之前SHT30方案验证板更好的应用体验。该PCB板设计时,把STM32F070F6P6的全部I/O都引出了,因此,该板可当作一个低廉的最小系统板、开发板使用。如果想学习ARM Cortex-M0 芯片的应用,特别是USB总线通信的实现过程,那本文介绍的这个电子制作作品和PCB空板,是一个不错的入门选择! 基于STM32F070和AM2320的USB温湿度计实验板购买链接:https://www.szlcsc.com/product/details_97773.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值