艾迈斯欧司朗 AS6221-EK 测评
分享作者:user202505087040
评测品牌:艾迈斯欧司朗
评测型号:AS6221-EK
发布时间:2025-07-04 12:00:51
0
前言
AS6221 是市场上精度最高的数字温度传感器系统 (+/- 0.09°C)。它通过标准 I²C 接口提供测量输出,且支持 8 个 I²C 地址。
开源口碑分享内容

AS6221-EK介绍

AS6221是市场上精度最高的数字温度传感器系统,具备完整的数字化系统,可以快速准确的获取测试位置的温度信息,准确的还原温度值并且通过标准 I2C 接口输出。

  • 在20℃在40℃温度范围内可实现±0.09℃的测量精度
  • 输出数据速率为4Hz时功耗6uA,待机模式下功耗0.1uA
  • 支持预警模式,可以灵活设置阈值,实现精确的温度监控
  • 集成完整的数字模块,支持标准I2C通信,8组I2C地址可选
  • 产线完整单体一致性测试,无需标定/校准
  • 采用WLCSP封装,尺寸为1.5×1.0mm

使用STM32获取数据并在oled显示屏上显示

这里使用的开发板是STM32F103RCT6,oled显示屏为4针I2C协议。

STM32F103RCT6PB10连接AS6221的SCL引脚,PB11连接AS6221的SDA引脚,I2C地址使用默认的地址x48。

STM32F103RCT6PB6连接oled显示屏的SCL引脚,PB7连接oled显示屏的SDA引脚

下面是相关代码:

/main.h文件*/
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AS6221.h"
#include "Delay.h"
#include "buzzer.h"
#include "LED.h"

float Temperature;
int main(void)
{
	OLED_Init();
	AS6221_Init();
	Buzzer_Init();
	Buzzer_OFF();
	LED_Init();
  OLED_ShowChinese(3,1,8);	
  OLED_ShowChinese(3,2,9);	
  OLED_ShowChar(3,5,':');
  OLED_ShowChar(3,8,'.');
  OLED_ShowChinese(3,7,30);	
 

while(1)
{
  AS6221_Get(&Temperature);
  OLED_ShowNum(3,6,Temperature,2);
  OLED_ShowNum(3,9,(uint16_t)(Temperature*1000)%1000,3);
	if(Temperature<35.5)
	{
		LED1_ON();
		OLED_ShowChinese(4,3,32);	
		OLED_ShowChinese(4,4,8);	
	}
	else if(Temperature>37.3&&Temperature<=38)
	{
		LED2_ON();
		OLED_ShowChinese(4,3,32);	
		OLED_ShowChinese(4,4,33);	
	}
	else if(Temperature>38&&Temperature<=39)
	{
		LED1_ON();
		LED2_ON();
		OLED_ShowChinese(4,3,34);	
		OLED_ShowChinese(4,4,33);	
	}
	else if(Temperature>39&&Temperature<=41)
	{
		Buzzer_ON1();
		OLED_ShowChinese(4,3,35);	
		OLED_ShowChinese(4,4,33);	
	}
	else if(Temperature>41)
	{
		Buzzer_ON();
		OLED_ShowChinese(4,3,36);	
		OLED_ShowChinese(4,4,35);	
		OLED_ShowChinese(4,5,33);	
	}
	else
	{	
		OLED_ShowChinese(4,3,37);	
		OLED_ShowChinese(4,4,38);	
	}
	Delay_ms(200);
}

}
/*AS6221.h文件*/
#ifndef __AS6221_H
#define __AS6221_H
#include "stm32f10x.h"  

void AS6221_Init(void);
void AS6221_Get(float *Temperature);
	

#endif
/*AS6221.c文件*/
#include "stm32f10x.h"


#define AS6221_Clock RCC_APB2Periph_GPIOB
#define AS6221_Port GPIOB
#define AS6221_SCL_Pin GPIO_Pin_10
#define AS6221_SDA_Pin GPIO_Pin_11
#define AS6221_ADDRESS 0x48

uint8_t Data[2];

void AS6221_Init(void)
{
RCC_APB2PeriphClockCmd(AS6221_Clock,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);

GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_InitStruct.GPIO_Pin=AS6221_SCL_Pin | AS6221_SDA_Pin;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(AS6221_Port,&GPIO_InitStruct);

I2C_InitTypeDef I2C_InitStruct;
I2C_InitStruct.I2C_Mode=I2C_Mode_I2C;
I2C_InitStruct.I2C_ClockSpeed=100000;
I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2;
I2C_InitStruct.I2C_Ack=I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_OwnAddress1=0xFF;
I2C_Init(I2C2,&I2C_InitStruct);

I2C_Cmd(I2C2,ENABLE);
}

void AS6221_Get(float *Temperature)
{
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);

I2C_Send7bitAddress(I2C2,((AS6221_ADDRESS<<1) & 0xFE),I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);

I2C_SendData(I2C2,0x00);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);

I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);

I2C_Send7bitAddress(I2C2,((AS6221_ADDRESS<<1) | 0x01),I2C_Direction_Receiver);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);
Data[0]=I2C_ReceiveData(I2C2);

I2C_AcknowledgeConfig(I2C2,DISABLE);
I2C_GenerateSTOP(I2C2,ENABLE);

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);
Data[1]=I2C_ReceiveData(I2C2);

I2C_AcknowledgeConfig(I2C2,ENABLE);

*Temperature=((Data[0]<<8) | Data[1])*0.0078125;
}
/*LED.c文件*/
#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}

void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void LED1_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}

void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void LED2_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}


全部评论
暂无评论
0/144