
基于STC32单片机的智能时钟
简介
基于STC32的智能时钟,使用ESP8266模块获取网络时间和天气,利用STC的RTC时钟进行时间的显示和闹钟的设定,也利用DHT11温湿度传感器对环境中的温湿度进行检测,还有语音识别和播报的功能。
简介:基于STC32的智能时钟,使用ESP8266模块获取网络时间和天气,利用STC的RTC时钟进行时间的显示和闹钟的设定,也利用DHT11温湿度传感器对环境中的温湿度进行检测,还有语音识别和播报的功能。开源协议
:GPL 3.0
描述
一:原理图设计
(1)主控电路设计
采用STC32G12K128作为主控芯片,工作电压为1.9V~5.5V,拥有超高速的32位8051内核,比传统的8051快70倍以上,同时拥有49个中断源,4级中断优先级,也有5个16位的定时器,4个高速串口,2组高级PWM等功能,而且支持USB直接烧录,并不需要下载器,可以提供很大的方便。
根据芯片的数据手册可知需要在VCC处加上滤波电容,UCAP引脚也需要接上电容,而Vref引脚一定不能悬空,它是ADC外部参考电源的引脚,要么接到VCC,要么就要接到外部参考电源,在本项目中接到的是外部参考电源,如下图所示,使用CJ431提供2.5V的基准电源。
(2)供电电路设计
本项目中采用TYPE-C进行电压的供电并且可以直接进行USB下载如下图所示,特别注意需要使用带有数据传输的TYPE-C哦,不然就下载不了了,CC1和CC2不能悬空。
(3)降压电路设计
在本项目中需要使用到3.3V电源,所以我们需要一个降压电路如下图所示,采用LDO进行降压,输入和输出需要加上电容,因为数据手册是这样写的。
(4)电源切换电路和锂电池充电电路设计
在本项目中,可以采用TYPE-C进行供电,也可以采用锂电池供电,下图是一个经典的电源切换电路,当TYPE-C进行供电的时候MOS管会截至,由TYPE-C进行供电并对电池进行充电,当没有连接到外部电源时,MOS管导通由电池来进行供电。
(5)蜂鸣器驱动电路
在本项目中采用蜂鸣器来进行闹钟的发声源,采用无源蜂鸣器,利用三极管进行对电流的放大,驱动蜂鸣器的工作。
(6)WIFI模块设计
使用ESP8266模块连接到STC32单片机的串口二进行网络时间和天气的获取。
(7)温湿度传感器电路设计
采用DHT11温湿度传感器进行温湿度的读取,因为采用单总线时序,在空闲的时候需要将数据线拉高,故在电路中采用上拉电阻设计。
(8)语音识别模块电路设计
采用天问ASR-PRO模块进行语音的识别和播报。
(9)OLED电路设计
采用OLED屏幕进行界面的显示。
(10)电池电压检测电路设计
在本项目中采用的时的ADC参考电压是2.5V而外部供电和电池供电都大于2.5V,所以采用两个10K电阻进行分压是原电压的一半,然后在代码中对所测得的数据翻倍就可以得到所测电压。
以下电路为调试电路、按键电路、LED电路采用了RGB灯可以进行多种颜色的显示,看起来会更好看。
二:软件设计
软件设计中就讲一下如何通过ESP8266获取网络时间和天气的,这一部分也是花费时间很久的。这里采用ESP8266连接到网络来读取网络时间和天气,采用ESP8266的AT指令集来连接TCP服务器来进行网络时间的读取,利用STC32的串口二对ESP8266发送指令来进行时间的获取,因为现在好像苏宁的API不能用了,然后我再网上找了好久才找到一个可以用的http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1,利用以下指令就可以连接到API并获得由ESP8266返回的一段数据,接下来就是需要我们通过利用字符串函数将这段数据中的有效数据提取出来。
AT
AT+RST
AT+CWMODE=1
AT+CIPMUX=0
AT+CWJAP="iphone xxxx","wjm590509"
AT+CIPSTART="TCP","api.k780.com",80
AT+CIPMODE=1
AT+CIPSEND
GET http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1
返回数据下所示:
{"success":"1","result":{"timest
amp":"1719986635","datetime_1":"
2024-07-03 14:03:55","datetime_2":"2024骞?7鏈?3鏃?14鏃?3鍒?
5绉?,"week_1":"3","week_2":"鏄熸湡涓?,"week_3":"鍛ㄤ笁","week_4":"Wednesday"}}
需要通过strstr函数定位到datetime_1字符串,然后将后面的数据提取出来,但是提取出来的并不是十进制而是字符串我们需要通过atio函数将字符串转化为十进制即可。
获取天气同样类似的操作,通过调用心知天气来获取天气信息,有付费版和免费版,免费版的数据只有温度和天气状况,而付费版则由很多,感觉免费版也差不多可以用的。以下是获取天气AT指令:
AT
AT+RST
AT+CWMODE=1
AT+CIPMUX=0
AT+CWJAP="iphone xxxx","wjm590509"
AT+CIPSTART="TCP","api.seniverse.com",80
AT+CIPMODE=1
AT+CIPSEND
GET https://api.seniverse.com/v3/weather/now.json?key=SaH8Ifm9HSdWY5stg&location=shenzhen&language=en&unit=c
返回数据:
{"results":[{"location":{"id":"W
S10730EM8EV","name":"Shenzhen","
country":"CN","path":"Shenzhen,Shenzhen,Guangdong,China","timezo
ne":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"S
unny","code":"0","temperature":"32"},"last_update":"2024-07-07T1
7:04:39+08:00"}]}
code是天气代码可以对照说明表进行天气的显示哦;(说明表网址:https://seniverse.yuque.com/hyper_data/api_v3/yev2c3?)
(PS:最后都需要退出透传模式哦,因为读取数据需要进入透传模式,不退出的话后面再次发送会产生乱码的,发送+++不要换行即可退出)
据我发现STC32的头文件中没有strstr函数,所以我们需要重新写出这个函数。如下所示:
char * strstr ( const char * str1, const char * str2 )
{
char *cp = (char *) str1;
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && !(*s1-*s2) )/*在c语言中指针与指针相减,得到的是元素的个数*/
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}
其他代码就放在附件中了,但是有些还没有完成,语音识别和播报没有时间来写,因为打工人没有时间。等空闲了就慢慢在补充完成。
视频演示了网络时间和闹钟的设定还有温湿度的检测。
最后感谢嘉立创和STC对本次活动的支持!!!祝嘉立创和STC越来越好!!!
设计图

BOM


评论