本设计是参加嘉立创举办的2023暑期训练营设计出的一款智能时钟,给予在电脑前办公的小伙伴们一款桌面小助手,让你提升对时间的把握。
1.硬件架构说明
1.1 电源供电
电源电路可由Type-C或锂电池为整个系统供电,接入USB供电的同时通过电池管理芯片给锂电池充电。
图1-1 电源输入部分
Type-C接口选用USB-14p的常见型号,并使用其USB2.0部分与电脑进行通信,可进行串口烧写功能,CC1、CC2处外接5.1k下拉电阻作识别。
图1-2 CCx说明
Type-C协议的应用可参考这篇博文:
锂电池部分:电源切换电路,通过一个P沟道的mos、一个下拉电阻以及一个二极管组成电源切换电路,当Type-C电源接入时,MOS管G极电压为5V,经过一个1N5819肖特基二极管,此时VCC电压是4.4V,也就是S极4.4V,不满足导通条件,电池电源截断。当Type-C接口断开,G极为低,S极由于体二极管的存在,会有将近3.5V左右的电压,满足条件,此时MOS管导通,由电池来给后续电路进行供电,由于1N5819肖特基二极管的存在,电流不会反向倒灌回去。
通过一个TP4056锂电池充电芯片给电池进行充电,当Type-C接口接入时,同时会给锂电池充电,确保电量充足。Charge1作为充电状态指示灯,R6是充电电流反馈电阻,通过改变R6的阻值,可以改变整体的充电电流,R6阻值范围可参考图1-3。
图1-3 TP4056恒流充电电流与电阻关系
1.2 主控部分
主控单片机使用的是R7FA2E1A72DFL,工作电压在1.6V到5.5V之间,最大时钟频率为48Mhz,最大支持128-KB的FLASH,16-KB的SRAM,12位的AD转换控制器。芯片内部集成有晶振,可以无需外部晶振,但是系统内部的晶振存在一定的精度误差,可惜本设计中没有加入外部晶振,也算以后的一个设计经验。
芯片集成触摸功能,无需触摸芯片即可实现触摸功能。
在电源输入部分加入100nf电容进行电源滤波,VCL引脚用于稳定内部电源的平滑电容,加入4.7uf的电容并连接到VSS引脚。
图1-4 主控电路部分
1.3 独立按键
采用四个按键作为时钟调节、键盘宏(有待实现)、切换显示内容的使用。
图1-5 独立按键电路
1.4 DHT11温湿度传感器
采用DHT11温湿度传感器检测环境温湿度。
图1-6 DHT11温湿度传感器电路
图1-7 DHT11引脚图
其驱动方法可参考下图,附件中也有DHT11的数据手册
图1-8 DHT11时序图
数据格式为
图1-9 DHT11数据包格式
参考链接:DHT11温湿度传感器学习笔记_啦啦赛的博客-CSDN博客
1.5 四位数码管
采用0.56寸共阴极数码管用于显示时间、温湿度等信息。
图1-10 0.56寸共阴级4位数码管电路
驱动方法设计可参考图1-11电路图的引脚定义,共阳共阴的驱动方法大同小异,买对数码管拿到数据手册就很简单了。
图1-11 四位数码管引脚
1.6 电位器
用到市面上较好买到的拨轮电位器,通过单片机芯片内置的ADC电位采集功能采集到对应的电位值,滤除低位数值的影响后可发送至电脑来调节电脑的音量大小。
图1-12 电位器
1.7 调试接口
共有2种调试接口,一种通过FPC插座引出SWD调试端口,可用Jlink调试与下载(可惜身上没有,导致添加不了触摸方案),另一种串口部分则是板载一颗CH340N芯片,可用作串口烧写和上位机通信。
图1-13 调试接口
2.软件部分
使用QT制作的简易上位机,上位机往下发送的数据格式为十六进制,而单片机往上发送则是Ascii码,也就是字符型数据,两者不统一也不影响,重要的是定义好上下通信数据包的接收与发送方法,例如十六进制就根据十六进制的数据含义来处理数据。
图2-1 上位机
下面提供上下通信的数据包格式供大家参考,附件中也提供上位机软件。
头
|
控制位
|
包1
|
包2
|
包3
|
包4
|
尾
|
解析
|
0xFF
|
0xCA
|
Hour
|
Minute
|
Second
|
NoThing
|
0xFF
|
同步时间
|
图2-2 十六进制的数据包格式(上位机往下发送)
完整数据
|
字符判断
|
数据内容
|
解析
|
"Volume=xx"
|
Volume=
|
xx
|
电脑音量
|
"temp=xx.x"
|
temp=
|
xx.x
|
温度
|
"hum=xx"
|
hum=
|
xx
|
湿度
|
图2-3 字符型数据包
2.1同步时间
QT中定义一个时间系统时间类currentTime,再定义一个定时器,关联定时器溢出信号到定时器处理函数,在定时器处理函数中获取系统时间并保存到数组中:
// 获取当前时间
QDateTime currentTime = QDateTime::currentDateTime();
timer.start(10);
connect(&timer,SIGNAL(timeout()),this,SLOT(showTime()));
|
然后就可以添加按钮"同步"的槽函数,发送时间同步信息到单片机了。
Get_year = currentTime.date().year(); Get_month = currentTime.date().month(); Get_day = currentTime.date().day(); Get_hour = currentTime.time().hour(); Get_minute = currentTime.time().minute(); Get_second = currentTime.time().second(); QDate date = currentTime.date();
|
QString timeString = QString("%1%2%3").arg(Get_hour, 2, 16, QChar('0')).arg(Get_minute, 2, 16, QChar('0')).arg(Get_second, 2, 16, QChar('0'));
serial.write(QByteArray::fromHex(HearData.toLatin1())); serial.write(QByteArray::fromHex(QString("ca").toLatin1())); serial.write(QByteArray::fromHex(timeString.toLatin1())); serial.write(QByteArray::fromHex(HearData.toLatin1())); serial.write(QByteArray::fromHex(HearData.toLatin1())); qDebug()<<"时间"+timeString;
|
2.2获取单片机采集的温湿度信息
根据温湿度传感器DHT11的数据手册,测量速率大于2s为佳,所以在单片机的rtc更新事件中每隔5秒发送一次:
//隔5秒读一次温湿度
if(rtc_second%5==0){//5S读⼀次
DHT11_Read();
printf("hum=%d.%d temp=%d.%d\n",humdity_integer,humdity_decimal,temp_integer,temp_decimal);
}
|
上位机接收方法为:
if(buf.contains("hum=",Qt::CaseSensitive)){
QString hum =buf.mid(buf.indexOf("hum=")+4,2);
ui->Hum_Show->setText(hum+"°RH");
}
if(buf.contains("temp=",Qt::CaseSensitive)){
QString temp =buf.mid(buf.indexOf("temp=")+5,4);
ui->Temp_Show->setText(temp+"°C");
}
|
2.3调节电脑音量
同理,单片机在ADC更新事件中获取电位值,映射到音量范围取值(0-100)发送到上位机,瑞萨内置的ADC精度为12位,也就是0-4095,滤除个位十位即对应0-4000,这样子有助于提升抗干扰。
图2-4 电位转换公式
这里的ADCValue就是滤除个位十位所获取的电位值,Data即为要设置的电脑音量值,这样子就可以将Data按照数据包格式发送到电脑上了,这里4000-ADC_Value是因为电位器往上转是电位小的方向,“与&”上0xfffe保证为偶数。
printf("Volume=%3d\n ",(4000-ADC_Value)/40&0xfffe);
|
查阅了很多资料发现好像QT没有自带调整音量的功能,说是有什么调用window的API来完成,不过有一个B站博主的视频(虽然该视频的声音有点呃)提到可以用window自带的虚拟键码实现音量调整,经测试确实可以调整音量,并实现了音量调节功能。
写在最后:本次训练营我觉得收获到很多东西,开发单片机的方法,查阅资料的途径,电子设计中常见到的问题,小窍门等等很多,当然本设计也出现了许多很可惜的地方,1个是嘉立创提供的3D打印劵2张劵没有及时激活导致过期,还有是蜂鸣器的引脚选到了P200,这个引脚没有输出功能,可惜了。
评论