6.空气质量检测和语音播报

发布于:2025-05-12 ⋅ 阅读:(14) ⋅ 点赞:(0)

目录

 传感器

传感器分类

数字量传感器

模拟量传感器

电压型模拟量传感器

电流型模拟量传感器

接收不同数字电平信号

KQM6600 简介

获取数据手册

关注手册的内容

KQM660硬件层

​编辑 KQM协议层

语音识别和语音播报模块

SU03T作用

SU03T简介​编辑

SU03T硬件层

SU03T固件制作

​编辑SU03T协议层

代码

KQM

SU03T


传感器 

传感器分类

        数字量传感器和模拟量传感器 

数字量传感器

        数字信号:只有 0 和 1 

        关注:接口(UART,单总线,IIC,SPI...) 

模拟量传感器

        模拟型传感器:模拟信号(电压,电流) 

电压型模拟量传感器

        如果电压太大,就需要硬件电路缩小 

        如果电压太小,就需要硬件电路放大 

电流型模拟量传感器

        电流:(4--10mA)串联高精度的采样电阻,把电流转化成电压,然后再通过 ADC 采集 

接收不同数字电平信号

        各种电平: 

        TTL 232 485 USB 

        TTL 232 485 本质上都是串口电平,但是电平规范不一样 

        TTL:单片机的串口,ESP8266,KQM6600 这些串口接口一般都是 TTL 电平 

        电脑接 TTL 电平的数据

232:232 芯片,将 TTL 电平转化为 232 电平

485 电平:TTL 通过 485 芯片,转换成 485 电平

 USB 电平:TTL 通过 CH340 将 TTL 电平转换成 USB 电平

 

KQM6600 简介

获取数据手册

        官网  立创商城   供应商要   百度

关注手册的内容

 (1)供电电压

(2)确定接口

        ① 数字接口 

                IIC SPI UART 单总线 

        ② 模拟接口 

                电压型 电流型 

KQM660硬件层

 KQM协议层

        校验和:保证双方数据数据传输的准确: 

        自己计算的校验和要和对方传递的校验和一致,表示数据没有问题

语音识别和语音播报模块

SU03T作用

        实现语音播报

SU03T简介

SU03T硬件层

        SU03T 的串口烧录:SU03T 的 B6 B7 两个引脚串口烧录 

        SU03T 的通信引脚:SU03T 的 B2 B3

SU03T固件制作

SU03T协议层

9600 8 N 1
开机播报
 小智我来了
退出
 有需要再叫我 
SU03T --> 单片机
开灯 AA 55 00 01 55 AA
关灯 AA 55 00 02 55 AA
室内温度 AA 55 00 03 55 AA
单片机 --> SU03T
播报室内温度 AA 55 01 9A 99 99 99 99 19 37 40 55 AA 
AA 55 固定头
01 消息号
9A 99 99 99 99 19 37 40 消息内容
55 AA 固定尾
通信 TX B2 RX B3
下载 TX B7 RX B6

代码

KQM

void KQM_R_Buff_Clear(void)
{
	memset(Kqm.R_Buff, 0, sizeof(KQM_R_Buff_Length));
	Kqm.R_Length = 0;
}


//处理函数
void KQM_Handle(void)
{
	uint8_t Data_CS = 0;
	if(Kqm.R_Idle == 1)
	{//1数据接收完成
		Kqm.R_Idle = 0;
		if(Kqm.R_Buff[0] == 0x5F)//地址码正确
		{
			Data_CS = Kqm.R_Buff[0] + Kqm.R_Buff[1] + Kqm.R_Buff[2] + Kqm.R_Buff[3] + Kqm.R_Buff[4] + Kqm.R_Buff[5] + Kqm.R_Buff[6];
			if(Data_CS == Kqm.R_Buff[7])//校验通过
			{
				Sensor.VOC = ((Kqm.R_Buff[1] << 8) + Kqm.R_Buff[2] * 0.1);
				//Sensor.VOC = ((kqm.R_Buff[1] * 0x100) + kqm.R_Buff[2] * 0.1); 1<<8--->2^8=256
				//Sensor.VOC = ((kqm.R_Buff[1] * 256) + kqm.R_Buff[2] * 0.1);
				Sensor.CH20 = ((Kqm.R_Buff[3] << 8) + Kqm.R_Buff[4] * 0.01);
				Sensor.CO2 = ((Kqm.R_Buff[5] << 8) + Kqm.R_Buff[6]);
				printf("VOC=%.1f,CH20=%.2f,CO2=%d\r\n", Sensor.VOC, Sensor.CH20, Sensor.CO2);
			}
			else
			{
				printf("校验不正确!!!\r\n");
			}
		}
		else
		{
			printf("地址码不正确!!!\r\n");
		}
		KQM_R_Buff_Clear();
	}
	//不能放在这里,因为数据还没接收完就被清除了
	//KQM_R_Buff_Clear();
}

SU03T

//处理函数
void SU03T_Handle(void)
{
	if(Su03t.R_Idle == 1)
	{//1数据接收完成
		Su03t.R_Idle = 0;
		if(Su03t.R_Buff[0]==0xAA&&Su03t.R_Buff[1]==0x55&&Su03t.R_Buff[4]==0x55&&Su03t.R_Buff[5]==0xAA)//帧头帧尾正确
		{
			switch(Su03t.R_Buff[3])
			{
				case 0x00:
					break;
				case 0x01:
					LED1_ON();LED2_ON();LED3_ON();LED4_ON();
					break;
				case 0x02:
					LED1_OFF();LED2_OFF();LED3_OFF();LED4_OFF();	
					break;
				case 0x03:
					Relay_ON();
					break;		
				case 0x04:
					Relay_OFF();
					break;
				case 0x05:
					Su03t.S_Buff[0]=0xAA;
					Su03t.S_Buff[1]=0x55;	
					Su03t.S_Buff[2]=0x02;
					Su03t.S_Buff[3]=0x00;
					Su03t.S_Buff[4]=0x00;	
					Su03t.S_Buff[5]=0x00;		
					Su03t.S_Buff[6]=0x00;
					Su03t.S_Buff[7]=0x00;	
					Su03t.S_Buff[8]=0x00;
					Su03t.S_Buff[9]=0x37;
					Su03t.S_Buff[10]=0x40;	
					Su03t.S_Buff[11]=0x55;		
					Su03t.S_Buff[12]=0xAA;
					SU03T_SendBuff(Su03t.S_Buff,13);
					break;
				case 0x06:
					Su03t.S_Buff[0]=0xAA;
					Su03t.S_Buff[1]=0x55;	
					Su03t.S_Buff[2]=0x03;
					Su03t.S_Buff[3]=0x00;
					Su03t.S_Buff[4]=0x00;	
					Su03t.S_Buff[5]=0x00;		
					Su03t.S_Buff[6]=0x00;
					Su03t.S_Buff[7]=0x00;	
					Su03t.S_Buff[8]=0x00;
					Su03t.S_Buff[9]=0x37;
					Su03t.S_Buff[10]=0x40;	
					Su03t.S_Buff[11]=0x55;		
					Su03t.S_Buff[12]=0xAA;
					SU03T_SendBuff(Su03t.S_Buff,13);
					break;
				case 0x07:
					Su03t.S_Buff[0]=0xAA;
					Su03t.S_Buff[1]=0x55;	
					Su03t.S_Buff[2]=0x04;
					Su03t.S_Buff[3]=0x00;
					Su03t.S_Buff[4]=0x00;	
					Su03t.S_Buff[5]=0x00;		
					Su03t.S_Buff[6]=0x00;
					Su03t.S_Buff[7]=0x00;	
					Su03t.S_Buff[8]=0x00;
					Su03t.S_Buff[9]=0x37;
					Su03t.S_Buff[10]=0x40;	
					Su03t.S_Buff[11]=0x55;		
					Su03t.S_Buff[12]=0xAA;
					SU03T_SendBuff(Su03t.S_Buff,13);
					break;
				case 0x08:
					_uart_PlayDouble(18.1,1);
					break;
				default:
					break;				
			}
		}
		else
		{
			printf("帧头帧尾不正确!!!\r\n");
		}
		SU03T_R_Buff_Clear();
	}
	//不能放在这里,因为数据还没接收完就被清除了
	//SU03T_R_Buff_Clear();
}

网站公告

今日签到

点亮在社区的每一天
去签到