├── 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 |
--------------------------------------------------------------------------------