胶南网站建设公司,简洁网站模板素材,手机助手,网站建站查询目录 
一、智能家居项目框架设计草图 
二、框架代码文件工程建立 
三、添加声音识别模块的串口读取功能 一、智能家居项目框架设计草图 代码思路讲解#xff1a; 
1、一个指令工厂#xff0c;一个控制工厂#xff0c;实际上就是通过链表链起来的数据。具体怎么链接起来…目录 
一、智能家居项目框架设计草图 
二、框架代码文件工程建立 
三、添加声音识别模块的串口读取功能 一、智能家居项目框架设计草图 代码思路讲解 
1、一个指令工厂一个控制工厂实际上就是通过链表链起来的数据。具体怎么链接起来就是基于简单工厂模式的类与对象的概念上一篇文章有学习记录。 2、主函数语音指令程序和tcp指令程序各起一个线程然后通过指令名字找到对应的控制程序实现对应的模块的功能。 
二、框架代码文件工程建立 
1、在桌面新建一个项目文件夹smartHose,然后在文件夹中创建如下文件 2、把上述的所有文件都加载到Source lnsight工具中如下图代表加载完毕 3、创建inputCommand.h头文件 
//面向指令工厂的头文件
#include wiringPi.h
#include stdlib.hstruct InputCommander{char commandName[128];             //名字char command[32];                  //指令int (*Init)(char *name,char *ipAdress,char *port);  //操作函数 int (*getCommand)(char *cmd);      //获取数据函数char log[1024];                    //log日志获取struct InputCommander *next;
};4、创建contrlDevices.h头文件 
//设备头文件
#include wiringPi.hstruct Devices{char deviceName[128]; //名字int status;           //状态int pinNum;           //引脚int (*open)(int pinNum);        //打开int (*close)(int pinNum);       //关闭int (*deviceInit)(int pinNum);  //设备初始化int (*readStatus)();  //火灾int (*changeStatus)(int status);struct Devices *next;
};struct Devices* addBathroomLightToDeviceLink(struct Devices *phead);
struct Devices* addUpstairLightToDeviceLink(struct Devices *phead);
struct Devices* addLivingRoomLightToDeviceLink(struct Devices *phead);
struct Devices* addRestaurantLightToDeviceLink(struct Devices *phead);
struct Devices* addFireToDeviceLink(struct Devices *phead); 
5、创建bathroomLight.c文件 
//浴室的灯
#include contrlDevices.h
#includestdlib.hint bathroomLightOpen(int pinNum){digitalWrite(pinNum,LOW);
}
int bathroomLightClose(int pinNum){digitalWrite(pinNum,HIGH);
}
int bathroomLightCloseInit(int pinNum){pinMode(pinNum,OUTPUT);digitalWrite(pinNum,HIGH);
}
int bathroomLightCloseStatus(int status){}
struct Devices bathroomLight{.deviceName  bathroomLight,.pinNum  26,.open  bathroomLightOpen,.close  bathroomLightClose,.deviceInit  bathroomLightCloseInit,.changeStatus  bathroomLightCloseStatus};
struct Devices* addBathroomLightToDeviceLink(struct Devices *phead){if(phead  NULL){	return bathroomLight;}else{bathroomLight.next  phead;phead  bathroomLight;}
}; 
6、创建livingroomLight.c文件 
#include contrlDevices.h
#includestdlib.hint livingroomLightOpen(int pinNum){digitalWrite(pinNum,LOW);
}
int livingroomLightClose(int pinNum){digitalWrite(pinNum,HIGH);
}
int livingroomLightCloseInit(int pinNum){pinMode(pinNum,OUTPUT);digitalWrite(pinNum,HIGH);
}
int livingroomLightCloseStatus(int status){}
struct Devices livingroomLight{.deviceName  livingroomLight,.pinNum  27,.open  livingroomLightOpen,.close  livingroomLightClose,.deviceInit  livingroomLightCloseInit,.changeStatus  livingroomLightCloseStatus};
struct Devices* addLivingRoomLightToDeviceLink(struct Devices *phead){if(phead  NULL){	return livingroomLight;}else{livingroomLight.next  phead;phead  livingroomLight;}
}; 
7、创建restaurantLight.c文件 
#include contrlDevices.h
#includestdlib.hint restaurantLightOpen(int pinNum){digitalWrite(pinNum,LOW);
}
int restaurantLightClose(int pinNum){digitalWrite(pinNum,HIGH);
}
int restaurantLightCloseInit(int pinNum){pinMode(pinNum,OUTPUT);digitalWrite(pinNum,HIGH);
}
int restaurantLightCloseStatus(int status){}
struct Devices restaurantLight{.deviceName  restaurantLight,.pinNum  28,.open  restaurantLightOpen,.close  restaurantLightClose,.deviceInit  restaurantLightCloseInit,.changeStatus  restaurantLightCloseStatus
};
struct Devices* addRestaurantLightToDeviceLink(struct Devices *phead){if(phead  NULL){	return restaurantLight;}else{restaurantLight.next  phead;phead  restaurantLight;}
}; 
8、创建upstairLight.c文件 
//二楼灯
#include contrlDevices.h
#includestdlib.hint upstairLightOpen(int pinNum){digitalWrite(pinNum,LOW);
}
int upstairLightClose(int pinNum){digitalWrite(pinNum,HIGH);
}
int upstairLightCloseInit(int pinNum){pinMode(pinNum,OUTPUT);digitalWrite(pinNum,HIGH);
}
int upstairLightCloseStatus(int status){}
struct Devices upstairLight{.deviceName  upstairLight,.pinNum  29,.open  upstairLightOpen,.close  upstairLightClose,.deviceInit  upstairLightCloseInit,.changeStatus  upstairLightCloseStatus
};
struct Devices* addUpstairLightToDeviceLink(struct Devices *phead){if(phead  NULL){	return upstairLight;}else{upstairLight.next  phead;phead  upstairLight;}
}; 
9、创建fire.c文件 
//火灾报警
#include contrlDevices.h
#includestdlib.hint fireIfOrNotInit(int pinNum){pinMode(pinNum,INPUT);digitalWrite(pinNum,HIGH);
}
int fireStatusRead(int pinNum){return digitalRead(pinNum);
}
struct Devices fireIfOrNot{.deviceName  fireIfOrNot,.pinNum  25,.deviceInit  fireIfOrNotInit,.readStatus  fireStatusRead};
struct Devices* addFireToDeviceLink(struct Devices *phead){if(phead  NULL){	return fireIfOrNot;}else{fireIfOrNot.next  phead;phead  fireIfOrNot;}
}; 
10、创建mainPro.c主函数文件 
#include stdio.h
#include contrlDevices.h
#include string.h
#include inputCommand.hstruct 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;}
};int main(){char name [128];struct Devices *tmp  NULL;if(-1  wiringPiSetup()){return -1;}struct Devices *pdeviceHead  NULL;pdeviceHead  addBathroomLightToDeviceLink(pdeviceHead);pdeviceHead  addUpstairLightToDeviceLink(pdeviceHead);pdeviceHead  addLivingRoomLightToDeviceLink(pdeviceHead);pdeviceHead  addRestaurantLightToDeviceLink(pdeviceHead);pdeviceHead  addFireToDeviceLink(pdeviceHead);while(1){printf(Input:\n);scanf(%s,name);tmp  findDeviceByName(name,pdeviceHead);if(tmp ! NULL){tmp-deviceInit(tmp-pinNum);tmp-open(tmp-pinNum);}}//1、指令工厂初始化//2、设备控制工厂初始化//3、线程池建立//3.1、语音线程//3.2、socket线程//3.3、摄像头线程//3.4、火灾线程
} 
把上述的代码传到树莓派的终端用FileZilla传即可然后执行结果 gcc mainPro.c upstairLight.c bathroomLight.c livingroomLight.c restaurantLight.c -lwiringPi -o test1 效果演示虽然没有装到实际的智能家居里但是小灯亮了说明程序是可以正常用的 三、添加声音识别模块的串口读取功能 
这里主要通过主控芯片树莓派的串口跟语音模块连接。 树莓派的T接语音模块的R 树莓派的R接语音模块的T 然后就是供电 
我们先把语音模块的代码整合到指令链表当中去1.语音控制设备voiceContrl.c 
#include inputCommand.h
#include stdlib.h
#include wiringPi.h
#include stdio.h
#include wiringSerial.h
#include unistd.h//串口int voiceInit(struct InputCommander *voicer,char *ipAdress,char *port){ //声音初始化int fd;if((fd  serialOpen(voicer-deviceName,9600))  -1){  //初始化串口波特率9600exit(-1);}voicer-fd  fd;return fd;
} 
int voiceGetCommand(struct InputCommander *voicer){int nread  0;nread  (voicer-fd,voicer-command,sizeof(voicer-command));if(nread  0){printf(usart for voice read over time\n);}else{return nread;}
}
struct InputCommander voiceContrl  {.commandName  voice, .deviceName  dev/ttyAMA0,.command  {\0},.Init  voiceInit,.getCommand  voiceGetCommand,.log  {\0},.next  NULL,};
struct InputCommander* addvoiceContrlToInputCommandLink(struct InputCommander *phead){if(phead  NULL){return voiceContrl;}else{voiceContrl.next  phead;phead  voiceContrl;}
}; 
2.控制设备的头文件inputCommand.h 
//面向指令工厂的头文件
#include wiringPi.h
#include stdlib.hstruct InputCommander{char commandName[128];  //声音的名字char command[32];       char deviceName[128];   //串口的名字int (*Init)(struct InputCommander *voicer,char *ipAdress,char *port); int (*getCommand)(struct InputCommander *voicer);char log[1024];int fd;struct InputCommander *next;};
struct InputCommander* addvoiceContrlToInputCommandLink(struct InputCommander *phead); 
3.在mainPro.c主函数中添加语音模块的函数 
#include stdio.h
#include contrlDevices.h
#include string.h
#include inputCommand.hstruct 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;}
};
int main(){char name [128];struct Devices *tmp  NULL;if(-1  wiringPiSetup()){return -1;}struct Devices        *pdeviceHead  NULL;   //设备工厂struct InputCommander *pCommandHead  NULL;  //指令工厂pdeviceHead  addBathroomLightToDeviceLink(pdeviceHead);pdeviceHead  addUpstairLightToDeviceLink(pdeviceHead);pdeviceHead  addLivingRoomLightToDeviceLink(pdeviceHead);pdeviceHead  addRestaurantLightToDeviceLink(pdeviceHead);pdeviceHead  addFireToDeviceLink(pdeviceHead);  //火灾pCommandHead  addvoiceContrlToInputCommandLink(pCommandHead); //串口while(1){printf(Input:\n);scanf(%s,name);tmp  findDeviceByName(name,pdeviceHead);if(tmp ! NULL){tmp-deviceInit(tmp-pinNum);tmp-open(tmp-pinNum);}}
} 
4.把上述的代码传到树莓派的终端用FileZilla传即可然后执行结果 gcc mainPro.c upstairLight.c bathroomLight.c fire.c livingroomLight.c restaurantLight.c voiceContrl.c -lwiringPi -o test1