STM32单片机+GY906红外测温传感器+OLED屏幕+蜂鸣器报警+温度数据发送到串口调试助手+源代码

一、GY906红外测温传感器介绍

        GY906红外测温传感器是一种基于红外辐射原理的非接触式温度测量设备,常用于测量物体表面温度。以下是其主要特点和应用:

主要特点

  1. 非接触测温:无需直接接触物体,避免污染或损坏。

  2. 宽测温范围:通常为-70°C至+380°C,具体型号可能有所不同。

  3. 高精度:精度可达±0.5°C,适合高精度需求。

  4. 快速响应:响应时间短,适合动态温度监测。

  5. 数字输出:通过I2C接口输出数字信号,便于与微控制器连接。

  6. 低功耗:适合电池供电设备。

  7. 小体积:便于集成到各种设备中。

        GY906红外测温传感器以其非接触、高精度和快速响应的特点,广泛应用于多个领域,使用时需注意环境因素和校准。

二、GY906红外测温传感器接线说明

        GY906红外测温传感器是基于MLX90614温度传感器的模块,通常用于测量物体表面的温度。接线时,一般需要连接到微控制器(如Arduino)或其他设备来读取温度数据。

GY906接线说明:

引脚名称说明连接设备
1VCC电源输入引脚,通常接5V电源。接5V
2GND地引脚,接地。接地
3SDA数据线(I2C接口)。用于传输数据,连接到单片机的SDA引脚。接单片机的SDA引脚
4SCL时钟线(I2C接口)。用于同步数据传输,连接到单片机的SCL引脚。接单片机的SCL引脚

三、测试说明、GY906红外测温传感器驱动代码

编译环境:keil5

测试单片机: STM32F103C8T6

功能:功能1:采集温度数据在OLED屏幕上显示出来,超过温度阈值触发蜂鸣器报警

           功能2:把采集温度数据发送到串口调试助手上

GY906.c文件编写GY906红外测温驱动代码如下:

void GY906_Init()
{
    GPIO_InitTypeDef    GPIO_InitStructure;
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GY906_SCL | GY906_SDA;//开漏输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GY906_PORT, &GPIO_InitStructure);

    GY906_SCL_H();
    GY906_SDA_H();
}

void GY906_Start(void)
{
    GY906_SDA_H();		
    GY906_Delay(5);	    
    GY906_SCL_H();	
    GY906_Delay(5);	   
    GY906_SDA_L();		
    GY906_Delay(5);	    
    GY906_SCL_L();	    
    GY906_Delay(5);	    
}

void GY906_Stop(void)
{
    GY906_SCL_L();		
    GY906_Delay(5);	   
    GY906_SDA_L();		
    GY906_Delay(5);	    
    GY906_SCL_H();		
    GY906_Delay(5);	    
    GY906_SDA_H();		
}

u8 GY906_SendByte(u8 Tx_buffer)
{
    u8	Bit_counter;
    u8	Ack_bit;
    u8	bit_out;

    for(Bit_counter=8; Bit_counter; Bit_counter--)
    {
        if (Tx_buffer&0x80)
        {
            bit_out=1;   
        }
        else  
        {
            bit_out=0;  					
        }
        GY906_SendBit(bit_out);	  
        Tx_buffer<<=1;						
    }
     Ack_bit=GY906_ReceiveBit();    
    return	Ack_bit;
}

void GY906_SendBit(u8 bit_out)
{
    if(bit_out==0)
    {
        GY906_SDA_L();
    }
    else
    {
        GY906_SDA_H();
    }
    GY906_Delay(2);					
    GY906_SCL_H();					
    GY906_Delay(6);					
    GY906_SCL_L();					
    GY906_Delay(3);					
    return;
}

u8 GY906_ReceiveBit(void)
{
    u8 Ack_bit;

    GY906_SDA_H();          
		GY906_Delay(2);			
    GY906_SCL_H();			
    GY906_Delay(5);			
    if (GY906_SDA_PIN())
    {
        Ack_bit=1;
    }
    else
    {
        Ack_bit=0;
    }
    GY906_SCL_L();			
    GY906_Delay(3);			

    return	Ack_bit;
}

u8 GY906_ReceiveByte(u8 ack_nack)
{
    u8 	RX_buffer;
    u8	Bit_Counter;

    for(Bit_Counter=8; Bit_Counter; Bit_Counter--)
    {
        if(GY906_ReceiveBit())
        {
            RX_buffer <<= 1;
            RX_buffer |=0x01;
        }
        else
        {
            RX_buffer <<= 1;
            RX_buffer &=0xfe;
        }
    }
    GY906_SendBit(ack_nack);
    return RX_buffer;
}

void GY906_Delay(u16 time)
{
    u16 i, j;
    for (i=0; i<4; i++)
    {
        for (j=0; j<time; j++);
    }
}

u16 GY906_ReadMemory(u8 slaveAddress, u8 command)
{
    u16 data;			
    u8 Pec;				
    u8 DataL=0;			
    u8 DataH=0;			
    u8 arr[6];															// 存储用于计算PEC的数组
    u8 PecReg;															// 存储计算得到的PEC寄存器值
    u8 ErrorCounter;	

    ErrorCounter=0x00;											// 初始化错误计数器为0
	  slaveAddress <<= 1;	 										// 将从机地址左移一位,以符合I2C协议
	
    do
    {
repeat:
        GY906_Stop();			    
        --ErrorCounter;				    
        if(!ErrorCounter) 			    				// 如果错误计数器为0
        {
            break;					    
        }

        GY906_Start();				
        if(GY906_SendByte(slaveAddress))		// 发送从机地址
        {
            goto	repeat;			    
        }
        if(GY906_SendByte(command))	    		// 发送命令
        {
            goto	repeat;		    	
        }

        GY906_Start();					
        if(GY906_SendByte(slaveAddress+1))	// 发送从机地址(读模式)
        {
            goto	repeat;             	
        }

        DataL = GY906_ReceiveByte(ACK);	 		// 接收低字节数据并发送ACK
        DataH = GY906_ReceiveByte(ACK);  		// 接收高字节数据并发送ACK
        Pec = GY906_ReceiveByte(NACK);			// 接收PEC并发送NACK
        GY906_Stop();				

        arr[5] = slaveAddress;		 					// 存储从机地址
        arr[4] = command;										// 存储命令
        arr[3] = slaveAddress+1;						// 存储从机地址(读模式)
        arr[2] = DataL;											// 存储低字节数据
        arr[1] = DataH;											// 存储高字节数据
        arr[0] = 0;													// 存储0
        PecReg=PEC_Calculation(arr);				// 计算PEC寄存器值
    }
    while(PecReg != Pec);										// 如果计算得到的PEC值与接收到的PEC值不相等,重新读取

	  data = (DataH<<8) | DataL;	 						// 将高字节和低字节数据组合成16位数据
    return data;
}

u8 PEC_Calculation(u8 pec[])
{
    u8 	crc[6];
    u8	BitPosition=47;
    u8	shift;
    u8	i;
    u8	j;
    u8	temp;

    do
    {
        crc[5]=0;
        crc[4]=0;
        crc[3]=0;
        crc[2]=0;
        crc[1]=0x01;
        crc[0]=0x07;

        BitPosition=47;
        shift=0;

        i=5;
        j=0;
        while((pec[i]&(0x80>>j))==0 && i>0)
        {
            BitPosition--;
            if(j<7)
            {
                j++;
            }
            else
            {
                j=0x00;
                i--;
            }
        }

        shift=BitPosition-8;

        while(shift)
        {
            for(i=5; i<0xFF; i--)
            {
                if((crc[i-1]&0x80) && (i>0))
                {
                    temp=1;
                }
                else
                {
                    temp=0;
                }
                crc[i]<<=1;
                crc[i]+=temp;
            }
            shift--;
        }

        for(i=0; i<=5; i++)
        {
            pec[i] ^=crc[i];
        }
    }
    while(BitPosition>8); 
    return pec[0];
}

float GY906_GetTemp(void)
{   
	float temp;
	temp = GY906_ReadMemory(SA, RAM_ACCESS|RAM_TOBJ1)*0.02-273.15;// T_{Celsius} = T_{Kelvin} - 273.15 摄氏度
	return temp;
}


四、串口调试助手把采集的温度数据发送出来

五、串口调试助手软件下载

串口调试助手-keil5调试工具_dht11温度传感器串口资源-CSDN文库

六、源代码

STM32单片机+GY906红外测温传感器+OLED屏幕+蜂鸣器报警+温度数据发送到串口调试助手+源代码资源-CSDN文库

七、GY906红外测温传感器资料文档

GY906红外测温传感器文档资料资源-CSDN文库

八、硬件实物接线图

GY906接线图资源-CSDN文库

九、原理图

GY906红外测温传感器原理图.pdf资源-CSDN文库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Dora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值