家政服務(wù) 技術(shù)支持 東莞網(wǎng)站建設(shè)真正的免費建站在這里
目錄
一、智能家居項目框架設(shè)計草圖
二、框架代碼文件工程建立
三、添加聲音識別模塊的串口讀取功能
一、智能家居項目框架設(shè)計草圖
?代碼思路講解:
1、一個指令工廠,一個控制工廠,實際上就是通過鏈表鏈起來的數(shù)據(jù)。具體怎么鏈接起來,就是基于簡單工廠模式的類與對象的概念,上一篇文章有學(xué)習(xí)記錄。
2、主函數(shù)語音指令程序和tcp指令程序各起一個線程,然后通過指令名字找到對應(yīng)的控制程序,實現(xiàn)對應(yīng)的模塊的功能。
二、框架代碼文件工程建立
1、在桌面新建一個項目文件夾smartHose,然后在文件夾中創(chuàng)建如下文件:
2、把上述的所有文件,都加載到Source lnsight工具中,如下圖代表加載完畢
3、創(chuàng)建inputCommand.h頭文件
//面向指令工廠的頭文件
#include <wiringPi.h>
#include <stdlib.h>struct InputCommander{char commandName[128]; //名字char command[32]; //指令int (*Init)(char *name,char *ipAdress,char *port); //操作函數(shù) int (*getCommand)(char *cmd); //獲取數(shù)據(jù)函數(shù)char log[1024]; //log日志獲取struct InputCommander *next;
};
4、創(chuàng)建contrlDevices.h頭文件
//設(shè)備頭文件
#include <wiringPi.h>struct Devices{char deviceName[128]; //名字int status; //狀態(tài)int pinNum; //引腳int (*open)(int pinNum); //打開int (*close)(int pinNum); //關(guān)閉int (*deviceInit)(int pinNum); //設(shè)備初始化int (*readStatus)(); //火災(zāi)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、創(chuàng)建bathroomLight.c文件
//浴室的燈
#include "contrlDevices.h"
#include<stdlib.h>int 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、創(chuàng)建livingroomLight.c文件
#include "contrlDevices.h"
#include<stdlib.h>int 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、創(chuàng)建restaurantLight.c文件
#include "contrlDevices.h"
#include<stdlib.h>int 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、創(chuàng)建upstairLight.c文件
//二樓燈
#include "contrlDevices.h"
#include<stdlib.h>int 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、創(chuàng)建fire.c文件
//火災(zāi)報警
#include "contrlDevices.h"
#include<stdlib.h>int 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、創(chuàng)建mainPro.c主函數(shù)文件
#include <stdio.h>
#include "contrlDevices.h"
#include <string.h>
#include "inputCommand.h"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;}
};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、設(shè)備控制工廠初始化//3、線程池建立//3.1、語音線程//3.2、socket線程//3.3、攝像頭線程//3.4、火災(zāi)線程
}
把上述的代碼傳到樹莓派的終端,用FileZilla傳即可,然后執(zhí)行結(jié)果:
gcc mainPro.c upstairLight.c bathroomLight.c livingroomLight.c restaurantLight.c -lwiringPi -o test1
效果演示:(雖然沒有裝到實際的智能家居里,但是小燈亮了,說明程序是可以正常用的🤭)
三、添加聲音識別模塊的串口讀取功能
這里主要通過主控芯片樹莓派的串口跟語音模塊連接。
樹莓派的T接語音模塊的R
樹莓派的R接語音模塊的T
然后就是供電
我們先把語音模塊的代碼整合到指令鏈表當(dāng)中去:
1.語音控制設(shè)備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.控制設(shè)備的頭文件inputCommand.h
//面向指令工廠的頭文件
#include <wiringPi.h>
#include <stdlib.h>struct 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主函數(shù)中添加語音模塊的函數(shù)
#include <stdio.h>
#include "contrlDevices.h"
#include <string.h>
#include "inputCommand.h"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;}
};
int main(){char name [128];struct Devices *tmp = NULL;if(-1 == wiringPiSetup()){return -1;}struct Devices *pdeviceHead = NULL; //設(shè)備工廠struct InputCommander *pCommandHead = NULL; //指令工廠pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);pdeviceHead = addUpstairLightToDeviceLink(pdeviceHead);pdeviceHead = addLivingRoomLightToDeviceLink(pdeviceHead);pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);pdeviceHead = addFireToDeviceLink(pdeviceHead); //火災(zāi)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傳即可,然后執(zhí)行結(jié)果:
gcc mainPro.c upstairLight.c bathroomLight.c fire.c livingroomLight.c restaurantLight.c voiceContrl.c -lwiringPi -o test1