設備說明:本設備使用具有兩個usart串口的stc12c5a60s2作為MCU主控,SNR3512作為語音識別模塊,JQC80作為語音模塊,esp8266作為聯網模塊。本設備可以實現非特定人聲的語音識別,并且在識別之后進行自動聯網獲取目標城市的時間和未來七天的溫度。在本裝置中,可以在上電之后按下key1或者呼叫"小星,小星"啟動SNR3512模塊,之后呼叫"啟動引擎",開啟聯網。聯網成功后自動播放時間和溫度。天氣API用的www點sojson點com/blog/234.html,因為這個天氣API需要進行解析,利用單片機進行解析比較麻煩。所以就讓朋友搭建了一個新的網址,在自己搭建的網址中先把API中的天氣提取完成。這樣我的設備直接訪問這個網址就可以獲取到時間和天氣了。操作說明:
1.插上電源,會啟動OLED并且播放聲音語句:"歡迎使用小桔智能天氣時鐘"
2.按鍵Key1或者呼叫“小星小星”+"啟動引擎",播放語句"小桔正在努力聯網中"
3.oled最下面會依次顯示step1-ok,step2-ok,step3-ok,step4-ok,step5-ok.step6-ok.,step7-0k。
其中,step2-step3需要進行大概10~20s的時間,之后就會播放"聯網成功",否則播放"聯網失敗,重新聯網中"
,聯網失敗需要按下key1進行重新聯網,或者重新啟動設備。
4.到step7-ok后則會播放時間和天氣,此時播放結束后可以按key1或者呼叫"小星,小星",則可以重新播放時間。如果需要退出聯網狀態,按下key2,顯示step8-ok。
最后:本代碼還有不少的地方需要進行完善,有興趣的伙伴可以自己動手進行試驗哦。
作者:Vence
原理圖:
原理圖.png (103.98 KB, 下載次數: 82)
下載附件
2020-4-19 21:59 上傳
PCB:
PCB.png (64.73 KB, 下載次數: 83)
下載附件
2020-4-19 22:00 上傳
實物:
微1.jpg (7.26 MB, 下載次數: 86)
下載附件
2020-4-19 22:00 上傳
聯網前
2.jpg (6.47 MB, 下載次數: 72)
下載附件
2020-4-19 22:01 上傳
聯網后
主函數代碼:
- /*********************************************************
- ***************時間:2020年4月9日22點33分******************
- 項目名稱:基于stc12c5a60s2+snr3512的智能語音天氣時鐘*******
- 說明:通過非特定人聲的語音操作,讓設備自動獲取網絡時間并進*
- 行語音播報 ***********************************************
- *******************作者:Vence*****************************
- *********************************************************/
- #include<STC12C5A60S2.h>
- #include "GLOBAL.h"
- #include "DEFINE.h"
- //全局函數
- //unsigned char temp1,temp2; //串口1、2數據接收數量
- volatile unsigned char idata recarray[39]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //數據緩存
- volatile unsigned char idata receive_snr3512[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //接收SNR3512的數據
- //獲取的時間,年,月,日
- unsigned char year[6] = {'2','0','2','0','-','\0'};
- unsigned char date[6] = {'0','1','-','0','1','\0'};
- unsigned char time[6] = {'1','2',':','0','0','\0'}; //結尾要加\0,否則不知道是否為字符串的結尾
- unsigned char temp[8] = {21,0,0,0,0,0,0,0}; //寧波市未來七天最低溫度
- unsigned char month,dat,hour,minute;
- //unsigned char step[2] = {'0','\0'};
- unsigned char step,reapeat,reap;
- unsigned char time_flag;
- //unsigned char *time = "2020-04-17 12:15";
- //主函數
- void main()
- {
- time_flag = 0;
- step = 0;
- reapeat = 0;
- reap = 0;
- flag = 0;
- count_all = 0;
- snr3512_count = 0;
- Init1302(); //初始化1302
- InitUART(); //初始化串口,關閉串口1、2
- OLED_Init(); //初始化OLED
- OLED_Clear();
- //delay1ms(100); //esp8266上電初始化
- OLED_ShowCHinese(0,0,0);//小
- OLED_ShowCHinese(18,0,1);//桔
- OLED_ShowCHinese(36,0,2);//智
- OLED_ShowCHinese(54,0,3);//能
- OLED_ShowCHinese(72,0,4);//天
- OLED_ShowCHinese(90,0,5);//氣
- OLED_ShowCHinese(108,0,6);//鐘
- OLED_ShowString(0,2,year);
- OLED_ShowString(40,2,date);
- OLED_ShowString(88,2,time);
- OLED_ShowString(0,4,"weather: sun");
- OLED_ShowString(0,6,"0");
- voice_display(1);
- while(1)
- {
- if(key1 == 0 || receive_snr3512[0] == 0x88) //按下key1或者啟動引擎
- {
- time_flag = 0;
- delay1ms(10);
- if(key1 == 0 || receive_snr3512[0] == 0x88)
- {
- ES = 1;
- IE2 =0x00; //關閉串口2中斷 ES2=1
- step = 1;
- while(1)
- {
- if(step == 1)
- {
- voice_display(2); //小桔正在努力聯網中
- ClearRec();
- ClearSNR3512();
- SendGprsCmd(str1);
- while(reapeat<30 && reap<10)
- {
- delay1ms(100);
- reap++;
- }
-
- if(recarray[0] == 'K')
- {
- OLED_ShowString(0,6,"step1-ok");
- ClearRec();
- step = 2;
- reap = reapeat = 0;
- }
-
- else
- {
- reapeat++;
- if(reapeat>30)
- {
- voice_display(4); //聯網失敗,重新聯網中
- IE2 =0x01;
- ClearRec();
- reap = reapeat = 0;
- OLED_ShowString(0,6,"step1-err");
- break;
- }
- }
- }
-
- if(step == 2)
- {
- ClearRec();
- SendGprsCmd(str2);
- while(reapeat<5 && reap<10)
- {
- delay1ms(100);
- reap++;
- }
-
- if(recarray[0] == 'K')
- {
- OLED_ShowString(0,6,"step2-ok");
- ClearRec();
- step = 3;
- reap = reapeat = 0;
- }
-
- else
- {
- reapeat++;
- if(reapeat>5)
- {
- voice_display(4); //聯網失敗,重新聯網中
- IE2 =0x01;
- ClearRec();
- reap = reapeat = 0;
- OLED_ShowString(0,6,"step2-err");
- break;
- }
- }
- }
-
- if(step == 3)
- {
- ClearRec();
- SendGprsCmd(str3);
- while(reapeat<5 && reap<100)
- {
- delay1ms(100);
- reap++;
- }
-
- if(recarray[0] == 'K')
- {
- voice_display(3); //聯網成功
- OLED_ShowString(0,6,"step3-ok");
- ClearRec();
- step = 4;
- reap = reapeat = 0;
- }
-
- else
- {
- reapeat++;
- if(reapeat>5)
- {
- voice_display(4); //聯網失敗,重新聯網中
- IE2 =0x01;
- ClearRec();
- reap = reapeat = 0;
- OLED_ShowString(0,6,"step3-err");
- break;
- }
- }
- }
-
- if(step == 4)
- {
- ClearRec();
- SendGprsCmd(str4);
- while(reapeat<5 && reap<10)
- {
- delay1ms(100);
- reap++;
- }
-
- if(recarray[0] == 'K')
- {
- OLED_ShowString(0,6,"step4-ok");
- ClearRec();
- step = 5;
- reap = reapeat = 0;
- }
-
- else
- {
- reapeat++;
- if(reapeat>5)
- {
- voice_display(4); //聯網失敗,重新聯網中
- IE2 =0x01;
- ClearRec();
- reap = reapeat = 0;
- OLED_ShowString(0,6,"step4-err");
- break;
- }
- }
- }
-
- if(step == 5)
- {
- ClearRec();
- SendGprsCmd(str5);
- while(reapeat<5 && reap<10)
- {
- delay1ms(100);
- reap++;
- }
-
- if(recarray[0] == 'K')
- {
- OLED_ShowString(0,6,"step5-ok");
- ClearRec();
- step = 6;
- reap = reapeat = 0;
- }
-
- else
- {
- reapeat++;
- if(reapeat>5)
- {
- voice_display(4); //聯網失敗,重新聯網中
- IE2 =0x01;
- ClearRec();
- reap = reapeat = 0;
- OLED_ShowString(0,6,"step5-err");
- break;
- }
- }
- }
-
- if(step == 6)
- {
- ClearRec();
- SendGprsCmd(str6);
- while(reapeat<5 && reap<10)
- {
- delay1ms(100);
- reap++;
- }
-
- if(recarray[0] == 0x3e)
- {
- OLED_ShowString(0,6,"step6-ok");
- ClearRec();
- step = 7;
- reap = reapeat = 0;
- }
-
- else
- {
- reapeat++;
- if(reapeat>5)
- {
- voice_display(4); //聯網失敗,重新聯網中
- IE2 =0x01;
- ClearRec();
- reap = reapeat = 0;
- OLED_ShowString(0,6,"step6-err");
- break;
- }
- }
- }
-
- if(step == 7)
- {
- SendGprsCmd(str7);
- delay1ms(100);
- SendGprsCmd(str8);
- while(reapeat<5 && reap<20)
- {
- delay1ms(100);
- reap++;
- }
-
- if(recarray[0] == '0')
- {
- OLED_ShowString(0,6,"step7-ok");
- date[0] = recarray[1];
- date[1] = recarray[2];
- date[3] = recarray[3];
- date[4] = recarray[4];
- time[0] = recarray[5];
- time[1] = recarray[6];
- time[3] = recarray[7];
- time[4] = recarray[8];
- temp[1] = (Ctoi(recarray[11]))*10+Ctoi(recarray[12]);
- temp[2] = (Ctoi(recarray[13]))*10+Ctoi(recarray[14]);
- temp[3] = (Ctoi(recarray[15]))*10+Ctoi(recarray[16]);
- temp[4] = (Ctoi(recarray[17]))*10+Ctoi(recarray[18]);
- temp[5] = (Ctoi(recarray[19]))*10+Ctoi(recarray[20]);
- temp[6] = (Ctoi(recarray[21]))*10+Ctoi(recarray[22]);
- temp[7] = (Ctoi(recarray[23]))*10+Ctoi(recarray[24]);
- month = (Ctoi(recarray[1]))*10+Ctoi(recarray[2]);
- dat = (Ctoi(recarray[3]))*10+Ctoi(recarray[4]);
- hour = (Ctoi(recarray[5]))*10+Ctoi(recarray[6]);
- minute = (Ctoi(recarray[7]))*10+Ctoi(recarray[8]);
- OLED_ShowString(0,2,year);
- OLED_ShowString(40,2,date);
- OLED_ShowString(88,2,time);
- time_dispaly(month,dat,hour,minute); //播放時間
- if(time_flag == 0)
- weath_display(temp); //播放天氣
- voice_display(5); //小桔溫馨提醒,注意防護
- time_flag = 0;
- step = 8;
- reap = reapeat = 0;
- }
-
- else
- {
- reapeat++;
- if(reapeat>5)
- {
- voice_display(4); //聯網失敗,重新聯網中
- IE2 =0x01;
- SendGprsCmd(str9);
- ClearRec();
- reap = reapeat = 0;
- OLED_ShowString(0,6,"step7-err");
- break;
- }
- }
- }
-
- if(step == 8)
- {
- IE2 =0x01;
- if(key1 == 0 || receive_snr3512[0] == 0x7f) //重復獲取時間
- {
- if(key1 == 0 || receive_snr3512[0] == 0x7f)
- {
- time_flag = 1;
- voice_display(6);
- ClearRec();
- ClearSNR3512();
- step = 7;
- }
- }
-
- if(key2 == 0 || receive_snr3512[0] == 0x89) //退出透傳模式
- {
- SendGprsCmd(str9);
- ClearRec();
- ClearSNR3512();
- OLED_ShowString(0,6,"step8-ok");
- ES = 0;
- break;
- }
- }
- }
- }
- }
-
- }
- }
- /************串口1中斷處理函數*************/
- void UART_1Interrupt(void) interrupt 4
- {
- if(RI)
- {
- if(step == 1 || step == 2 || step == 3 || step == 4 || step == 5)
- {
- RI = 0;
- recarray[count_all] = SBUF;
- if(recarray[0] == 'K')
- {
- flag = 1;
- }
- if(flag == 1)
- count_all++;
- }
-
- if(step == 6)
- {
- RI = 0;
- recarray[count_all] = SBUF;
- if(recarray[0] == 0x3e)
- {
- flag = 1;
- }
- if(flag == 1)
- count_all++;
- }
-
- if(step == 7)
- {
- if(flag == 0)
- {
- RI = 0;
- recarray[count_all] = SBUF;
- if(recarray[0] == 'L')
- {
- flag = 1;
- }
- }
- if(flag == 1)
- {
- RI = 0;
- recarray[count_all] = SBUF;
- if(recarray[0] == '0')
- {
- count_all++;
- }
- }
-
- }
- }
- }
- /************串口2中斷處理函數*************/
- void UART_2Interrupt(void) interrupt 8
- {
- if(S2CON&S2RI)
- {
- S2CON&=~S2RI;
- receive_snr3512[0] = S2BUF;
- }
- }
復制代碼 附件中包含的文件有:原理圖+PCB+代碼+演示視頻
51hei.png (7.5 KB, 下載次數: 80)
下載附件
2020-4-19 23:53 上傳
全部資料51hei下載地址:
智能天氣時鐘.zip
(19.17 MB, 下載次數: 91)
2020-4-19 22:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|