基于STM32F1的手势识别和测温报警
器件:我使用的是正点原子的STM32f103MiNi和手势识别模块PJ7602还有红外测温模块MLX90614

温度模块MLX9061

![在这里插入图片描述](https://img-blog.csdnimg.cn/a6b7ea5c7f7e4ef6b6e2edb431c04224.png

  1. MLX90614模块 :MLX90614 出厂校准的温度范围为:环境温度 -40~125 ˚C,物体温度 -70 ~ 382.2 ˚C。
    传感器测量的温度为视场里所有物体温度的平均值。MLX90614 室温下的标准精度为±0.5ºC。医疗应用版本的传感器可在人体温度范围内达到±0.1ºC 的精度。
    作为标准, MLX90614 将物体发射率校准为 1。但用户可在无需黑体的情况下,简易地将发射率在 0.1~1.0之间改变。10-位 PWM 输出模式是连续输出所测物体温度的标准配置,测量物体的温度范围为-20 ~120 ˚C,分辨率为 0.14 ˚C。
    PWM 格式可以通过改变 2 个 EEPROM 单元的内容来简易地定制为客户所需的范围,这对器件的出厂校准并无影响。PWM 引脚也可配置为热动继电器模式, (输入为 To) 进而构造简单且经济的恒温器或是温度(冻结/沸腾)警报装置。温度阈值是用户编程的。在 SMBus 系统中该特性可以作为进程中断以便读取总线上的从动器件 并确定其精确的状态。
    温度计有两个电源电压:5V 或是 3V (电池作为电源) 。5V 电源电压可通过使用少量片外元件调节到更高的电源电压。
    (具体信息在手册里面有)
    我在网上也找了很多的代码,也可能是我笨拙,一直是显示0°或者是显示-273.15°,我也检查了自己的接线以及正负极接错没,之前就因为接错了正负极烫着了。
    下面展示 MLX90614.h文件
// 我选用的是PB8和PB9为SCL和SDA,使用时候接线接这俩就可以了,
VCC,GND正常接就行了。
// An highlighted block
#ifndef __MLX90614_H
#define __MLX90614_H
#include "sys.h"
//#include "stm32f10x.h"#define ACK    0
#define NACK 1  //不应答或否定的应答
#define SA              0x00 //从机地址,单个MLX90614时为0x00,多个时地址默认为0x5a
#define RAM_ACCESS      0x00 //RAM access command
#define EEPROM_ACCESS   0x20 //EEPROM access command
#define RAM_TOBJ1       0x07 //To1 address in the eeprom#define SMBUS_PORT      GPIOB
#define SMBUS_SCK       GPIO_Pin_8
#define SMBUS_SDA       GPIO_Pin_9#define RCC_APB2Periph_SMBUS_PORT     RCC_APB2Periph_GPIOB#define SMBUS_SCK_H()       SMBUS_PORT->BSRR = SMBUS_SCK
#define SMBUS_SCK_L()       SMBUS_PORT->BRR = SMBUS_SCK
#define SMBUS_SDA_H()       SMBUS_PORT->BSRR = SMBUS_SDA
#define SMBUS_SDA_L()       SMBUS_PORT->BRR = SMBUS_SDA#define SMBUS_SDA_PIN()      SMBUS_PORT->IDR & SMBUS_SDA //读取引脚电平void SMBus_StartBit(void);
void SMBus_StopBit(void);
void SMBus_SendBit(u8);
u8 SMBus_SendByte(u8);
u8 SMBus_ReceiveBit(void);
u8 SMBus_ReceiveByte(u8);
void SMBus_Delay(u16);
void SMBus_Init(void);
u16 SMBus_ReadMemory(u8, u8);
u8 PEC_Calculation(u8*);
float SMBus_ReadTemp(void);    //获取温度值
#endif

下面展示 MLX90614.c文件

// A code block
var foo = 'bar';
// An highlighted block
#include "mlx90614.h"
/*******************************************************************************
* 函数名: MLX90614MLX90614 发起始位 SMBus_StartBit
* 功能  : MLX90614 发起始位 产生起始位
* Input          : None
* Output         : None
* Return         : None*******************************************************************************/
//float temp;
void SMBus_StartBit(void)
{SMBUS_SDA_H();     // Set SDA lineSMBus_Delay(5);      // Wait a few microsecondsSMBUS_SCK_H();        // Set SCL lineSMBus_Delay(5);      // Generate bus free time between StopSMBUS_SDA_L();        // Clear SDA lineSMBus_Delay(5);        // Hold time after (Repeated) Start// Condition. After this period, the first clock is generated.//(Thd:sta=4.0us min)在SCK=1时,检测到SDA由1到0表示通信开始(下降沿)SMBUS_SCK_L();        // Clear SCL lineSMBus_Delay(5);        // Wait a few microseconds
}/*******************************************************************************
* 函数名: SMBus_StopBit
* 功能: MLX90614 发停止位 STOP condition on SMBus
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SMBus_StopBit(void)
{SMBUS_SCK_L();     // Clear SCL lineSMBus_Delay(5);        // Wait a few microsecondsSMBUS_SDA_L();        // Clear SDA lineSMBus_Delay(5);        // Wait a few microsecondsSMBUS_SCK_H();        // Set SCL lineSMBus_Delay(5);      // Stop condition setup time(Tsu:sto=4.0us min)SMBUS_SDA_H();      // Set SDA line
}/*******************************************************************************
* 函数名: SMBus_SendByte
* 功能: MLX90614 发送一个字节 Send a byte on SMBus
* Input          : Tx_buffer
* Output         : None
* Return         : None
*******************************************************************************/
uint8_t SMBus_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)//如果最高位为1{bit_out=1;   // 把最高位置1}else  //如果最高位为0{bit_out=0;  // 把最高位置0}SMBus_SendBit(bit_out); // 把最高位发送出去Tx_buffer<<=1;// 左移一位把最高位移出去等待下一个最高位,循环8次,每次都发最高位,就可把一个字节发出去了}Ack_bit=SMBus_ReceiveBit();return Ack_bit;
}/*******************************************************************************
* 函数名: SMBus_SendBit
* 功能: MLX90614 发送一个位 Send a bit on SMBus 82.5kHz
* Input          : bit_out
* Output         : None
* Return         : None
*******************************************************************************/
void SMBus_SendBit(u8 bit_out)
{if(bit_out==0){SMBUS_SDA_L();}else{SMBUS_SDA_H();}SMBus_Delay(2);                    // Tsu:dat = 250ns minimumSMBUS_SCK_H();                   // Set SCL lineSMBus_Delay(6);                  // High Level of Clock PulseSMBUS_SCK_L();                  // Clear SCL lineSMBus_Delay(3);                    // Low Level of Clock Pulse
//  SMBUS_SDA_H();                  // Master release SDA line ,return;
}/*******************************************************************************
* Function Name  : SMBus_ReceiveBit
* Description    : Receive a bit on SMBus
* Input          : None
* Output         : None
* Return         : Ack_bit
*******************************************************************************/
u8 SMBus_ReceiveBit(void)
{u8 Ack_bit;SMBUS_SDA_H();          //引脚靠外部电阻上拉,当作输入SMBus_Delay(2);          // High Level of Clock PulseSMBUS_SCK_H();          // Set SCL lineSMBus_Delay(5);          // High Level of Clock Pulseif (SMBUS_SDA_PIN()){Ack_bit=1;}else{Ack_bit=0;}SMBUS_SCK_L();            // Clear SCL lineSMBus_Delay(3);            // Low Level of Clock Pulsereturn   Ack_bit;
}/*******************************************************************************
* 函数名: SMBus_ReceiveByte
* 功能: Receive a byte on SMBus 从SMBus中接受一个字节的数据
* Input          : ack_nack
* Output         : None
* Return         : RX_buffer
*******************************************************************************/
u8 SMBus_ReceiveByte(u8 ack_nack)
{u8     RX_buffer;u8    Bit_Counter;for(Bit_Counter=8; Bit_Counter; Bit_Counter--){if(SMBus_ReceiveBit())// Get a bit from the SDA line{RX_buffer <<= 1;// If the bit is HIGH save 1  in RX_bufferRX_buffer |=0x01;//如果Ack_bit=1,把收到应答信号1与0000 0001 进行或运算,确保为1}else{RX_buffer <<= 1;// If the bit is LOW save 0 in RX_bufferRX_buffer &=0xfe;//如果Ack_bit=1,把收到应答信号0与1111 1110 进行与运算,确保为0}}SMBus_SendBit(ack_nack);// Sends acknowledgment bit 把应答信号发出去,如果1,就进行下一次通信,如果为0、,就拜拜了return RX_buffer;
}/*******************************************************************************
* 函数名: SMBus_Delay
* 功能: 延时  一次循环约1us
* Input          : time
* Output         : None
* Return         : None
*******************************************************************************/
void SMBus_Delay(u16 time)
{u16 i, j;for (i=0; i<4; i++){for (j=0; j<time; j++);}
}/*******************************************************************************
* 函数名: SMBus_Init
* 功能: SMBus初始化
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SMBus_Init()
{GPIO_InitTypeDef    GPIO_InitStructure;/* Enable SMBUS_PORT clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SMBUS_PORT, ENABLE);/*配置SMBUS_SCK、SMBUS_SDA为集电极开漏输出*/GPIO_InitStructure.GPIO_Pin = SMBUS_SCK | SMBUS_SDA;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(SMBUS_PORT, &GPIO_InitStructure);SMBUS_SCK_H();SMBUS_SDA_H();
}/******************************************************************************** 函数名: SMBus_ReadMemory* 功能: READ DATA FROM RAM/EEPROM  从RAM和EEPROM中读取数据* Input          : slaveAddress, command* Return         : Data* SMBus_ReadMemory(0x00, 0x07) 0x00 表示IIC设备的从地址 从0x07这个寄存器开始读取
*******************************************************************************/
u16 SMBus_ReadMemory(u8 slaveAddress, u8 command)
{u16 data;          // Data storage (DataH:DataL)u8 Pec;                // PEC byte storageu8 DataL=0;         // Low data byte storageu8 DataH=0;            // High data byte storageu8 arr[6];         // Buffer for the sent bytesu8 PecReg;          // Calculated PEC byte storageu8 ErrorCounter;  // Defines the number of the attempts for communication with MLX90614ErrorCounter=0x00;    // Initialising of ErrorCounterslaveAddress <<= 1;   //2-7位表示从机地址 从机地址左移一位,把读写位空出来do{repeat:SMBus_StopBit();             //If slave send NACK stop comunication--ErrorCounter;                   //Pre-decrement ErrorCounterif(!ErrorCounter)               //ErrorCounter=0?{break;                       //Yes,go out from do-while{}}SMBus_StartBit();              //Start conditionif(SMBus_SendByte(slaveAddress))//Send SlaveAddress 最低位Wr=0表示接下来写命令{goto  repeat;             //Repeat comunication again}if(SMBus_SendByte(command))     //Send command{goto repeat;             //Repeat comunication again}SMBus_StartBit();                   //Repeated Start conditionif(SMBus_SendByte(slaveAddress+1))   //Send SlaveAddress 最低位Rd=1表示接下来读数据{goto   repeat;                 //Repeat comunication again}DataL = SMBus_ReceiveByte(ACK);    //Read low data,master must send ACKDataH = SMBus_ReceiveByte(ACK); //Read high data,master must send ACKPec = SMBus_ReceiveByte(NACK);   //Read PEC byte, master must send NACKSMBus_StopBit();              //Stop conditionarr[5] = slaveAddress;     //arr[4] = command;            //arr[3] = slaveAddress+1;    //Load array arrarr[2] = DataL;                //arr[1] = DataH;              //arr[0] = 0;                  //PecReg=PEC_Calculation(arr);//Calculate CRC 数据校验}while(PecReg != Pec);//If received and calculated CRC are equal go out from do-while{}data = (DataH<<8) | DataL;    //data=DataH:DataLreturn data;
}/*******************************************************************************
* 函数名: PEC_calculation
* 功能 : 数据校验
* Input          : pec[]
* Output         : None
* Return         : pec[0]-this byte contains calculated crc value
*******************************************************************************/
u8 PEC_Calculation(u8 pec[])
{u8     crc[6];//存放多项式u8    BitPosition=47;//存放所有数据最高位,6*8=48 最高位就是47位u8   shift;u8    i;u8    j;u8    temp;do{/*Load pattern value 0x00 00 00 00 01 07*/crc[5]=0;crc[4]=0;crc[3]=0;crc[2]=0;crc[1]=0x01;crc[0]=0x07;/*Set maximum bit position at 47 ( six bytes byte5...byte0,MSbit=47)*/BitPosition=47;/*Set shift position at 0*/shift=0;/*Find first "1" in the transmited message beginning from the MSByte byte5*/i=5;j=0;while((pec[i]&(0x80>>j))==0 && i>0){BitPosition--;if(j<7){j++;}else{j=0x00;i--;}}/*End of while *//*Get shift value for pattern value*/shift=BitPosition-8;/*Shift pattern value */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;}/*End of for*/shift--;}/*End of while*//*Exclusive OR between pec and crc*/for(i=0; i<=5; i++){pec[i] ^=crc[i];}/*End of for*/}while(BitPosition>8); /*End of do-while*/return pec[0];
}/*******************************************************************************
* 函数名: SMBus_ReadTemp
* 功能: 计算并返回温度值
* Return         : SMBus_ReadMemory(0x00, 0x07)*0.02-273.15
*******************************************************************************/
float SMBus_ReadTemp(void)
{float temp;temp = SMBus_ReadMemory(SA, RAM_ACCESS|RAM_TOBJ1)*0.02- 273.15;//273.15return temp;
}/*********************************END OF FILE*********************************/

手势模块PJ7602


下面展示 PJ7602手势模块的C代码

//
手势模块最后的函数内我加入了读取温度数值和超过特定数值后蜂鸣器报警
因为我之前在main函数中将温度函数和蜂鸣器函数放在里面发现,只能测温
一次,我就检查代码发现,是在手势函数内有个while(1)循环,导致在
main()函数中的while(1)函数只能停留在手势模块中的,导致温度只能测一
次但是我还以为是其他的问题纠结了好一会,还好最后解决了这个问题。如果
你们有其他啥程序就可以加载手势函数里面去运行。
// An highlighted block
#include "paj7620u2.h"
#include "paj7620u2_cfg.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "elc.h"#include "elc.h"
#include "BUFFER.h"
#include "mlx90614.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK MiniV3 STM32开发板
//PAJ7620U2 驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2017/7/1
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
////选择PAJ7620U2 BANK区域float temperate;
void paj7620u2_selectBank(bank_e bank)
{switch(bank){case BANK0: GS_Write_Byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);break;//BANK0寄存器区域case BANK1: GS_Write_Byte(PAJ_REGITER_BANK_SEL,PAJ_BANK1);break;//BANK1寄存器区域}}//PAJ7620U2唤醒
u8 paj7620u2_wakeup(void)
{ u8 data=0x0a;GS_WakeUp();//唤醒PAJ7620U2delay_ms(5);//唤醒时间>400usGS_WakeUp();//唤醒PAJ7620U2delay_ms(5);//唤醒时间>400uspaj7620u2_selectBank(BANK0);//进入BANK0寄存器区域data = GS_Read_Byte(0x00);//读取状态if(data!=0x20) return 0; //唤醒失败return 1;
}//PAJ7620U2初始化
//返回值:0:失败 1:成功
u8 paj7620u2_init(void)
{u8 i;u8 status;GS_i2c_init();//IIC初始化status = paj7620u2_wakeup();//唤醒PAJ7620U2if(!status) return 0;paj7620u2_selectBank(BANK0);//进入BANK0寄存器区域for(i=0;i<INIT_SIZE;i++){GS_Write_Byte(init_Array[i][0],init_Array[i][1]);//初始化PAJ7620U2}paj7620u2_selectBank(BANK0);//切换回BANK0寄存器区域return 1;
}//主菜单
void paj7620u2_test_ui(void)
{POINT_COLOR=BLUE;//设置字体为蓝色LCD_Fill(30,170,300,300,WHITE);LCD_ShowString(30,170,200,16,16,"KEY1:   Gesture test");//手势识别测试LCD_ShowString(30,190,200,16,16,"KEY0:   Ps test     ");//接近距离测试}//手势识别测试
void Gesture_test(void)
{u8 i;u8 status;u8 key;u8 data[2]={0x00};u16 gesture_data;u8 ledflash=0;paj7620u2_selectBank(BANK0);//进入BANK0寄存器区域for(i=0;i<GESTURE_SIZE;i++){GS_Write_Byte(gesture_arry[i][0],gesture_arry[i][1]);//手势识别模式初始化}paj7620u2_selectBank(BANK0);//切换回BANK0寄存器区域i=0;POINT_COLOR=BLUE;//设置字体为蓝色LCD_Fill(30,170,300,300,WHITE);LCD_ShowString(30,180,200,16,16,"KEY_UP: Exit the test");LCD_ShowString(30,210,200,16,16,"Gesture test");POINT_COLOR=RED;//设置字体为蓝色while(1){key = KEY_Scan(0);if(key==WKUP_PRES){GS_Write_Byte(PAJ_SET_INT_FLAG1,0X00);//关闭手势识别中断输出GS_Write_Byte(PAJ_SET_INT_FLAG2,0X00);break;}        status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//读取手势状态          if(!status){   gesture_data =(u16)data[1]<<8 | data[0];if(gesture_data) {switch(gesture_data){case GES_UP:               LCD_ShowString(110,250,200,16,24,"UP          ");printf("Up\r\n");ELC0=0;//打开继电器开始工作ledflash=1;      break; //向上case GES_DOWM:             LCD_ShowString(100,250,200,16,24,"Dowm        ");                    printf("Dowm\r\n"); ELC0=1;//关闭继电器,停止对货物的喷洒ledflash=1;      break; //向下case GES_LEFT:             LCD_ShowString(100,250,200,16,24,"Left        ");           printf("Left\r\n"); ELC0=0;delay_ms(5000);ELC0=1;//喷洒后延时关闭//打开继电器,对手部进行喷洒,打开后并延时ledflash=1; break; //向左case GES_RIGHT:            LCD_ShowString(100,250,200,16,24,"Right       ");       printf("Right\r\n");         ledflash=1;      break; //向右case GES_FORWARD:          LCD_ShowString(80,250,200,16,24,"Forward     ");        printf("Forward\r\n");       ledflash=1;      break; //向前case GES_BACKWARD:         LCD_ShowString(80,250,200,16,24,"Backward    ");    printf("Backward\r\n");      ledflash=1;      break; //向后case GES_CLOCKWISE:        LCD_ShowString(70,250,200,16,24,"Clockwise   ");     printf("Clockwise\r\n");     ledflash=1;      break; //顺时针case GES_COUNT_CLOCKWISE:  LCD_ShowString(50,250,200,16,24,"AntiClockwise");  printf("AntiClockwise\r\n"); ledflash=1;      break; //逆时针case GES_WAVE:             LCD_ShowString(100,250,200,16,24,"Wave         ");    printf("Wave\r\n");          ledflash=1;      break; //挥动default:  ledflash=0; break;}   if(ledflash)//DS1闪烁{   LED1=0;delay_ms(80);LED1=1;delay_ms(80);LED1=0;delay_ms(80);LED1=1;delay_ms(80);LCD_ShowString(40,250,200,16,24,"                        ");ledflash=0;}                      }}delay_ms(50);i++;if(i==5){LED0=!LED0;//提示系统正在运行  i=0;}         }
}//接近检测测试
void Ps_test(void)
{u8 i;u8 key;u8 data[2]={0x00};u8 obj_brightness=0;u16 obj_size=0;paj7620u2_selectBank(BANK0);//进入BANK0寄存器区域for(i=0;i<PROXIM_SIZE;i++){GS_Write_Byte(proximity_arry[i][0],proximity_arry[i][1]);//接近检测模式初始化}paj7620u2_selectBank(BANK0);//返回BANK0寄存器区域i=0;POINT_COLOR=BLUE;//设置字体为蓝色LCD_Fill(30,170,300,300,WHITE);LCD_ShowString(30,180,200,16,16,"KEY_UP: Exit the test");LCD_ShowString(30,210,200,16,16,"Ps test");LCD_ShowString(30,240,200,16,16,"Brightness");LCD_ShowString(160,240,200,16,16,"Size");POINT_COLOR=RED;//设置字体为蓝色 while(1){   key = KEY_Scan(0);if(key==WKUP_PRES) break;obj_brightness = GS_Read_Byte(PAJ_GET_OBJECT_BRIGHTNESS);//读取物体亮度data[0] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_1);//读取物体大小data[1] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_2);obj_size = ((u16)data[1] & 0x0f)<<8 | data[0];LCD_ShowxNum(50,270,obj_brightness,3,24,0);LCD_ShowxNum(152,270,obj_size,3,24,0);printf("obj_brightness: %d\r\n",obj_brightness);printf("obj_size: %d\r\n",obj_size);delay_ms(100);i++;if(i==5){LED0=!LED0;//提示系统正在运行   i=0;}}}
//PAJ7620U2传感器测试
void paj7620u2_sensor_test(void)
{   u8 i=0;u8 key;paj7620u2_test_ui();//主菜单显示while(1){key = KEY_Scan(0);//按键扫描if(key){switch(key){case KEY1_PRES:  Gesture_test();   break;//手势检测模式case KEY0_PRES:  Ps_test();        break;//接近检测模式  }paj7620u2_test_ui();}delay_ms(50);i++;if(i==5){LED0=!LED0;//提示系统正在运行  i=0;}temperate = SMBus_ReadTemp();LCD_ShowxNum(140,30,(u8)temperate,2,16,0); //显示温度整数部分temperate-=(u8)temperate;LCD_ShowxNum(164,30,temperate*100,2,16,0X80);//显示温度小数部分delay_ms(250);if(SMBus_ReadTemp() >36){delay_ms(2000);BUFFER0=0;//PB2delay_ms(2000);BUFFER0=1;}      }
}

下面展示 main函数

//
main函数
// An highlighted block
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "paj7620u2.h"#include "elc.h"
#include "BUFFER.h"
#include "mlx90614.h"//加的温度模块文件
/************************************************ALIENTEK MiniV3 STM32开发板扩展实验22ATK-PAJ7620U2手势识别模块测试实验 技术支持:www.openedv.com淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。广州市星翼电子科技有限公司  作者:正点原子 @ALIENTEK
************************************************/
// float temperate;int main(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2delay_init();             //延时函数初始化    uart_init(115200);         //串口初始化为115200LED_Init();               //初始化与LED连接的硬件接口LCD_Init();                 //初始化LCD KEY_Init();                //按键初始化ELC_Init();             //初始化与LED连接的硬件接口SMBus_Init();BUFFER_GPIO();usmart_dev.init(72);      //初始化USMART             POINT_COLOR=RED;         //设置字体为红色 LCD_ShowString(60,30,200,16,16,"TEMPERATE:00.00C");LCD_ShowString(30,50,200,16,16,"Mini STM32");   LCD_ShowString(30,70,200,16,16,"Sensor PAJ7620U2 TEST");  LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2022/11/04");     POINT_COLOR=BLUE;//设置字体为蓝色         while(!paj7620u2_init())//PAJ7620U2传感器初始化{printf("PAJ7620U2 Error!!!\r\n");LCD_ShowString(30,140,200,16,16,"PAJ7620U2 Error!!!");delay_ms(500);LCD_ShowString(30,140,200,16,16,"                  ");delay_ms(500);LED0=!LED0;//DS0闪烁}printf("PAJ7620U2 OK\r\n");LCD_ShowString(30,140,200,16,16,"PAJ7620U2 OK");while(1){       paj7620u2_sensor_test();//PAJ7620U2传感器测试}
}

还有其他一些代码就不展示了太多了,但是主要的大概就这些,之前我也在网上找了很多测温模块的代码都一直不好使也不知道为啥,后面也是慢慢的改好了,我的代码具体实现的就是TFTLCD显示温度,按键选择手势模式还有距离模式,这个文件我也是参考的一个博主的具体叫啥不记得了,按下KEY1就可以开始手势模块操作啦,另一个按KEY0就是接近距离测试。然后手势向上打开继电器,向下关闭。单片机串口不能驱动继电器,所以要加一个驱动电路,我是自己去网上找的然后焊的一个,蜂鸣器也是。

我也是随便写着玩,希望能帮助大家!大家一起加油!

基于STM32F1的手势识别PJ7602和测温报警MLX90614相关推荐

  1. 基于stm32人脸识别和红外测温

    目录 一.项目功能 二.原理图 三.实物视频 四.实物图片 五.程序 资料下载地址:基于STM32人脸识别和红外测温 一.项目功能 本系统由stm32f103c8t6单片机最小系统电路+k210人脸识 ...

  2. 基于FPGA的分布式拉曼光纤测温控制系统

    摘要:本文首先对分布式拉曼光纤测温技术的原理进行了简要的介绍,分析了系统的主要结构.在集成的拉曼测温模块的基础上,使用Cyclone IV系列的FPGA作为后端数据采集控制模块的主要控制模块,进行设计 ...

  3. 【单片机毕业设计】【mcuclub-jk-003】基于单片机的非接触红外测温的设计

    最近设计了一个项目基于单片机的非接触红外测温系统,与大家分享一下: 一.基本介绍 项目名:非接触红外测温 项目编号:mcuclub-jk-003 单片机类型:STC89C52.STM32F103C8T ...

  4. 基于MAX6675的k型热电偶测温系统

    基于MAX6675的k型热电偶测温系统 亲测 本人亲测代码有效 测温整数误差控制在0摄氏度 如果所显示和实际误差相差25摄氏度 请在仿真中点击MAX6675属性调节把环境温度改为0 即k型热电偶冷端温 ...

  5. 基于MSP430G2553用Lora进行远程测温

    文章目录 前言 一. MPS430 软件 IAR ccs: ccs一个工程中使用多个c文件 IO口 配置时钟 串口通信 ADC 二.硬件 DS18B20测温温度模块 接线 时序分析 问题 三.Lora ...

  6. 基于51单片机的密码锁多路测温+测距+语音播报

    本项目为单片机课程设计成果,实物制作+proteus仿真,相关资料见结尾. 文章目录 前言 一.系统组成 1.1 WT588D语音模块 1.2 JQ8900-TF语音模块 1.3 HC-SR04-P超 ...

  7. 基于51单片机的多路热电偶测温系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前检测的温度值 2.循环显示多路热电偶检测值 3.当温度超过设定温度值一定范围以后,蜂鸣器报警,同时启动升温或降温装置 ...

  8. 基于51单片机的ADC热敏电阻测温系统proteus仿真

    硬件设计 (末尾附文件) 代码设计 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #d ...

  9. 无线测温装置在变压器中的设计与应用

    安科瑞   汪国琴 一.引言 随着国家电力行业规模的快速发展,用电需求量也在持续上升,电力变压器不断在向大容量.高电压方向发展.变压器作为电力系统中的重要电力设备,运行的安全可靠性将会对电网的供电质量 ...

最新文章

  1. js array 删除指定元素_数组--学习笔记(数据结构数组 /js数组)
  2. 甘利俊一 | 信息几何法:理解深度神经网络学习机制的重要工具
  3. cocos2d-x实例学习之常用类及其概要作用
  4. JavaScript控制台中的颜色
  5. html 商品展示框
  6. 2022版中国液压、气压动力机械及元件制造行业建设现状与投资动向研究报告
  7. 面试官:“同学,你做过真实落地项目吗?”​
  8. Spring Boot-热部署和Debugger使用(三)
  9. php中取整的函数,php中四舍五入取整函数详细介绍
  10. 一个简单的python登录验证系统
  11. 信息论与编码基础概念
  12. 怎样关闭计算机445端口,445端口怎么关闭 445端口关闭方法介绍
  13. python网络爬虫的流程图_Python 网络爬虫程序架构及运行流程
  14. 当不知轴承型号时如何寻找轴承故障频率_专家总结的齿轮箱滚动轴承故障诊断方法,值得收藏!...
  15. Python模块和包的导入
  16. adb双击POWER键指令
  17. 01 JavaScript的前世今生
  18. PDF文件加密解密-文件设置密码
  19. python 捕捉和模拟鼠标键盘操作
  20. linux 中的rime 输入法 自定义 新世纪五笔输入法

热门文章

  1. 保存网页为图片!GreenBrowser新功能(提供下载)
  2. 跨平台应用开发进阶(三十):uni-app 实现集成火山视频直播服务
  3. 百世快递快速的查询并导出csv表格?
  4. k8s qos实现分析
  5. 360 os android m,搞机者福音?360 OS让手机能玩三个系统
  6. 舔狗日记生成器附iapp源码
  7. App Store生存:iOS开发者经验分享
  8. chrome浏览器实现进入网页自动全屏模式
  9. VVF格式监控录像数据恢复软件 V1.0
  10. RAC/RAC One Node创建dataguard