├── README.md ├── bluetooth_test.py ├── function_test.h ├── test.py ├── arduino_control.ino └── voice.h /README.md: -------------------------------------------------------------------------------- 1 | ### smart_home_sysytem 2 | 树莓派和Arduino人脸识别门禁,主要文件结构 3 | 4 | * 树莓派人脸识别控制部分 test.py 5 | * 树莓派蓝牙控制 bluetooth_test.py 6 | 7 | * Arduino舵机控制代码 arduino_control.ino 8 | * 语音播报库voice.h 9 | * 功能函数function_test.h 10 | 11 | 12 | 13 | [人脸识别视频演示效果传送门](https://www.bilibili.com/video/av91541332/) 14 | 15 | [人脸识别教程视频传送门](https://www.bilibili.com/video/bv1U741127yV) 16 | 17 | [项目整体效果演示传送门](https://www.bilibili.com/video/BV19a4y1x7q7/) 18 | 19 | 如果有疑问可以私信联系我:公众号:小雨编程 20 | 21 | 22 | 23 | ---- 24 | 25 | -------------------------------------------------------------------------------- /bluetooth_test.py: -------------------------------------------------------------------------------- 1 | import bluetooth 2 | 3 | def servo_init():#初始化指令 4 | bd_addr = "20:16:08:08:39:75" #arduino连接的蓝牙模块的地址 5 | port = 1 6 | 7 | sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) 8 | sock.connect((bd_addr, port)) #创建连接 9 | 10 | sock.send("1") #发送数据 11 | sock.close() #关闭连接 12 | 13 | def bt_open():#开门指令 14 | bd_addr = "20:16:08:08:39:75" 15 | port = 1 16 | 17 | sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) 18 | sock.connect((bd_addr, port)) 19 | 20 | sock.send("2") 21 | sock.close() 22 | 23 | def bt_close():#关门指令 24 | bd_addr = "20:16:08:08:39:75" 25 | port = 1 26 | 27 | sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) 28 | sock.connect((bd_addr, port)) 29 | 30 | sock.send("3") 31 | sock.close() 32 | -------------------------------------------------------------------------------- /function_test.h: -------------------------------------------------------------------------------- 1 | # include 2 | 3 | Servo myservo; //门舵机 4 | Servo windowservo; //窗户舵机 5 | 6 | int tick = 0; //计数值 7 | int smokepin = 2; //烟雾报警器 8 | int fanpin = 6; //净化器 9 | int fengminqipin = 7;//蜂鸣器 10 | int myledPin = 8; // 客厅灯 11 | int servopin = 9; //门servo舵机 12 | int hotwaterpin = 10;//热水器 13 | int pwmpin =11; //卧室灯 14 | int windowservopin = 12; //窗servo舵机 15 | 16 | 17 | 18 | //蜂鸣器 19 | void fengmingqi_open() 20 | { 21 | digitalWrite(fengminqipin,HIGH); 22 | speak_smoke();//检测到烟雾 23 | } 24 | 25 | void fengmingqi_close() 26 | { 27 | digitalWrite(fengminqipin,LOW); 28 | } 29 | 30 | //客厅灯 31 | void myled_open() 32 | { 33 | digitalWrite(myledPin, HIGH); 34 | speak_open_sittingroom(); 35 | } 36 | 37 | void myled_close() 38 | { 39 | digitalWrite(myledPin, LOW); 40 | speak_close_sittingroom() ; 41 | } 42 | 43 | //热水器 44 | void hotwater_open() 45 | { 46 | digitalWrite(hotwaterpin,HIGH); 47 | speak_open_hotwater(); 48 | } 49 | 50 | void hotwater_close() 51 | { 52 | digitalWrite(hotwaterpin,LOW); 53 | speak_close_hotwater(); 54 | } 55 | 56 | //净化器风扇高电平触发 57 | void fan_open(){ 58 | digitalWrite(fanpin,HIGH); 59 | } 60 | 61 | void fan_close(){ 62 | digitalWrite(fanpin,LOW); 63 | } 64 | 65 | //门舵机 66 | void servo_init(){ 67 | myservo.write(10); 68 | } 69 | 70 | void open_the_door(){ 71 | myservo.write(90); 72 | speak_open_door(); 73 | } 74 | 75 | void close_the_door(){ 76 | myservo.write(0); 77 | speak_close_door(); 78 | } 79 | 80 | //窗户舵机 81 | void window_init(){ 82 | windowservo.write(10); 83 | } 84 | 85 | void window_open(){ 86 | windowservo.write(170); 87 | speak_open_window(); 88 | } 89 | 90 | void window_close(){ 91 | windowservo.write(0); 92 | speak_close_window(); 93 | } 94 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | from aip import AipFace 2 | from picamera import PiCamera 3 | import urllib.request 4 | import RPi.GPIO as GPIO 5 | import base64 6 | import time 7 | import bluetooth 8 | 9 | from bluetooth_test import bt_open,servo_init,bt_close 10 | 11 | 12 | #百度人脸识别API账号信息 13 | APP_ID = '18332624' 14 | API_KEY = '2QoqxCzAsZGT9k5CMeaIlPBs' 15 | SECRET_KEY ='9wOlqd4sPvLc7ZKtLxMlBVkcikXHZ4rz' 16 | client = AipFace(APP_ID, API_KEY, SECRET_KEY)#创建一个客户端用以访问百度云 17 | #图像编码方式 18 | IMAGE_TYPE='BASE64' 19 | camera = PiCamera()#定义一个摄像头对象 20 | #用户组 21 | GROUP = 'yusheng01' 22 | 23 | #照相函数 24 | def getimage(): 25 | camera.resolution = (1024,768)#摄像界面为1024*768 26 | camera.start_preview()#开始摄像 27 | time.sleep(2) 28 | camera.capture('faceimage.jpg')#拍照并保存 29 | time.sleep(2) 30 | #对图片的格式进行转换 31 | def transimage(): 32 | f = open('faceimage.jpg','rb') 33 | img = base64.b64encode(f.read()) 34 | return img 35 | #上传到百度api进行人脸检测 36 | def go_api(image): 37 | result = client.search(str(image, 'utf-8'), IMAGE_TYPE, GROUP);#在百度云人脸库中寻找有没有匹配的人脸 38 | if result['error_msg'] == 'SUCCESS':#如果成功了 39 | name = result['result']['user_list'][0]['user_id']#获取名字 40 | score = result['result']['user_list'][0]['score']#获取相似度 41 | if score > 80:#如果相似度大于80 42 | if name == 'yin_danli': 43 | print("欢迎%s !" % name) 44 | time.sleep(1) 45 | if name == 'danli': 46 | print("欢迎%s !" % name) 47 | time.sleep(3) 48 | if name == "yusheng_02": 49 | print("欢迎%s !" % name) 50 | time.sleep(3) 51 | if name == "tanwenjie": 52 | print("欢迎%s !" % name) 53 | 54 | else: 55 | print("对不起,我不认识你!") 56 | name = 'Unknow' 57 | return 0 58 | curren_time = time.asctime(time.localtime(time.time()))#获取当前时间 59 | 60 | #将人员出入的记录保存到Log.txt中 61 | f = open('Log.txt','a') 62 | f.write("Person: " + name + " " + "Time:" + str(curren_time)+'\n') 63 | f.close() 64 | return 1 65 | if result['error_msg'] == 'pic not has face': 66 | print('检测不到人脸') 67 | time.sleep(3) 68 | return -1 69 | else: 70 | print(result['error_code']+' ' + result['error_code']) 71 | return 0 72 | #主函数 73 | if __name__ == '__main__': 74 | servo_init() #舵机复位,初始化一次就够了 75 | while True: 76 | 77 | print('准备开始,请面向摄像头 ^_^') 78 | 79 | if True: 80 | getimage()#拍照 81 | img = transimage() #转换照片格式 82 | res = go_api(img) #将转换了格式的图片上传到百度云 83 | if(res == 1): #是人脸库中的人 84 | bt_open() 85 | print("欢迎回家,门已打开") 86 | elif(res == -1): 87 | print("我没有看见你,我要关门了") 88 | time.sleep(3) 89 | bt_close() 90 | else: 91 | print("关门") 92 | bt_close() 93 | time.sleep(3) 94 | print('好了') 95 | time.sleep(5) 96 | 97 | -------------------------------------------------------------------------------- /arduino_control.ino: -------------------------------------------------------------------------------- 1 | /************************************************************** 2 | 3 | Name: Gizwits + ArduinoUno + raspiberry_bluetooth 4 | Author: danli 5 | Version: V1.0 6 | Init: 2016-12-23 7 | Modify: 2020-04-10 8 | ****************************************************************/ 9 | #include //Arduino库 10 | #include //机智云库 11 | #include 12 | #include //软串口 13 | #include //舵机 14 | #include //温湿度 15 | #include //OLED 16 | #ifdef U8X8_HAVE_HW_SPI 17 | #include 18 | #endif 19 | 20 | #include "voice.h"//语音播报 21 | #include "function_test.h" //功能函数 22 | SoftwareSerial mySerial(13,4); //给蓝牙HC-05使用的串口,RX ,TX = 13,4 23 | 24 | //Servo myservo; //控制门的舵机 25 | //Servo windowservo; //控制窗户的舵机 26 | Gizwits myGizwits; 27 | dht11 DHT11; 28 | int pos = 0; // 初始化舵机位置 29 | //int smokepin = 2; //烟雾报警器 30 | //int fanpin = 6; //净化器 31 | //int fengminqipin = 7;//蜂鸣器 32 | //int myledPin = 8; // 客厅灯 33 | //int servopin = 9; //门servo舵机 34 | //int windowservopin = 12; //窗servo舵机 35 | //int hotwaterpin = 10;//热水器 36 | //int pwmpin =11; //卧室灯 37 | 38 | 39 | 40 | bool varR_LED_OnOff = 0; 41 | bool varR_jinghuaqi = 0; 42 | 43 | #define KEY1 6 44 | #define KEY2 7 45 | #define KEY1_SHORT_PRESS 1 46 | #define KEY1_LONG_PRESS 2 47 | #define KEY2_SHORT_PRESS 4 48 | #define KEY2_LONG_PRESS 8 49 | #define NO_KEY 0 50 | #define KEY_LONG_TIMER 3 51 | 52 | #define DHT11PIN A0 //读取A0温湿度 53 | 54 | U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); 55 | //int flag =0; 56 | unsigned long Last_KeyTime = 0; 57 | 58 | unsigned long gokit_time_s(void) 59 | { 60 | return millis() / 1000; 61 | } 62 | 63 | //温湿度传感器 64 | double Fahrenheit(double celsius) 65 | { 66 | return 1.8 * celsius + 32; 67 | } //摄氏温度度转化为华氏温度 68 | 69 | double Kelvin(double celsius) 70 | { 71 | return celsius + 273.15; 72 | } //摄氏温度转化为开氏温度 73 | 74 | // 露点(点在此温度时,空气饱和并产生露珠) 75 | // 参考: http://wahiduddin.net/calc/density_algorithms.htm 76 | double dewPoint(double celsius, double humidity) 77 | { 78 | double A0= 373.15/(273.15 + celsius); 79 | double SUM = -7.90298 * (A0-1); 80 | SUM += 5.02808 * log10(A0); 81 | SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; 82 | SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; 83 | SUM += log10(1013.246); 84 | double VP = pow(10, SUM-3) * humidity; 85 | double T = log(VP/0.61078); // temp var 86 | return (241.88 * T) / (17.558-T); 87 | } 88 | 89 | // 快速计算露点,速度是5倍dewPoint() 90 | // 参考: http://en.wikipedia.org/wiki/Dew_point 91 | double dewPointFast(double celsius, double humidity) 92 | { 93 | double a = 17.271; 94 | double b = 237.7; 95 | double temp = (a * celsius) / (b + celsius) + log(humidity/100); 96 | double Td = (b * temp) / (a - temp); 97 | return Td; 98 | } 99 | 100 | //初始化 101 | void setup() { 102 | Serial.begin(9600); //esp-8266 103 | mySerial.begin(9600); // hc-05 104 | myservo.attach(servopin); //门舵机控制9 105 | myservo.write(0); //初始化门舵机 106 | windowservo.attach(windowservopin); //窗户舵机控制12 107 | windowservo.write(0); 108 | pinMode(KEY1, INPUT_PULLUP); 109 | pinMode(KEY2, INPUT_PULLUP); 110 | pinMode(A0,INPUT);//A0 温湿度传感器 111 | pinMode(smokepin,INPUT);//2 火灾报警 112 | pinMode(fanpin,OUTPUT);//6 净化器 113 | pinMode(fengminqipin,OUTPUT);//7 蜂鸣器 114 | pinMode(myledPin,OUTPUT);// 8 客厅灯 115 | pinMode(hotwaterpin,OUTPUT);//10 热水器 116 | pinMode(pwmpin,OUTPUT);//11 卧室灯 117 | myGizwits.begin(); 118 | begin(); 119 | } 120 | 121 | //OLED显示 122 | void begin () 123 | { 124 | u8x8.begin(); 125 | u8x8.setPowerSave(0); 126 | u8x8.setFont(u8x8_font_chroma48medium8_r); 127 | u8x8.drawString(3,1,"SMART-HOME"); 128 | u8x8.drawString(0,2,"Temp :"); 129 | u8x8.drawString(0,3,"Hum :"); 130 | u8x8.drawString(0,4,"Pwm :"); 131 | u8x8.drawString(0,5,"Fire :"); 132 | u8x8.drawString(0,6,"Danli's Home"); 133 | } 134 | 135 | //Wifi配网 136 | void wifiStatusHandle() 137 | { 138 | if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER)){} 139 | } 140 | 141 | int ketingdeng=1; 142 | int reshuiqi=1; 143 | int jinghuaqi=1; 144 | int chuang=1; 145 | //主函数 146 | void loop() { 147 | 148 | while(mySerial.available()) //如果串口可用 149 | { char c; 150 | c=mySerial.read(); 151 | mySerial.println (c); 152 | switch(c){ 153 | case '1':servo_init(); 154 | break; 155 | case '2':open_the_door(); 156 | break; 157 | case '3':close_the_door(); 158 | break; 159 | } 160 | } 161 | 162 | //烟雾报警 163 | unsigned long varW_fire = 0; 164 | if(digitalRead(smokepin))//安全是高电平 165 | { 166 | u8x8.setCursor(6,5); 167 | u8x8.print("Safe"); 168 | fengmingqi_close(); 169 | attachInterrupt(digitalPinToInterrupt(2), fan_open,CHANGE); //中断函数 170 | } 171 | else 172 | { 173 | u8x8.setCursor(6,5); 174 | u8x8.print("Fire"); 175 | fengmingqi_open(); 176 | attachInterrupt(digitalPinToInterrupt(2), fan_close,CHANGE); //中断函数 177 | delay(1000); 178 | fengmingqi_close(); 179 | } 180 | 181 | //温湿度OLED显示 182 | int chk = DHT11.read(DHT11PIN); 183 | unsigned long varW_wendu = (float)DHT11.temperature ; 184 | u8x8.setCursor(6,2);//这里设置显示的坐标 185 | u8x8.print(varW_wendu);//输出显示内容 186 | myGizwits.write(VALUE_wendu, varW_wendu); 187 | 188 | unsigned long varW_shidu = (float)DHT11.humidity ; 189 | u8x8.setCursor(6,3);//这里设置显示的坐标 190 | u8x8.print(varW_shidu);//输出显示内容 191 | myGizwits.write(VALUE_shidu, varW_shidu); 192 | 193 | //客厅灯 194 | if(myGizwits.hasBeenSet(EVENT_LED_OnOff)) 195 | { 196 | myGizwits.read(EVENT_LED_OnOff,&varR_LED_OnOff); 197 | if(ketingdeng==varR_LED_OnOff) 198 | { 199 | if(varR_LED_OnOff==1) 200 | { 201 | myled_open(); 202 | } 203 | else 204 | { 205 | myled_close(); 206 | } 207 | ketingdeng=!varR_LED_OnOff; 208 | } 209 | } 210 | 211 | 212 | //卧室灯 213 | unsigned long varR_tiaoguang = 0; 214 | if(myGizwits.hasBeenSet(EVENT_tiaoguang)) 215 | { 216 | myGizwits.read(EVENT_tiaoguang,&varR_tiaoguang);//读取pwm值 217 | analogWrite(pwmpin,varR_tiaoguang); //把读取的值写入机智云中间变量 218 | u8x8.setCursor(6,4);//这里设置显示的坐标 219 | u8x8.print(varR_tiaoguang);//输出显示内容 220 | } 221 | 222 | 223 | //热水器 224 | bool varR_reshuiqi = 0; 225 | if(myGizwits.hasBeenSet(EVENT_reshiuqi)) 226 | { 227 | myGizwits.read(EVENT_reshiuqi,&varR_reshuiqi);//Address for storing data 228 | if(reshuiqi==varR_reshuiqi) 229 | { 230 | if(varR_reshuiqi==1) 231 | { 232 | hotwater_open(); 233 | } 234 | else 235 | { 236 | hotwater_close(); 237 | } 238 | reshuiqi=!varR_reshuiqi; 239 | } 240 | } 241 | 242 | //净化器 243 | if(myGizwits.hasBeenSet(EVENT_jinhuaqi)) 244 | { 245 | myGizwits.read(EVENT_jinhuaqi,&varR_jinghuaqi); 246 | if(jinghuaqi==varR_jinghuaqi) 247 | { 248 | if(varR_jinghuaqi==1) 249 | { 250 | fan_open(); 251 | speak_open_fan(); 252 | } 253 | else 254 | { 255 | fan_close(); 256 | speak_close_fan(); 257 | } 258 | jinghuaqi=!varR_jinghuaqi; 259 | } 260 | } 261 | 262 | //窗户 263 | bool varR_chuang = 0; 264 | if(myGizwits.hasBeenSet(EVENT_chuang))//窗户 265 | { 266 | myGizwits.read(EVENT_chuang,&varR_chuang); 267 | if(chuang==varR_chuang) 268 | { 269 | if(varR_chuang==1) 270 | { 271 | window_open(); 272 | } 273 | else 274 | { 275 | window_close(); 276 | } 277 | chuang=!varR_chuang; 278 | } 279 | 280 | } 281 | 282 | wifiStatusHandle();//WIFI Status Handle 283 | myGizwits.process(); 284 | } 285 | -------------------------------------------------------------------------------- /voice.h: -------------------------------------------------------------------------------- 1 | void speak_open_door(){//欢迎回家,门已打开 2 | unsigned char i = 0; 3 | unsigned char head[35]; 4 | 5 | head[0] = 0xFD; 6 | head[1] = 0x00; 7 | head[2] = 0x20; 8 | head[3] = 0x01; 9 | head[4] = 0x00; 10 | head[5] = 0x5B; 11 | head[6] = 0x6D; 12 | head[7] = 0x31; 13 | head[8] = 0x5D; 14 | head[9] = 0x5B; 15 | head[10] = 0x76; 16 | head[11] = 0x31; 17 | head[12] = 0x30; 18 | head[13] = 0x5D; 19 | head[14] = 0x5B; 20 | head[15] = 0x74; 21 | head[16] = 0x35; 22 | head[17] = 0x5D; 23 | head[18] = 0xBB; 24 | head[19] = 0xB6; 25 | head[20] = 0xD3; 26 | head[21] = 0xAD; 27 | head[22] = 0xBB; 28 | head[23] = 0xD8; 29 | head[24] = 0xBC; 30 | head[25] = 0xD2; 31 | head[26] = 0xC3; 32 | head[27] = 0xC5; 33 | head[28] = 0xD2; 34 | head[29] = 0xD1; 35 | head[30] = 0xB4; 36 | head[31] = 0xF2; 37 | head[32] = 0xBF; 38 | head[33] = 0xAA; 39 | head[34] = 0x98; 40 | 41 | for(i=0; i<35; i++){ 42 | Serial.write(head[i]); 43 | } 44 | } 45 | 46 | void speak_close_door(){//门已关闭 47 | unsigned char i = 0; 48 | unsigned char head[27]; 49 | 50 | head[0] = 0xFD; 51 | head[1] = 0x00; 52 | head[2] = 0x18; 53 | head[3] = 0x01; 54 | head[4] = 0x00; 55 | head[5] = 0x5B; 56 | head[6] = 0x6D; 57 | head[7] = 0x31; 58 | head[8] = 0x5D; 59 | head[9] = 0x5B; 60 | head[10] = 0x76; 61 | head[11] = 0x31; 62 | head[12] = 0x30; 63 | head[13] = 0x5D; 64 | head[14] = 0x5B; 65 | head[15] = 0x74; 66 | head[16] = 0x35; 67 | head[17] = 0x5D; 68 | head[18] = 0xC3; 69 | head[19] = 0xC5; 70 | head[20] = 0xD2; 71 | head[21] = 0xD1; 72 | head[22] = 0xB9; 73 | head[23] = 0xD8; 74 | head[24] = 0xB1; 75 | head[25] = 0xD5; 76 | head[26] = 0x88; 77 | 78 | for(i=0; i<27; i++){ 79 | Serial.write(head[i]); 80 | } 81 | } 82 | 83 | void speak_smoke(){ //检测到烟雾 84 | unsigned char i = 0; 85 | unsigned char head[28]; 86 | 87 | head[0] = 0xFD; 88 | head[1] = 0x00; 89 | head[2] = 0x19; 90 | head[3] = 0x01; 91 | head[4] = 0x00; 92 | head[5] = 0x5B; 93 | head[6] = 0x6D; 94 | head[7] = 0x31; 95 | head[8] = 0x5D; 96 | head[9] = 0x5B; 97 | head[10] = 0x76; 98 | head[11] = 0x35; 99 | head[12] = 0x5D; 100 | head[13] = 0x5B; 101 | head[14] = 0x74; 102 | head[15] = 0x35; 103 | head[16] = 0x5D; 104 | head[17] = 0xBC; 105 | head[18] = 0xEC; 106 | head[19] = 0xB2; 107 | head[20] = 0xE2; 108 | head[21] = 0xB5; 109 | head[22] = 0xBD; 110 | head[23] = 0xD1; 111 | head[24] = 0xCC; 112 | head[25] = 0xCE; 113 | head[26] = 0xED; 114 | head[27] = 0x8B; 115 | 116 | for(i=0; i<28; i++){ 117 | Serial.write(head[i]); 118 | } 119 | } 120 | 121 | void speak_smoke_close(){//警报已解除 122 | unsigned char i = 0; 123 | unsigned char head[29]; 124 | 125 | head[0] = 0xFD; 126 | head[1] = 0x00; 127 | head[2] = 0x1A; 128 | head[3] = 0x01; 129 | head[4] = 0x00; 130 | head[5] = 0x5B; 131 | head[6] = 0x6D; 132 | head[7] = 0x31; 133 | head[8] = 0x5D; 134 | head[9] = 0x5B; 135 | head[10] = 0x76; 136 | head[11] = 0x31; 137 | head[12] = 0x30; 138 | head[13] = 0x5D; 139 | head[14] = 0x5B; 140 | head[15] = 0x74; 141 | head[16] = 0x35; 142 | head[17] = 0x5D; 143 | head[18] = 0xBE; 144 | head[19] = 0xAF; 145 | head[20] = 0xB1; 146 | head[21] = 0xA8; 147 | head[22] = 0xD2; 148 | head[23] = 0xD1; 149 | head[24] = 0xBD; 150 | head[25] = 0xE2; 151 | head[26] = 0xB3; 152 | head[27] = 0xFD; 153 | head[28] = 0x90; 154 | 155 | for(i=0; i<29; i++){ 156 | Serial.write(head[i]); 157 | } 158 | } 159 | 160 | void speak_open_sittingroom(){//客厅灯已打开 161 | unsigned char i = 0; 162 | unsigned char head[31]; 163 | 164 | head[0] = 0xFD; 165 | head[1] = 0x00; 166 | head[2] = 0x1C; 167 | head[3] = 0x01; 168 | head[4] = 0x00; 169 | head[5] = 0x5B; 170 | head[6] = 0x6D; 171 | head[7] = 0x31; 172 | head[8] = 0x5D; 173 | head[9] = 0x5B; 174 | head[10] = 0x76; 175 | head[11] = 0x31; 176 | head[12] = 0x30; 177 | head[13] = 0x5D; 178 | head[14] = 0x5B; 179 | head[15] = 0x74; 180 | head[16] = 0x35; 181 | head[17] = 0x5D; 182 | head[18] = 0xBF; 183 | head[19] = 0xCD; 184 | head[20] = 0xCC; 185 | head[21] = 0xFC; 186 | head[22] = 0xB5; 187 | head[23] = 0xC6; 188 | head[24] = 0xD2; 189 | head[25] = 0xD1; 190 | head[26] = 0xB4; 191 | head[27] = 0xF2; 192 | head[28] = 0xBF; 193 | head[29] = 0xAA; 194 | head[30] = 0xED; 195 | 196 | for(i=0; i<31; i++){ 197 | Serial.write(head[i]); 198 | } 199 | 200 | } 201 | 202 | void speak_close_sittingroom(){//客厅灯已关闭 203 | unsigned char i = 0; 204 | unsigned char head[31]; 205 | 206 | head[0] = 0xFD; 207 | head[1] = 0x00; 208 | head[2] = 0x1C; 209 | head[3] = 0x01; 210 | head[4] = 0x00; 211 | head[5] = 0x5B; 212 | head[6] = 0x6D; 213 | head[7] = 0x31; 214 | head[8] = 0x5D; 215 | head[9] = 0x5B; 216 | head[10] = 0x76; 217 | head[11] = 0x31; 218 | head[12] = 0x30; 219 | head[13] = 0x5D; 220 | head[14] = 0x5B; 221 | head[15] = 0x74; 222 | head[16] = 0x35; 223 | head[17] = 0x5D; 224 | head[18] = 0xBF; 225 | head[19] = 0xCD; 226 | head[20] = 0xCC; 227 | head[21] = 0xFC; 228 | head[22] = 0xB5; 229 | head[23] = 0xC6; 230 | head[24] = 0xD2; 231 | head[25] = 0xD1; 232 | head[26] = 0xB9; 233 | head[27] = 0xD8; 234 | head[28] = 0xB1; 235 | head[29] = 0xD5; 236 | head[30] = 0xBB; 237 | 238 | for(i=0; i<31; i++){ 239 | Serial.write(head[i]); 240 | } 241 | } 242 | 243 | void speak_open_bedroom(){//卧室灯已打开 244 | unsigned char i = 0; 245 | unsigned char head[31]; 246 | 247 | head[0] = 0xFD; 248 | head[1] = 0x00; 249 | head[2] = 0x1C; 250 | head[3] = 0x01; 251 | head[4] = 0x00; 252 | head[5] = 0x5B; 253 | head[6] = 0x6D; 254 | head[7] = 0x31; 255 | head[8] = 0x5D; 256 | head[9] = 0x5B; 257 | head[10] = 0x76; 258 | head[11] = 0x31; 259 | head[12] = 0x30; 260 | head[13] = 0x5D; 261 | head[14] = 0x5B; 262 | head[15] = 0x74; 263 | head[16] = 0x35; 264 | head[17] = 0x5D; 265 | head[18] = 0xCE; 266 | head[19] = 0xD4; 267 | head[20] = 0xCA; 268 | head[21] = 0xD2; 269 | head[22] = 0xB5; 270 | head[23] = 0xC6; 271 | head[24] = 0xD2; 272 | head[25] = 0xD1; 273 | head[26] = 0xB4; 274 | head[27] = 0xF2; 275 | head[28] = 0xBF; 276 | head[29] = 0xAA; 277 | head[30] = 0xAD; 278 | 279 | for(i=0; i<31; i++){ 280 | Serial.write(head[i]); 281 | } 282 | } 283 | 284 | void speak_close_bedroom(){//卧室灯已关闭 285 | unsigned char i = 0; 286 | unsigned char head[31]; 287 | 288 | head[0] = 0xFD; 289 | head[1] = 0x00; 290 | head[2] = 0x1C; 291 | head[3] = 0x01; 292 | head[4] = 0x00; 293 | head[5] = 0x5B; 294 | head[6] = 0x6D; 295 | head[7] = 0x31; 296 | head[8] = 0x5D; 297 | head[9] = 0x5B; 298 | head[10] = 0x76; 299 | head[11] = 0x31; 300 | head[12] = 0x30; 301 | head[13] = 0x5D; 302 | head[14] = 0x5B; 303 | head[15] = 0x74; 304 | head[16] = 0x35; 305 | head[17] = 0x5D; 306 | head[18] = 0xCE; 307 | head[19] = 0xD4; 308 | head[20] = 0xCA; 309 | head[21] = 0xD2; 310 | head[22] = 0xB5; 311 | head[23] = 0xC6; 312 | head[24] = 0xD2; 313 | head[25] = 0xD1; 314 | head[26] = 0xB9; 315 | head[27] = 0xD8; 316 | head[28] = 0xB1; 317 | head[29] = 0xD5; 318 | head[30] = 0xFB; 319 | 320 | for(i=0; i<31; i++){ 321 | Serial.write(head[i]); 322 | } 323 | } 324 | 325 | void speak_open_hotwater(){//热水器已打开 326 | unsigned char i = 0; 327 | unsigned char head[31]; 328 | 329 | head[0] = 0xFD; 330 | head[1] = 0x00; 331 | head[2] = 0x1C; 332 | head[3] = 0x01; 333 | head[4] = 0x00; 334 | head[5] = 0x5B; 335 | head[6] = 0x6D; 336 | head[7] = 0x31; 337 | head[8] = 0x5D; 338 | head[9] = 0x5B; 339 | head[10] = 0x76; 340 | head[11] = 0x31; 341 | head[12] = 0x30; 342 | head[13] = 0x5D; 343 | head[14] = 0x5B; 344 | head[15] = 0x74; 345 | head[16] = 0x35; 346 | head[17] = 0x5D; 347 | head[18] = 0xC8; 348 | head[19] = 0xC8; 349 | head[20] = 0xCB; 350 | head[21] = 0xAE; 351 | head[22] = 0xC6; 352 | head[23] = 0xF7; 353 | head[24] = 0xD2; 354 | head[25] = 0xD1; 355 | head[26] = 0xB4; 356 | head[27] = 0xF2; 357 | head[28] = 0xBF; 358 | head[29] = 0xAA; 359 | head[30] = 0x88; 360 | 361 | for(i=0; i<31; i++){ 362 | Serial.write(head[i]); 363 | } 364 | } 365 | 366 | void speak_close_hotwater(){//热水器已关闭 367 | unsigned char i = 0; 368 | unsigned char head[31]; 369 | 370 | head[0] = 0xFD; 371 | head[1] = 0x00; 372 | head[2] = 0x1C; 373 | head[3] = 0x01; 374 | head[4] = 0x00; 375 | head[5] = 0x5B; 376 | head[6] = 0x6D; 377 | head[7] = 0x31; 378 | head[8] = 0x5D; 379 | head[9] = 0x5B; 380 | head[10] = 0x76; 381 | head[11] = 0x31; 382 | head[12] = 0x30; 383 | head[13] = 0x5D; 384 | head[14] = 0x5B; 385 | head[15] = 0x74; 386 | head[16] = 0x35; 387 | head[17] = 0x5D; 388 | head[18] = 0xC8; 389 | head[19] = 0xC8; 390 | head[20] = 0xCB; 391 | head[21] = 0xAE; 392 | head[22] = 0xC6; 393 | head[23] = 0xF7; 394 | head[24] = 0xD2; 395 | head[25] = 0xD1; 396 | head[26] = 0xB9; 397 | head[27] = 0xD8; 398 | head[28] = 0xB1; 399 | head[29] = 0xD5; 400 | head[30] = 0xDE; 401 | 402 | for(i=0; i<31; i++){ 403 | Serial.write(head[i]); 404 | } 405 | } 406 | 407 | void speak_open_fan(){//净化器已打开 408 | unsigned char i = 0; 409 | unsigned char head[31]; 410 | 411 | head[0] = 0xFD; 412 | head[1] = 0x00; 413 | head[2] = 0x1C; 414 | head[3] = 0x01; 415 | head[4] = 0x00; 416 | head[5] = 0x5B; 417 | head[6] = 0x6D; 418 | head[7] = 0x31; 419 | head[8] = 0x5D; 420 | head[9] = 0x5B; 421 | head[10] = 0x76; 422 | head[11] = 0x31; 423 | head[12] = 0x30; 424 | head[13] = 0x5D; 425 | head[14] = 0x5B; 426 | head[15] = 0x74; 427 | head[16] = 0x35; 428 | head[17] = 0x5D; 429 | head[18] = 0xBE; 430 | head[19] = 0xBB; 431 | head[20] = 0xBB; 432 | head[21] = 0xAF; 433 | head[22] = 0xC6; 434 | head[23] = 0xF7; 435 | head[24] = 0xD2; 436 | head[25] = 0xD1; 437 | head[26] = 0xB4; 438 | head[27] = 0xF2; 439 | head[28] = 0xBF; 440 | head[29] = 0xAA; 441 | head[30] = 0xFC; 442 | 443 | for(i=0; i<31; i++){ 444 | Serial.write(head[i]); 445 | } 446 | } 447 | 448 | void speak_close_fan(){//净化器已关闭 449 | unsigned char i = 0; 450 | unsigned char head[31]; 451 | 452 | head[0] = 0xFD; 453 | head[1] = 0x00; 454 | head[2] = 0x1C; 455 | head[3] = 0x01; 456 | head[4] = 0x00; 457 | head[5] = 0x5B; 458 | head[6] = 0x6D; 459 | head[7] = 0x31; 460 | head[8] = 0x5D; 461 | head[9] = 0x5B; 462 | head[10] = 0x76; 463 | head[11] = 0x31; 464 | head[12] = 0x30; 465 | head[13] = 0x5D; 466 | head[14] = 0x5B; 467 | head[15] = 0x74; 468 | head[16] = 0x35; 469 | head[17] = 0x5D; 470 | head[18] = 0xBE; 471 | head[19] = 0xBB; 472 | head[20] = 0xBB; 473 | head[21] = 0xAF; 474 | head[22] = 0xC6; 475 | head[23] = 0xF7; 476 | head[24] = 0xD2; 477 | head[25] = 0xD1; 478 | head[26] = 0xB9; 479 | head[27] = 0xD8; 480 | head[28] = 0xB1; 481 | head[29] = 0xD5; 482 | head[30] = 0xAA; 483 | 484 | for(i=0; i<31; i++){ 485 | Serial.write(head[i]); 486 | } 487 | } 488 | 489 | //窗户 490 | void speak_open_window(){//窗户已打开 491 | unsigned char i = 0; 492 | unsigned char head[28]; 493 | 494 | head[0] = 0xFD; 495 | head[1] = 0x00; 496 | head[2] = 0x19; 497 | head[3] = 0x01; 498 | head[4] = 0x00; 499 | head[5] = 0x5B; 500 | head[6] = 0x6D; 501 | head[7] = 0x31; 502 | head[8] = 0x5D; 503 | head[9] = 0x5B; 504 | head[10] = 0x76; 505 | head[11] = 0x35; 506 | head[12] = 0x5D; 507 | head[13] = 0x5B; 508 | head[14] = 0x74; 509 | head[15] = 0x35; 510 | head[16] = 0x5D; 511 | head[17] = 0xB4; 512 | head[18] = 0xB0; 513 | head[19] = 0xBB; 514 | head[20] = 0xA7; 515 | head[21] = 0xD2; 516 | head[22] = 0xD1; 517 | head[23] = 0xB4; 518 | head[24] = 0xF2; 519 | head[25] = 0xBF; 520 | head[26] = 0xAA; 521 | head[27] = 0xF5; 522 | 523 | for(i=0; i<28; i++){ 524 | Serial.write(head[i]); 525 | } 526 | } 527 | 528 | void speak_close_window(){//窗户已关闭 529 | unsigned char i = 0; 530 | unsigned char head[28]; 531 | 532 | head[0] = 0xFD; 533 | head[1] = 0x00; 534 | head[2] = 0x19; 535 | head[3] = 0x01; 536 | head[4] = 0x00; 537 | head[5] = 0x5B; 538 | head[6] = 0x6D; 539 | head[7] = 0x31; 540 | head[8] = 0x5D; 541 | head[9] = 0x5B; 542 | head[10] = 0x76; 543 | head[11] = 0x35; 544 | head[12] = 0x5D; 545 | head[13] = 0x5B; 546 | head[14] = 0x74; 547 | head[15] = 0x35; 548 | head[16] = 0x5D; 549 | head[17] = 0xB4; 550 | head[18] = 0xB0; 551 | head[19] = 0xBB; 552 | head[20] = 0xA7; 553 | head[21] = 0xD2; 554 | head[22] = 0xD1; 555 | head[23] = 0xB9; 556 | head[24] = 0xD8; 557 | head[25] = 0xB1; 558 | head[26] = 0xD5; 559 | head[27] = 0xA3; 560 | 561 | for(i=0; i<28; i++){ 562 | Serial.write(head[i]); 563 | } 564 | } 565 | --------------------------------------------------------------------------------