一种基于红外检测的语音体温计的设计

著录项
  • CN201711143908.8
  • 20171117
  • CN109798986A
  • 20190524
  • 长沙乐昌林电子科技有限公司
  • G01J5/02
  • G01J5/02

  • 湖南省长沙市天心区芙蓉南路一段758号和庄公寓A区1号栋2502房
  • 湖南(43)
摘要
本发明涉及一种基于红外检测的语音体温计的设计,本发明利用红外测温传感器MLX90614进行温度测量用液晶1602进行显示用喇叭进行语音播报的红外测温语音播报系统。本发明主要功能是按下测温按键时液晶会实时显示红外测温传感器所检测到的温度,温度稳定后松开测温按键液晶上面显示稳定后温度并且喇叭会把这个温度播报一边。
权利要求

1.本发明专利涉及一种基于红外检测的语音体温计的设计,本发明利用红外测温传感器MLX90614进行温度测量用液晶1602进行显示用喇叭进行语音播报的红外测温语音播报系统。

2.根据权利要求1所述的一种基于红外检测的语音体温计的设计,其特征在于,本发明主要功能是按下测温按键时液晶会实时显示红外测温传感器所检测到的温度,温度稳定后松开测温按键液晶上面显示稳定后温度并且喇叭会把这个温度播报一边。

3.根据权利要求1所述的一种基于红外检测的语音体温计的设计,其特征在于,本发明由SMBus通信的红外测温传感器MLX90614检测温度、独立按键、触摸按键、NY3P03语音芯片、1602液晶显示等子模块组成。

4.根据权利要求1所述的一种基于红外检测的语音体温计的设计,其特征在于,本发明利用STC15W4K32S4单片机作为系统控制核心,负责控制检测输入/输出,驱动液晶1602显示,读取温度传感器检测的数值,驱动语音芯片播报等一些列的程序动作。

说明书

一种基于红外检测的语音体温计的设计

技术领域

本发明专利涉及电子设计技术领域,尤其涉及一种基于红外检测的语音体温计的设计。

背景技术

当前防治密集人中的疾病工作是难度较大的,尤其是在火车站,飞机场,地铁等人口密度大而且人口流动性较大的场所,实施这项工作就变得更加困难。之前遭遇的“SARS”,“H1N1”因为其发病前期很难被发现(除体温偏高),且具有较高的传染性。使得这类疾病的防治工作变得非常困难。是由于这一类的疾病主要也是非常明显的发病现象就是体温上升,比正常情况下的要高,那么预防这种疾病的很重要方法之一就是快速而且准确无误的把体温偏高人员和体温正常的人员在人中区分出来。当前,人们普遍使用的传统的水银体温或热敏器件测量,然而这些都不能快速、准确无误的在人中发现体温偏高者,并且还因为这类疾病传染性较高,致使传统的体温测量仪需要测量者和被测量者相接触,这样就使得疾病的相互传染可能性增加。

在温度测量方面,作为一种非接触式的温度测量技术的红外测温技术多年前就开始发展,它和传统温度测量技术相比较具有以下几种优点:

(1)由于它的测量不会对测温场产生干扰,所以不会影响测温场原有的分布,因为相比传统测温方式它具在测量精度上更具优势,在理论上,分辨率可达到0.01℃;

(2)与普通接触式测温相比较红外测温技术另外的不同之处在于它不需要与测温目标达到热的平衡就可以测出目标当前的温度,红外测温技术可以实现实时测量,迅速的测量甚至可以进行动态测量,对于在不方便人们靠近的设施或者一些传播较容易的疾病(SARS,H1N1)的温度测量上,红外测温技术就体现出了明显的优势;

(3)可以测量微小目标的温度;

(4)红外测温可以实现对于实时的观测和自动控制,测量距离远近皆可,时间上也不受限制,适应性相对较强;

(5)测量温度范围宽,红外测温的方法在理论上无测量上限。正是由于存在上述各种优点,目前红外测温技术已广泛应用在工业生产,航空航天,质量检测,冶金及医学等领域。

发明专利内容

本发明专利涉及一种基于红外检测的语音体温计的设计,本发明利用红外测温传感器MLX90614进行温度测量用液晶1602进行显示用喇叭进行语音播报的红外测温语音播报系统。本发明主要功能是按下测温按键时液晶会实时显示红外测温传感器所检测到的温度,温度稳定后松开测温按键液晶上面显示稳定后温度并且喇叭会把这个温度播报一边。

本发明由SMBus通信的红外测温传感器MLX90614检测温度、独立按键、触摸按键、NY3P03语音芯片、1602液晶显示等子模块,利用STC15W4K32S4单片机作为系统控制核心,负责控制检测输入/输出,驱动液晶1602显示,读取温度传感器检测的数值,驱动语音芯片播报等一些列的程序动作,使得整个系统操作简单并且充满人性化。

附图说明

图1:液晶1602电路连接图。

图2:NY3P03语音芯片电路连接图。

图3:物理按键电路及按键功能图。

图4:触摸按键电路图。

图5:触摸电路说明图。

图6:按键选择图。

具体实施方式

为了使本发明专利的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明专利进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明专利,并不用于限定本发明专利。

本发明专利涉及一种基于红外检测的语音体温计的设计,本发明利用红外测温传感器MLX90614进行温度测量用液晶1602进行显示用喇叭进行语音播报的红外测温语音播报系统。本发明主要功能是按下测温按键时液晶会实时显示红外测温传感器所检测到的温度,温度稳定后松开测温按键液晶上面显示稳定后温度并且喇叭会把这个温度播报一边。

进一步的,本发明由SMBus通信的红外测温传感器MLX90614检测温度、独立按键、触摸按键、NY3P03语音芯片、1602液晶显示等子模块,利用STC15W4K32S4单片机作为系统控制核心,负责控制检测输入/输出,驱动液晶1602显示,读取温度传感器检测的数值,驱动语音芯片播报等一些列的程序动作,使得整个系统操作简单并且充满人性化。

进一步的,本发明采用的是一个单红外测温传感器来采集所测量物体的温度信息,同时把所检测的数据传到控制中心—单片机进行数据处理,单片机处理完数据(将所收到的数据转化成相应的温度值)之后再控制液晶显示模块显示当前所检测到的温度数值,然后再控制语音芯片“报出”液晶显示模块上面显示的温度数值。

进一步的,本发明选用LDO作为3.3V稳压电源。为使电压输出更精确,波动更小,故在芯片的输入输出端各加一个10uF滤波电容。为了使该设计能单独使用,所以加了一个锂电池,接口选用现在流行的安卓手机接口Micro USB使得充电方便。锂电池选用内置过充过流保护的3.7V锂电池。

进一步的,本发明的传感器选用MLX90614ESF-BAA。红外测温传感MLX90614ESF-BAA的测温范围为-40℃~85℃。该温度范围对于体温的测量完全够用,测量精度可达到0.02℃,此版本传感器为单测温传感器。

进一步的,本发明的温度显示选用LCD1602。LCD16202模块内部的字符发生存储器(CGROM)已经存储了阿拉伯数字、英文字母大小写、常见的符号、和日文假名等160个不同的点阵字符图形。每个字符都会对应一个固定的代码,像大写的英文字母:“A”在存储器中的代码是0100 0001B(41H),当模块把地址41H里面的点阵字符图形显示时,我们就能看到字母“A”。由于各个电路的电压都是3.3V,因此选用的液晶也是在3.3V下工作的。液晶1602电路连接图如图1所示。图1中Q1 PNP三极管是驱动液晶点亮背光,因单片机I/O口输出电流不足以点亮液晶1602的背光,倘若直接与3.3V电源相接又不能控制液晶1602的背光开关,所以不直接接在单片机上。VL是液晶对比度引脚,通过改变电阻R6的阻值改变对比度,由于电位器体积太大而且价格较高,故设计一个电阻,这个电阻的阻值可以在实际测试中选择(测试选择为4.7K)。

进一步的,本发明的语音芯片选择的NY3P03,是一款具有PWM输出的OTP语音标准芯片。共有3个控制口,工作电压2.2V~5.5V,喇叭是8Ω~16Ω范围内的任何喇叭(0.25W~1W内)。这款语音芯片是已经固定其标准的语音模块,可以由单片机来控制其2个输入端口进而控制32段不同声音任意调用和组合的语音标准芯片。图2为NY3P03语音芯片电路连接图。

进一步的,按键基本是所有电路最常见的一个部分,它是人机交互时一种重要的输入方式,然而常见的机械类型的按键却有着一个重要的缺点,其接触点的使用寿命非常有限,很容易发生按键触电接触不良从而导致失效。相反,非接触的按键由于没有机械触点,使用寿命长,方便。设计3个物理按键来控制一些特定的功能。关机时按下S3就会开机并且测温,开机时按下S3就直接测温,液晶会实时显示所测的温度,之后断开S3测温停止,液晶显示S3断开前的测试温度;S1和S2仅在开机时按下才有效,开机时按下S1,之前关闭的液晶背光会打开,打开的则会关闭;在开机并且语音没有播放时按下S2,语音会重复一遍之前播报的温度。物理按键电路及按键功能如图3所示。物理按键抗干扰能力强并且功耗低,但是物理按键寿命相对短并且触感差。STC15W4K32S4单片机可以使用ADC做触摸按键,为此设计两个触摸按键代替物理按键。图4为触摸按键电路图。感应弹簧能够等效成一块对地的金属板,它对于对地面有一个电容CP,当手指按下之后,则对地面会再并联一个的电容CF。触摸电路的说明如图5所示,金属板和分布电容CP和手指电容CF,并联之后与同C1一起对输入的300KHz方波进行分压的工作,再经过D1整流,R2、C2滤波之后送到ADC中。送去ADC的电压会在手指压上去后降低,这样程序就可以检测出按键动作了。之所始设计2个触摸按键代替物理按键而不是把3个物理按键全部提全掉,是因为开机的按键在程序中设计的时一个带唤醒功能的按键,就是在长时间不用此体温计时,单片机会自动进去睡眠状态,这样各个模块都不工作从而降低功耗。而触摸按键工作需要单片机给一个300KHz的方波信号,所以这个唤醒功能的按键在单片机睡眠状态下如果可用的话,就一定要选用物理按键。图6为按键的选择,通过0Ω电阻来切换物理按键和触摸按键。

进一步的,红外测温语音播报体温计软件结构包含硬件电路休眠和唤醒、红外测温传感器数值读取、温度计算、LCD1602显示、语音播报、按键检测等几个部分。休眠和唤醒部分主要是实现在一段时间后没有检测到按键按下(即无人使用)时会自动进入休眠状态,单片机停止工作,红外测温传感器停止测温以及与单片机的通信,语音芯片停止工作等,就是整个电路全部停止工作,直到开机按键按下后整个电路会被唤醒正常运行;红外测温传感器数值读取部分主要实现单片机与红外测温传感器之间的通信,让单片机读取传感器所测的环境温度以及目标温度;数值转换部分主要是单片机把读取的16进制红外测温传感器的温度值转换成10进制;LCD1602显示部分主要是把所测的温度值实时显示在LCD1602上;语音播报部分主要是把最终所测得温度值播报出来等。系统总程序代码如下:

#include <STC15.H>

#include "intrins.h"

#include <stdio.h>

#define Nack_number 10

#define uchar unsigned char//宏定义

#define uint unsigned int

uchar code table[]="0123456789ABCDEF"; //定义一个数组使后面的数据输入变得简单

sbit lcdrs = P4^1; //定义端口

sbit lcdrw = P4^2;

sbit lcden = P3^5;

sbit lcdbl = P4^3;

sbit SCL = P1^0;

sbit SDA = P1^1;

sbit led1= P1^6;

sbit led2= P1^7;

sbit key = P3^2;

sbit repeat = P1^4;

sbit bl = P1^3;

sbit yy_data = P2^1;

sbit yy_busy = P2^0;

sbit yy_rest = P2^2;

void star(); //MLX90614发起始位

void stop(); //MLX90614发结束位

uchar ReadByte(void); //MLX90614接收字节

void send_bit(void); //MLX90614发送位

void SendByte(uchar number); //MLX90614发送字节

void read_bit(void); //MLX90614接收位

uint readtemp(void); //读温度数据

uint wreadtemp(void); //读温度数据

void display(uint Tem); //显示目标温度

void yy_bobao(uint z); //播报单节内容

void baowen(); //温度播报

void write_shuju();//LCD1602显示

void delay(uint z); //延时函数

void write_com(uchar com); //写命指令

void write_data(uchar date); //写数据

void init(); //1602液晶初始化

uint x=251; //定义变量

int bit_out=0;

int bit_in=0;

uchar tempH,tempL,err;

uint Tem1;

uint Temh1;

uint Tem0;

uint Temp0;

uint shi;

uint ge;

uint shu1;

uint shu2;

uint num;

uint flag;

void main( ) //主函数

{

P0M0=0x00;

P0M1=0x00;

P1M0=0x00;

P1M1=0x00;

P2M0=0x00;

P2M1=0x00;

P3M0=0x00;

P3M1=0x00;

P4M0=0x00;

P4M1=0x00; //配置IO口

SCL=1;

SDA=1;

delay(4);

SCL=0;

delay(1000);

SCL=1;

init();//液晶初始化

write_com(0x80);//为显示出数据所附加的程序 定义液晶起始位

led1=0;

led2=0;

num=0;

flag=0;

yy_rest=0;

yy_data=0;

while(1)

{

if(key==0)

{

TR1 = 0;//定时器1开始计时off

ET1 = 0;//使能定时器0中断 off

EA = 0;

lcdbl=0;

flag=0;

while(!key)

{

led1=1;led2=0;

write_com(0xC4);//为显示出数据所附加的程序 定义液晶起始位

Tem1=readtemp();

led1=0;led2=1;

display(Tem1);

write_data(0xdf);

write_data('C');

write_com(0x82);//为显示出数据所附加的程序 定义液晶起始位

write_shuju();

if(bl==0&&flag==0)

{

lcdbl=~lcdbl;

led1=1;led2=0;

delay(65000);

delay(65000);

delay(65000);

delay(65000);

delay(65000);//延时消抖

}

delay(10000);

delay(10000);

delay(10000);

delay(10000);

Tem0=Tem1*2;

}

baowen();

}

while(key)

{

if(repeat==0&&flag==0)

{

TR1 = 0;//定时器1开始计时 off

ET1 = 0;//使能定时器0中断off

EA = 0;

baowen();

led1=1;led2=1;

}

while((key&repeat)&yy_busy)

{

if(bl==0&&flag==0)

{

lcdbl=~lcdbl;

led1=1;led2=0;

delay(65000);

TR1 = 0;//定时器1开始计时 off

ET1 = 0;//使能定时器0中断 off

EA = 0;

delay(65000);

TR1 = 0;//定时器1开始计时 off

ET1 = 0;//使能定时器0中断 off

EA = 0;

delay(65000);

TR1 = 0;//定时器1开始计时 off

ET1 = 0;//使能定时器0中断 off

EA = 0;

delay(65000);

TR1 = 0;//定时器1开始计时 off

ET1 = 0;//使能定时器0中断 off

EA = 0;

delay(65000);

TR1 = 0;//定时器1开始计时 off

ET1 = 0;//使能定时器0中断 off

EA = 0;

}

_nop_();

TMOD = 0x00; //设置定时器为模式0(16位自动重装载)

TL1 = (65536-50000)/256; //初始化计时值

TH1 = (65536-50000)%256;

TR1 = 1;//定时器1开始计时 on

ET1 = 1;//使能定时器0中断 on

EA = 1;

}

}

}

}

void write_shuju()//处理数据及写入数据

{

write_data('W');

write_data('I');

write_data('T');

write_data(' ');

write_data('W');

write_data('a');

write_data('n');

write_data(' ');

write_data('C');

write_data('o');

write_data('n');

write_data('g');

}

void delay(uint z)//延时函数

{

for(;z>0;z--)

_nop_();

}

void write_com(uchar com)

{

lcdrw=0;//lcdrw只有在液晶读状态或读数据时才为高

//而这次不用到读,所以lcdrw始终为底 (后同)

lcdrs=0;//选择写命令模式

P0=com;//将要写的命令字送到数据总线上

delay(x);//稍作延时以待数据稳定

lcden=1;//使能端给一高脉冲,因为初始化函数中已经将lcden置0

delay(x);//稍做延时

lcden=0;//将使能端置0以完成高脉冲

}

void write_data(uchar date)

{

lcdrw=0;

lcdrs=1;//选择写数据模式

P0=date;//将要写的数据字送到数据总线上

delay(x);

lcden=1;

delay(x);

lcden=0;

}

void init()//1602液晶初始化

{

lcden=0;

write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口

write_com(0x0c);//设置开显示,不显示光标

write_com(0x06);//写一个字符后地址指针加1

write_com(0x01);//显示清0,数据指针清0

}

void star()//MLX90614发起始位

{

SDA = 1;

delay(4);

SCL = 1;

delay(4);

SDA = 0;

delay(4);

SCL = 0;

delay(4);

}

void stop()//MLX90614发结束位

{

SCL = 0;

delay(4);

SDA = 0;

delay(4);

SCL = 1;

delay(4);

SDA = 1;

delay(4);

}

uchar ReadByte(void)//MLX90614接收字节

{

uchar i,dat;

dat=0;

for(i=0;i<8;i++)

{

dat=dat<<1;

read_bit();

if(bit_in==1)

{

dat=dat+1;

}

}

SDA=0;

send_bit();

return dat;

}

void send_bit(void)//MLX90614发送位

{

if(bit_out==1)

{

SDA=1;

}

else

{

SDA=0;

}

_nop_();

SCL=1;

delay(4);

delay(4);

SCL=0;

delay(4);

delay(4);

}

void SendByte(uchar number)//MLX90614发送字节

{

uchar i,n,dat;

n=Nack_number;

dat=number;

for(i=0;i<8;i++)

{

if(dat&0x80)

{

bit_out=1;

}

else

{

bit_out=0;

}

send_bit();

dat=dat<<1;

}

read_bit();

}

void read_bit(void)//MLX90614接收位

{

SDA=1;

bit_in=1;

SCL=1;

delay(4);

delay(4);

bit_in=SDA;

_nop_();

SCL=0;

delay(4);

delay(4);

}

uint readtemp(void)//读温度数据

{

SCL=0;

star();

SendByte(0x00);

SendByte(0x07);

star();

SendByte(0x01);

bit_out=0;

tempL=ReadByte();

bit_out=0;

tempH=ReadByte();

bit_out=1;

err=ReadByte();

stop();

return(tempH*256+tempL);

}

uint wreadtemp(void)//读温度数据

{

SCL=0;

star();

SendByte(0x00);

SendByte(0x06);

star();

SendByte(0x01);

bit_out=0;

tempL=ReadByte();

bit_out=0;

tempH=ReadByte();

bit_out=1;

err=ReadByte();

stop();

return(tempH*256+tempL);

}

void display(uint Tem)//温度=DATA*0.02-273.15

{

uint T,a,b;

T=Tem*2;

if(T>=27315)

{

T=T-27315;

a=T/100;

b=T-a*100;

write_data(table[(a/100)]);

write_data(table[((a%100)/10)]);

write_data(table[(a%10)]);

write_data('.');

write_data(table[(b/10)]);

write_data(table[(b%10)]);

}

else

{

T=27315-T;

a=T/100;

b=T-a*100;

write_data('-');

write_data(table[(a/10)]);

write_data(table[(a%10)]);

write_data('.');

write_data(table[(b/10)]);

write_data(table[(b%10)]);

}

}

void yy_bobao(uint z)//语音播报函数

{

while(!yy_busy)

{

_nop_();

}

yy_rest=1;

delay(200);

yy_rest=0;

delay(200);

for(;z>0;z--)

{

yy_data=1;

delay(100);

yy_data=0;

delay(100);

}

}

void baowen()

{

if(Tem0>=37315|Tem0<=28315)

{

yy_bobao(25);

while(!yy_busy)

{

_nop_();

}

}

else

{

Temp0=Tem0-27315;

shi=Temp0/1000;

ge=(Temp0-shi*1000)/100;

shu1=(Temp0-shi*1000-ge*100)/10;

shu2=Temp0%10;

yy_bobao(shi+1);

while(!yy_busy)

{

_nop_();

}

yy_bobao(11);

while(!yy_busy)

{

_nop_();

}

if(ge>0)

{

yy_bobao(ge+1);

}

while(!yy_busy)

{

_nop_();

}

yy_bobao(13);

while(!yy_busy)

{

_nop_();

}

yy_bobao(shu1+1);

while(!yy_busy)

{

_nop_();

}

yy_bobao(shu2+1);

while(!yy_busy)

{

_nop_();

}

yy_bobao(20);

while(!yy_busy)

{

_nop_();

}

}

}

void tm1_isr() interrupt 3 using 1

{

num++;

if(num==750)

{

num=0;

init();//关闭液晶显示

led1=0;

led2=0;

lcdbl=1;

Tem0=0;

flag=1;

TR1 = 0;//定时器1开始计时

ET1 = 0;//使能定时器0中断

EA = 0;

}

}

以上所述仅为本发明专利的较佳实施例而已,并不用以限制本发明专利,凡在本发明专利的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明专利的保护范围之内。

本文发布于:2024-09-23 19:14:03,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/84646.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议