艾迈斯欧司朗 AS6221-EK 测评
分享作者:user202505087040
评测品牌:艾迈斯欧司朗
评测型号:AS6221-EK
发布时间:2025-07-04 12:00:51
0 0
前言
开源口碑分享内容
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