智能家居 —— 串口通信(语音识别)线程控制

文章目录

  • 串口通信线程控制代码
    • mianPro.c
    • inputCommand.h
    • voiceControl.c
    • 测试结果
  • 语音控制部分
    • 语言控制模块YS-LDV7

若要完成串口之间的通信,需要再树莓派上完成配置文件的修改,利用测试代码验证串口收发功能是否正常,详情可以参考博文:树莓派——wiringPi库详解的串口通信API章节

串口通信线程控制代码

语音控制线程:

  1. 找到语音控制结构体
  2. 完成语音控制初始化
  3. 在循环中调用getCommand函数获取串口发送过来的数据
  4. 拿到串口发送过来的数据后调用比较函数进行比较
  5. 比较函数中通过指令控制设备的开与关

mianPro.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "controlDevice.h"
#include "inputCommand.h"#include <pthread.h>//线程之间的通信一般采用全局变量
struct Devices *pdeviceHead  = NULL;//定义设备工厂初始链表头
struct InputCommander *pcommandHead  = NULL;//定义指令工厂初始链表头struct Devices* findDeviceByName(char *name, struct Devices *phead){   struct Devices *tmp =phead;  if(phead == NULL){     return NULL;    }else{     while(tmp != NULL){    if(strcmp(tmp->deviceName,name)==0){   return tmp;        }           tmp = tmp->next;    }        return NULL; }
}struct InputCommander* findCommandByName(char *name, struct InputCommander *phead){   struct InputCommander *tmp =phead;  if(phead == NULL){     return NULL;    }else{     while(tmp != NULL){    if(strcmp(tmp->commandName,name)==0){   return tmp;        }            tmp = tmp->next;    }        return NULL; }
}//调用语音处理函数
void Command(struct InputCommander *CmdHandler){struct Devices *tmp =NULL;//- 控制某个引脚的电平前需要初始化,可以通过指令进行初始化if(strcmp("CSHALL",CmdHandler->command )==0){tmp = findDeviceByName("smokeAlarm",pdeviceHead);if(tmp!=NULL)tmp->Init(tmp->pinNum);tmp = findDeviceByName("buzzer",pdeviceHead);if(tmp!=NULL)tmp->Init(tmp->pinNum);tmp = findDeviceByName("livingroomLight",pdeviceHead);if(tmp!=NULL)tmp->Init(tmp->pinNum);tmp = findDeviceByName("restaurantLight",pdeviceHead);if(tmp!=NULL)tmp->Init(tmp->pinNum);tmp = findDeviceByName("bedroomLight",pdeviceHead);if(tmp!=NULL)tmp->Init(tmp->pinNum);tmp = findDeviceByName("bathroomLight",pdeviceHead);if(tmp!=NULL)tmp->Init(tmp->pinNum);printf("设备已全部初始化\n");}if(strcmp("OL1",CmdHandler->command) == 0){		tmp = findDeviceByName("livingroomLight",pdeviceHead);  if(tmp != NULL){         tmp->open(tmp->pinNum);      printf("已打开客厅灯\n");     }	}   if(strcmp("CL1",CmdHandler->command) == 0){	tmp = findDeviceByName("livingroomLight",pdeviceHead);   if(tmp != NULL){      tmp->close(tmp->pinNum);      printf("已关闭客厅灯\n");   }	}    if(strcmp("OL2",CmdHandler->command) == 0){	tmp = findDeviceByName("restaurantLight",pdeviceHead);   if(tmp != NULL){        tmp->open(tmp->pinNum);          printf("已打开餐厅灯\n");      }}    if(strcmp("CL2",CmdHandler->command) == 0){	tmp = findDeviceByName("restaurantLight",pdeviceHead);   if(tmp != NULL){          tmp->close(tmp->pinNum);        printf("已关闭餐厅灯\n");   }	}   if(strcmp("OL3",CmdHandler->command) == 0){		tmp = findDeviceByName("bedroomLight",pdeviceHead);  if(tmp != NULL){         tmp->open(tmp->pinNum);       printf("已打开卧室灯\n");      }	}    if(strcmp("CL3",CmdHandler->command) == 0){	tmp = findDeviceByName("bedroomLight",pdeviceHead);   if(tmp != NULL){      tmp->close(tmp->pinNum);     printf("已关闭卧室灯\n");    }}   if(strcmp("OL4",CmdHandler->command) == 0){		tmp = findDeviceByName("bathroomLight",pdeviceHead);  if(tmp != NULL){        tmp->open(tmp->pinNum);     printf("已打开浴室灯\n");      }	}   if(strcmp("CL4",CmdHandler->command) == 0){		tmp = findDeviceByName("bathroomLight",pdeviceHead);  if(tmp != NULL){      tmp->close(tmp->pinNum);     printf("已关闭浴室灯\n");    }	}if(strcmp("OLALL",CmdHandler->command) == 0){	tmp = findDeviceByName("livingroomLight",pdeviceHead);		if(tmp != NULL)  tmp->open(tmp->pinNum);	tmp = findDeviceByName("restaurantLight",pdeviceHead);	if(tmp != NULL)  tmp->open(tmp->pinNum);		tmp = findDeviceByName("bedroomLight",pdeviceHead);	if(tmp != NULL)  tmp->open(tmp->pinNum);		tmp = findDeviceByName("bathroomLight",pdeviceHead);	if(tmp != NULL)  tmp->open(tmp->pinNum);       printf("已打开所有灯\n");    }    if(strcmp("CLALL",CmdHandler->command) == 0){	tmp = findDeviceByName("livingroomLight",pdeviceHead);		if(tmp != NULL)  tmp->close(tmp->pinNum);	tmp = findDeviceByName("restaurantLight",pdeviceHead);	if(tmp != NULL)  tmp->close(tmp->pinNum);	tmp = findDeviceByName("bedroomLight",pdeviceHead);	if(tmp != NULL)  tmp->close(tmp->pinNum);		tmp = findDeviceByName("bathroomLight",pdeviceHead);	if(tmp != NULL)  tmp->close(tmp->pinNum);      printf("已关闭所有灯\n");	}
}void *voiceControlThread(void *arg){int nread;struct InputCommander *voiceHandler = NULL;voiceHandler =  findCommandByName("voice", pcommandHead);if(voiceHandler == NULL){printf("find voiceHandler error\n");pthread_exit(NULL);}else{if(voiceHandler->Init(voiceHandler)<0){printf("voiceControl init  error\n");pthread_exit(NULL);}else{printf("voiceControl init success\n");		}while(1){memset(voiceHandler->command,'\0',sizeof(voiceHandler->command));	nread = voiceHandler->getCommand(voiceHandler);if(nread <= 0){printf("No voiceCommand received\n");}else{printf("Get VoiceCommand -->%s\n",voiceHandler->command);//调用语音处理函数,参数是结构体指针,调试的时候可以先注释掉//Command(voiceHandler);}}}}int main()
{if (wiringPiSetup () == -1) { fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; return 1 ; }//线程的IDpthread_t voice_thread;//设备工厂初始化  	pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);            pdeviceHead = addBedroomLightToDeviceLink(pdeviceHead);pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);pdeviceHead = addSmokeAlarmToDeviceLink(pdeviceHead);pdeviceHead = addBuzzerToDeviceLink(pdeviceHead);//指令工厂初始化pcommandHead  = addVoiceControlToInputCommandLink(pcommandHead);//创建声音控制线程pthread_create(&voice_thread, NULL, voiceControlThread, NULL); //等待线程结束pthread_join(voice_thread, NULL);		return 0;
}

inputCommand.h

#include <wiringPi.h>					
#include <stdio.h>
#include <stdlib.h>
#include <wiringSerial.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>struct InputCommander{char commandName[128];char deviceName[128];  char command[32];int fd;       			//存放文件描述符(串口/网络),后续socket会有两个文件描述符,将accept返回的文件描述符赋值给fdint s_fd;				//socket网络套接字char port[12];			//端口号char ipAdress[32];		//ip地址int (*Init)(struct InputCommander *voiceControl); int (*getCommand)(struct InputCommander *voiceControl);char log[1024];struct InputCommander *next;};struct InputCommander* addVoiceControlToInputCommandLink(struct InputCommander *phead);

voiceControl.c

#include "inputCommand.h"			int	voiceGetCommand(struct InputCommander *voice){int nread = 0;nread = read(voice->fd, voice->command, sizeof(voice->command));return nread; 
}int voiceInit(struct InputCommander *voiceControl){int fd;fd = serialOpen(voiceControl->deviceName,9600);if(fd <0){fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; return 1 ;}voiceControl->fd = fd;return fd;}struct InputCommander voiceControl  = {						.commandName = "voice",						.deviceName="/dev/ttyAMA0",.command={'\0'},//字符串置空.Init=voiceInit,.getCommand=voiceGetCommand,.log = {'\0'},.next = NULL
};struct InputCommander* addVoiceControlToInputCommandLink(struct InputCommander *phead)		
{if(phead == NULL){return &voiceControl;}else{voiceControl.next = phead;phead = &voiceControl;return phead;}
}

测试结果

  • 十秒未发送数据会返回No voiceCommand received
    在这里插入图片描述
  • 成功接收串口发送数据
    在这里插入图片描述
  • 结构体对象:
    • 创建对象其实就是定义变量,要理解需要的变量有哪些
    • 这些变量既可以用来识别区分不同的对象
    • 也可以用来存储信息,作为参数在多线程之间传递
    • 完成功能的初始化

注意:

  • 指针取成员用->
  • 对象取成员用.
  • 控制某个引脚的电平前需要初始化,可以通过指令进行初始化,见command函数
  • 线程里面是不允许return,用pthread_exit(NULL)退出
  • 在该项目中,定义一个指向voicecontrol文件的结构体指针(全局变量),目的为了存储用户输入的命令在command里面,便于在比较函数中进行使用
  • 若要让主程序不退出,可以不使用while而是采用pthread_join去阻塞等待线程的退出
  • wiringPi库的串口的读取会阻塞,每个一段时间会返回一个值,通过该值我们可以在main文件里面打印超时字段展示
  • 踩坑:串口打开不要遗漏了开头的斜杠 /dev/ttyAMA0

语音控制部分

语言控制模块YS-LDV7

添加关键词和识别码

  • 语音模块开发——YS-LDV7 语音识别模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/65558.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能家居(3) —— 串口通信(语音识别)线程控制

目录 一、串口通信线程控制代码 mianPro.c inputCommand.h voiceControl.c 测试结果 二、语音控制部分 一、串口通信线程控制代码 mianPro.c #include <pthread.h> #include "controlDevice.h" #include "inputCommand.h"struct InputCommand…

[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议

根据这个就可以使用iphone控制灯与开关. 折腾了3个晚上,终于将homebridge安装好,安装之前需要安装一堆的库,比如node.js运行环境等,因为网上资料大部分都是在树莓派上面运行,我是直接在ubuntu上面进行的测试,因为安装会有所区别,但是安装好之后就一样了,安装方法在此我就不写了…

智能家居系统 QT

一 环境范围设置 &#xff08;1&#xff09;界面添加新控件 在mainwindow.ui 添加控件&#xff1a; 控件的类型 文本内容 对象名&#xff08;唯一&#xff09; 是否有槽函数 QLabel <温度< lable_随意 否 QLabel <湿度< lable_随意 否 QLabel <光…

Home Assistant 智能家居自动化

一、Home Assistant 自动化中的一个重要概念——模式 引入模式&#xff0c;用于解决正在执行过程中的同一规则又一次被触发的问题 二、Home Assistant 自动化规则的组成部分 2.1 触发条件Trigger&#xff1a;表示智能家居中事件或状态的转换 可选持续时间(特有) trigger有…

qt实现智能家居系统

一、项目介绍 通过TCP/IP协议实现客户端和和服务端的链接&#xff0c;服务端和下位机通过串口通信的方式链接&#xff0c;传递信息&#xff0c;客户端通过账号登录进入进入智能家居服务系统&#xff0c;账号登录和QQ登录类似&#xff0c;我采用的是数据库的方式实现数据的存储和…

语音识别智能家居控制设计

目录 一、方案流程及技术规格书设计 二、系统硬件电路设计 三、软件编写及调试 四、系统调试测试与分析 前言 随着科学技术的快速发展&#xff0c;人们对生活品质的要求也不断提高&#xff0c;开始追求更好更方便的生活方式。因此&#xff0c;智能家居系统应运而生。智能家…

智能家居之网关

网关诞生的背景 很多物联网终端设备在设计之初就考虑了低功耗、低成本的需求&#xff0c;因此大量的物联网终端设备是靠电池来工作并且需要运行相当长的一段时间&#xff0c;比如油田、农业相关的传感器&#xff0c;且这些终端设备不需要实时与物联网平台通讯&#xff0c;甚至…

智能家居是否可与ChatGPT深度融合?

​ ChatGPT自2022年面世以来&#xff0c;已为亿万网民提供智能问答服务。然而我们是否曾想到&#xff0c;这一人工智能驱动的聊天机器人&#xff0c;是否可为智能家居赋能? 要实现ChatGPT与智能家居设备之间的无缝对话&#xff0c;单单依靠一台终端是远远不够的。ChatGPT必须…

调查报告数据分析怎么做?

调查报告数据分析怎么做&#xff1f;拿到一份调查报告看选题、选题内容、调查的目的&#xff0c;然后清洗数据&#xff0c;分析数据提炼观点&#xff0c;过数据变化规律&#xff0c;揭示事物内在发展变化和趋势&#xff0c;抓住问题的本质和关键。 一、分析数据提炼观点 数据分…

pyqt5制作翻译软件+爬虫

VSCpythonmysql&#xff0c; 文章目录 目录 文章目录 前言 一、详细代码 第一个文件Ui_untitled.py 第二个fy_main.py文件&#xff1a; 第三个 &#xff1a;bd_pachong.py 二、登录界面&#xff1a; 总结 前言 通过pyqt5实现了翻译界面的可视化&#xff0c;利用python爬虫实现了…

给 30 岁左右的你三个职场跃迁/改变命运的建议!

见字如面&#xff0c;我是军哥&#xff01; 通过公众号的后台用户画像数据&#xff0c;我发现我的读者在 26 到 32 岁的年龄阶段的人数最多&#xff0c;所以今天来聊一聊这个话题&#xff0c;你一定要看到最后&#xff0c;会让你少走很多弯路&#xff01; 核心观点主要包括三个…

38岁程序员和你分享4个人生经验!

蓝色关注&#xff0c;回复“1”获取知名公司程序员和产品经理职级 这是我的第「123」篇原创文章 见字如面&#xff0c;我是军哥。 我最近一直想写一篇稍微长点的文章&#xff0c;毕竟内容篇幅有时候决定内容广度和深度。 距离我之前写的那篇文章《一位互联网老兵的五次认知升级…

【我命由我不由天】30多岁的大龄程序员,应该如何保持职场竞争力?

公众号后台回复“学习”&#xff0c;获取作者独家秘制精品资料 扫描下方海报二维码&#xff0c;试听课程&#xff1a; &#xff08;课程详细大纲&#xff0c;请参见文末&#xff09; 目录 回首往事&#xff1a;自己竟没有任何核心优势&#xff01;公司遇到危机时&#xff0c;大…

写给互联网人35岁之后的建议

作者介绍 李凯东 某大厂大数据总监&#xff0c;管理经验丰富&#xff1b; 负责数据、用户、搜索、推荐、AI等&#xff1b; 曾有10年连续创业经历&#xff1b; 产研运全能&#xff0c;国内知名比赛获奖无数&#xff1b; “数据人创作者联盟”成员。 又到了春节&#xff0c…

程序员如何跨越35岁危机?这篇给点干货建议!

职场&认知洞察 丨 作者 / findyi 这是findyi公众号的第83篇原创文章 这两天在我的读者群里做了一个职业小调研&#xff0c;发现关注我公众号的70%以上都是程序员。 毕竟程序员吸引程序员&#xff0c;这也算猿粪吧&#xff0c;哈哈。 这个小调研也引发大家对程序员行业的激烈…

35岁是人生分水岭?一定要做这7件事

在网上看到这样的帖子&#xff0c;说的是35岁以上的员工&#xff0c;有人脉的卖保险&#xff0c;没人脉的跑滴滴&#xff0c;实在不行送外卖。招聘时&#xff0c;35岁以下优先。调整时&#xff0c;35岁以上优化。对绝大数人来说&#xff0c;35岁是一道坎&#xff0c;35岁是人生…

32岁大龄女程序员的职场经历总结,分享重回职场的感受

不知不觉已经三十过二&#xff0c;我2016年研究生毕业就来到了苏州一家国企。我对自己并没有清晰的职业规划&#xff0c;还记得来这家公司面试时&#xff0c;面试官问我&#xff0c;为啥选择我们公司。我说因为他是国企又有互联网公司的性质&#xff0c;即稳定又能写代码&#…

麦肯锡:给20、30岁职场年轻人的14条建议!条条珍贵

点击“技术领导力”关注∆ 每天早上8:30推送 来源&#xff1a; 《麦肯锡决断力》 1、 选择工作的标准: 选择有利于自己成长的公司&#xff1b; 选择可以从事国际性工作的公司&#xff1b; 选择可以充分发挥自身能力&#xff0c;创造出价值&#xff0c;并且可以为社会做出贡献…

给还没到35岁中年危机的程序员们一些建议

前言 上周&#xff0c;我一个同学被柔性辞退了&#xff0c;是一个外企&#xff0c;给了n 1的补偿&#xff0c;十来万人民币。他在那家公司干了三年多&#xff0c;毕业十年换过四家单位&#xff0c;都是国企或者外企。他今年三十四岁&#xff0c;年前就知道要走的消息&#xff…

30岁程序员回顾人生、展望未来

活动地址&#xff1a;http://blog.csdn.net/blogdevteam/article/details/42172979 一、回顾毕业以来这么多年走过的路 从2007年7月份走出校门到今天2014年12月份&#xff0c;已经整整7年半了。想想7年半之前的自己&#xff0c;再看看现在的我&#xff0c;这么多年走过的路&a…