目录
传感器
传感器分类
数字量传感器和模拟量传感器
数字量传感器
数字信号:只有 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();
}