本帖最后由 xuzhengkai666 于 2024-10-6 18:56 编辑
你有没有想过,在冬天或者你上完一天半很累的情况下不想用手开灯,只想通过说话或者人体传感器的检测来实现开关灯?但由于目前的能力有限,只能通过一个语音模块来实现开关灯。在制作之前,我们先准备以下表格中的材料(点击图片放大图片)
准备完毕后,开始对HC-05模块进行配置,具体的配置参考HC-05蓝牙模块学习(两个蓝牙模块连接互发信息)_usb转ttl怎么跟蓝牙模块连接-CSDN博客,我就不再叙述了,这里面讲的很详细,如果你还是不会配置HC-05模块,那我建议你还是放弃吧,直接用Asr-Pro控制继电器实现具体的语音控制床头灯功能,也是一样的,只不过少了个按钮控制的功能,仅此而已,后面我还附赠控制HC-05的指令集,是以STC-ISP软件为基础的,到时候你只需要添加就行。 HC-05蓝牙模块配置完成后,一个作为从,另一个作为主,然后分别接入两个USB-TTL串口模块进行通讯测试,确保模块正常工作,如果不正常通讯,请检查自己的硬件接线以及参数配置相关问题,这是非常重要,关乎到后面能否正常使用。排除故障后,就开始我们的编程环节,首先我们编程的开发环境就是天问Block了(版本是夏季正式版),只不过板卡选用TW32F003和ASR-PRO两个板卡了。以下就是两份Demo,我会分别写出来。 TW32F003的Demo(我是直接进入天问Block的字符编程模式进行CV的,下面的ASR-PRO的Demo也是一样,结尾会发.hd文件) - #define Light_Power PF1
- #define Light_LED PA12
- #include <TWEN32F0xx.h>
- #include "HardwareSerial.h"
- String SerialRead = "";
- int main(void)
- {
- TW32F0xx_init();
- Serial2.begin(9600);
- pinMode(Light_Power, GPIO_Mode_Out_PP);
- pinMode(Light_LED, GPIO_Mode_Out_PP);
- digitalWrite(Light_Power, 1);
- digitalWrite(Light_LED, 1);
- while(1){
- if(Serial2.available() > 0){
- SerialRead = Serial2.readString();
- if(SerialRead == "01"){
- //打开卧室灯
- digitalWrite(Light_Power, 0);
- digitalWrite(Light_LED, 0);
- }
- else if(SerialRead == "02"){
- //关闭卧室灯
- digitalWrite(Light_Power, 1);
- digitalWrite(Light_LED, 1);
- }
- }
- }
- return 1;
- }
复制代码ASR-PRO的Demo - #include "asr.h"
- extern "C"{ void * __dso_handle = 0 ;}
- #include "setup.h"
- #include "HardwareSerial.h"
- uint32_t snid;
- uint8_t Delay_Time = 500;
- void ASR_CODE();
- void Light_Control();
- //{speak:小蝶-清新女声,vol:10,speed:10,platform:haohaodada}
- //{playid:10001,voice:欢迎使用卧室灯,用卧室灯唤醒我。}
- //{playid:10002,voice:我退下了,用卧室灯唤醒我}
- /*描述该功能...
- */
- void ASR_CODE(){
- //本函数是语音识别成功钩子程序
- //运行时间越短越好,复杂控制启动新线程运行
- //唤醒时间设置必须在ASR_CODE中才有效
- set_state_enter_wakeup(10000);
- //用switch分支选择,根据不同的识别成功的ID执行相应动作,点击switch左上齿轮
- //可以增加分支项
- switch (snid) {
- case 1:
- Serial1.write("01");
- break;
- case 2:
- Serial1.write("02");
- break;
- }
- }
- void Light_Control(){
- while (1) {
- if(digitalRead(0) == 0){
- delay(Delay_Time);
- if(digitalRead(0) == 0){
- Serial1.write("01");
- while (!false) {
- delay(Delay_Time);
- break;
- }
- }
- }
- if(digitalRead(1) == 0){
- delay(Delay_Time);
- if(digitalRead(1) == 0){
- Serial1.write("02");
- while (!false) {
- delay(Delay_Time);
- break;
- }
- }
- }
- }
- vTaskDelete(NULL);
- }
- void hardware_init(){
- //需要操作系统启动后初始化的内容
- //音量范围1-7
- vol_set(7);
- setPinFun(2,FORTH_FUNCTION);
- setPinFun(3,FORTH_FUNCTION);
- Serial1.begin(9600);
- xTaskCreate(Light_Control,"Light_Control",128,NULL,4,NULL);
- vTaskDelete(NULL);
- }
- void setup()
- {
- //需要操作系统启动前初始化的内容
- //播报音下拉菜单可以选择,合成音量是指TTS生成文件的音量
- //欢迎词指开机提示音,可以为空
- //退出语音是指休眠时提示音,可以为空
- //{ID:0,keyword:"唤醒词",ASR:"卧室灯",ASRTO:"我在"}
- //{ID:1,keyword:"命令词",ASR:"打开灯光",ASRTO:"好的,马上打开灯光"}
- //{ID:2,keyword:"命令词",ASR:"关闭灯光",ASRTO:"好的,马上关闭灯光"}
- setPinFun(0,FIRST_FUNCTION);
- pinMode(0,input);
- dpmu_set_adio_reuse(PA0,DIGITAL_MODE);
- dpmu_set_io_pull(pinToFun[0],DPMU_IO_PULL_UP);
- setPinFun(1,FIRST_FUNCTION);
- pinMode(1,input);
- dpmu_set_adio_reuse(PA1,DIGITAL_MODE);
- dpmu_set_io_pull(pinToFun[1],DPMU_IO_PULL_UP);
- }
复制代码ASR-PRO必须在登录账户的前提下必须先生成模型,然后再进行下载到ASR-PRO中!一定要注意! TW32F003却不是,只要编译就行。 这下软硬件都弄好了,然后根据程序Demo进行硬件搭建,测试是否能够行得通,至于搭建过程我也懒得叙述,只能说有相对应能力的人看到我这个就觉得不是很难,而刚入门的,我就不能保证了。 既然硬件会搭建了,那么洞洞板焊接我觉得应该也不是很难,我也就不再赘述了。到最后,你就获得了一个开关灯控制器,从此你就再也不用爬起来进行开关灯了,岂不是美滋滋?到时候你可以装在卧室,也可以装在客厅,更可以装在卫生间,具体怎么安装要看你怎么使用,我是装在卧室里面,一般用于控制卧室。 今天的项目分享到此结束,下次会再分析更多有趣的作品。
|