写在前面:本身是打算通过ESP8266直接做的,但是卡在了写APP那块,没时间再攻关了,就暂且只放上测试用的LED了。其他部分改变方向,采用LD3320进行语音控制,控制范围……大概半米,有一定的延迟,但是问题不大。显示终端采用LCD1602A,显示基础的提示词和输出传感器数值,用了官网的连接和代码例程,行数少简单,目前只能显示英文,不过也够用了。一块Arduino板的I/O口不够用就再加了一块,没有考虑如何级联,单纯的另一块做了些无需语音控制的其他功能。
列写一下清单:
注:两个Arduino板其实可以独立运行,拿掉另一个完全可以使用,其中一个板子包括:蜂鸣器、普通LED灯和电阻、ESP8266、人体红外传感器和RFID套件,剩下的属于另一个板子。
一、基于ESP8266手机APP控制普通LED灯
综合了网上诸多教程的结果,首先记录一下成功点亮LED的过程。
材料准备:
步骤:
先将ESP8266插在TTL转USB上,并且短接,通过串口调试助手灌输AT指令:
=====
AT+CWMODE=2
-设置模块模式,1.station模式,2.AP模式,3.station&AP模式(2,3都行)
OK
=====
AT+RST
-重启(使设置模式生效)
OK
=====
AT+CWMODE?
-查询当前模式(看看刚才设置的模式对了没)
+CWMODE:2
-对了,是模式2
OK
=====
AT+CWSAP="LZESP8266","0123456789",1,3
-设置模块的WIFI账号密码(过一会要用手机连接它),1指的是1信道,3指的是WPA2_PSK加密
OK
=====
AT+CIFSR
-查询模块的IP地址(手机控制时要远程连接的对象)
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"5e:cf:7f:f5:ef:8f"
OK
=====
AT+CIPMUX=1
-设置多路连接模式(为下一步开启服务器做准备)
OK
=====
AT+CIPSERVER=1,5000
-开启server,并设置端口号为5000(即控制时远程连接的对象需要添加此端口号)
OK
=====
全部成功之后把ESP8266连接到板子上,接线的话,对着ESP8266上的标识接就可以了,其中只需注意:EN要接3.3V,TX接RX,RX接TX(对于ESP8266来说,TX接4,RX接5)。
注:三个I/O口均可对应更改。
然后写入程序:
1 #include <SoftwareSerial.h>
2
3
4 #define WIFI_TX 5
5 #define WIFI_RX 4
6 #define LED 13
7 SoftwareSerial wifi(WIFI_RX, WIFI_TX); //RX, TX
8
9 String _comdata_wifi = "1"; //for incoming wifi serial data
10
11 void setup() {
12 pinMode(LED,OUTPUT);
13 digitalWrite(LED,LOW);
14 Serial.begin(9600);
15 wifi.begin(115200);
16 Serial.println("system is ready!");
17
18 wifi.println("AT+CWMODE=3\r\n");
19 delay(500);
20 wifi.println("AT+CIPMUX=1\r\n");
21 delay(500);
22 wifi.println("AT+CIPSERVER=1,5000\r\n");
23 delay(500);
24 }
25
26 void loop() {
27 getWifiSerialData();
28 if(Serial.available()){
29 String order = "";
30 while (Serial.available()){
31 char cc = (char)Serial.read();
32 order += cc;
33 delay(2);
34 }
35 order.trim();
36 wifi.println(order);
37 }
38 if(_comdata_wifi!=""){
39 Serial.println(_comdata_wifi);
40 Serial.println("\r\n");
41 // for(int a=0;a<_comdata_wifi.length();a++)
42 // {
43 // Serial.println(a);
44 // Serial.println(_comdata_wifi[a]);
45 // }
46 if((_comdata_wifi[2]==‘+‘)&&(_comdata_wifi[3]==‘I‘)&&(_comdata_wifi[4]==‘P‘))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭
47 {
48 if((_comdata_wifi[5]==‘D‘)&&(_comdata_wifi[8]==‘,‘))
49 {
50 if(_comdata_wifi[11]==‘0‘)
51 {
52 digitalWrite(LED,LOW);//0 灯灭
53 Serial.println("灯灭");
54 wifi.println("灯灭");
55 //wifi模块向pc端或手机端 发送"灯灭
56 }
57
58 else if (_comdata_wifi[11]==‘1‘)
59 {
60 digitalWrite(LED,HIGH); //1 灯亮
61 wifi.println("灯亮");
62 Serial.println("灯亮");
63 //wifi模块向pc端或手机端 发送"灯亮"
64 }
65 }
66 }
67
68 _comdata_wifi = String("");
69 }
70 }
71
72 void getWifiSerialData(){
73 while (wifi.available() > 0){
74 _comdata_wifi += char(wifi.read()); //get wifi data
75 delay(4);
76 }
77 }
代码网上找的。内容做了一点点修改,对着程序的端口对应插上硬件就可以了,然后手机装上一个APK,手机连接之前调试时设置的WIFI,然后在APP中连接局域网192.168.4.1:5000,就可以控制了。
二、RFID门禁系统
刷正确的卡,舵机旋转打开再关闭(绿灯亮),刷错误的卡,蜂鸣器报警(红灯亮)。
录入正确卡:直接刷卡,在串口监视器中可以看到卡号,将分段的卡号写入代码相应的位置。
材料准备:
步骤:
直接按照代码注释进行连线。
1 #include <SPI.h>
2 #include <RFID.h>
3 #include <Servo.h>
4 Servo myservo;
5 extern uint8_t SmallFont[];
6 RFID rfid(10,8); //D10--接上SDA、D8--接RST D13--接上SCK D11--接上MOSI D12--接上MISO RQ不接
7 unsigned char serNum[5];
8 int buzzer=7;//设置控制蜂鸣器的数字IO脚
9 int ledred = 5; //定义数字5 接口
10 int ledgreen = 3; //定义数字3 接口
11 void setup()
12 {
13 Serial.begin(9600);//串口用来读取需要添加的卡号,然后手动写到程序里
14 myservo.attach(9);//舵机针脚位9
15 myservo.write(0); //舵机初始化0度
16 SPI.begin();
17 rfid.init();
18 pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
19 pinMode(ledred, OUTPUT);//定义小灯接口为输出接口
20 pinMode(ledgreen, OUTPUT);//定义小灯接口为输出接口
21 }
22 void loop()
23 {
24 long randNumber = random(0, 20);
25 unsigned char i,tmp;
26 unsigned char status;
27 unsigned char str[MAX_LEN];
28 unsigned char RC_size;
29 //找卡
30 rfid.isCard();
31 //读卡号
32 if (rfid.readCardSerial())
33 {
34 Serial.print("your card id is : ");
35 Serial.print(rfid.serNum[0]);
36 Serial.print(" , ");
37 Serial.print(rfid.serNum[1],BIN);
38 Serial.print(" , ");
39 Serial.print(rfid.serNum[2],BIN);
40 Serial.print(" , ");
41 Serial.print(rfid.serNum[2],BIN);
42 Serial.print(" , ");
43 Serial.print(rfid.serNum[4],BIN);
44 Serial.println(" ");
45 //下面是改卡号区域
46 if(rfid.serNum[0]==134||rfid.serNum[1]==1111||rfid.serNum[2]==100101||rfid.serNum[3]==100101||rfid.serNum[4]==10101011)
47 {
48 digitalWrite(ledgreen, HIGH); //点亮小灯
49 delay(100);
50 digitalWrite(ledgreen, LOW); //熄灭小灯
51 delay(100);
52 Serial.println("Welcome back master!");
53 myservo.write(180);
54 delay(1000);
55 myservo.write(0);
56 Serial.println("door closed");
57 }
58 else
59 {
60 Serial.println("Wrong!");
61 digitalWrite(ledred, HIGH); //点亮小灯
62 delay(100);
63 digitalWrite(ledred, LOW); //熄灭小灯
64 delay(100);
65 unsigned char i,j;//定义变量
66 for(i=0;i<80;i++)//输出一个频率的声音
67 {
68 digitalWrite(buzzer,HIGH);//发声音
69 delay(1);//延时1ms
70 digitalWrite(buzzer,LOW);//不发声音
71 delay(1);//延时ms
72 }
73 for(i=0;i<100;i++)//输出另一个频率的声音
74 {
75 digitalWrite(buzzer,HIGH);//发声音
76 delay(2);//延时2ms
77 digitalWrite(buzzer,LOW);//不发声音
78 delay(2);//延时2ms
79 }
80 }
81 }
82 if (!rfid.readCardSerial()){
83 }
84 rfid.halt(); //休眠
85 }
三、1#板——语音控制
前面两部分代码只是局部代码,下面直接展示两块板子的整体代码,传感器和上面的局部重要代码已经嵌入进去了,注释齐全,对应连线即可。
在LD3320需要额外安装库,更改语音指令不止要在代码中修改,还要在库函数的两个文件中分别修改相应部分。
代码注释中的LCD1602均指LCD1602A。
控制例子
Welcome Home!
=====
-小白
-Listening(绿色指示灯亮起)
-开灯
-LED ON(小灯亮起)
-小白
-Listening(绿色指示灯亮起)
-关灯
-LED OFF(小灯关闭)
======
其他例子
======
-小布
-Call me xiao bai
-小白
-Listening(指示灯亮起)
-室内环境
-……
(几秒后)
-……
=====
故障例子
=====
(显示器乱码)
-小白
-%……&#¥@
-复位
-Welcome Home!
以下为代码:
1 //语音、小灯、指示灯、显示屏、温湿度传感器、窗帘、水位、复位
2 /*
3 xiao bai管家为您服务,请先呼叫xiao bai再执行相关命令。
4 可通过串口来查看执行结果
5 接线定义:
6 3.3V GND 选一组接就行
7 3V3--3.3V
8 GND--GND
9 SCK--A5
10 MI--A4
11 MO--A3
12 CS--A2
13 RST--D5
14 IRQ--D3
15 WR--GND
16 */
17 #include "LD3320.h"
18 #include <LiquidCrystal.h>
19 #include <dht11.h>
20 #include <Servo.h>
21
22 //定义自由接口
23 #define Listenled 6
24 #define Led 7
25
26 //温湿度
27 dht11 DHT11;
28 #define DHT11PIN A1
29
30 //窗帘(舵机)
31 Servo myservo;
32
33 //水位
34 double temp, data;
35
36 //定义LCD1602
37 //VSS-GND, VDD-5V,V0-2KΩ-GND,RS-12,RW-GND,E-11,[D0~D3- ],D4-10(5),D5-4,D6-9(3),D7-2,A-220Ω-5V,K-GND
38 const int rs = 12, en = 11, d4 = 10, d5 = 4, d6 = 9, d7 = 2;
39 LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
40
41 LD3320 WE;
42
43 u8 nAsrStatus=0;
44 u8 nAsrRes=0;
45 extern u8 ucRegVal;
46 u8 flag=0;
47
48
49 void setup() {
50 Serial.begin(9600);
51
52 //自由初始化
53 pinMode(Listenled,OUTPUT);
54 pinMode(Led,OUTPUT);
55
56 //LCD1602初始化
57 lcd.begin(16, 2);
58 lcd.print("Welcome Home!");
59
60 //窗帘(舵机)
61 myservo.attach(13);//舵机针脚位9
62 myservo.write(0); //舵机初始化0度
63
64 WE.LD3320_IO_Init();
65 WE.LD_Reset();
66 attachInterrupt(1, ProcessInt, FALLING);
67 nAsrStatus = LD_ASR_NONE; //初始状态:没有在作ASR
68 SCS_0;
69 Serial.println("欢迎回家\r\n");
70 }
71
72 void loop() {
73
74
75
76 switch(nAsrStatus)
77 {
78 case LD_ASR_RUNING:
79 case LD_ASR_ERROR:
80 break;
81 case LD_ASR_NONE:
82 {
83 nAsrStatus=LD_ASR_RUNING;
84 if (WE.RunASR()==0) /* 启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
85 {
86 nAsrStatus = LD_ASR_ERROR;
87 }
88 break;
89 }
90
91 case LD_ASR_FOUNDOK: /* 一次ASR识别流程结束,去取ASR识别结果*/
92 {
93 nAsrRes = WE.LD_GetResult(); /*获取结果*/
94 User_Modification(nAsrRes);
95 nAsrStatus = LD_ASR_NONE;
96 break;
97 }
98 case LD_ASR_FOUNDZERO:
99 default:
100 {
101 nAsrStatus = LD_ASR_NONE;
102 break;
103 }
104 }
105
106 }
107
108 void User_Modification(u8 dat)
109 {
110 int chk = DHT11.read(DHT11PIN);
111
112 if(dat ==0)
113 {
114 flag=1;
115 Serial.println("Listening\r\n");
116 digitalWrite(Listenled,HIGH);
117
118 //LCD1602
119 lcd.setCursor(0, 1);
120 lcd.print("Listening");
121
122 //清除冗余
123 delay(100);
124 lcd.print(" ");
125 }
126 else if(flag)
127 {
128 flag=0;
129 switch(nAsrRes) /*对结果执行相关操作,客户修改*/
130 {
131 case CODE_DMCS: /*命令“代码测试”*/
132 Serial.println("dai ma ce shi\r\n"); /*text.....*/
133 break;
134 case CODE_CSWB: /*命令“测试完毕”*/
135 Serial.println("ce shi wan bi\r\n"); /*text.....*/
136 break;
137
138 case CODE_DHT: /*命令“温湿度”*/
139 Serial.println("/n");
140 Serial.print("Read sensor: ");
141 switch (chk)
142 {
143 case DHTLIB_OK:
144 Serial.println("OK");
145 break;
146 case DHTLIB_ERROR_CHECKSUM:
147 Serial.println("Checksum error");
148 break;
149 case DHTLIB_ERROR_TIMEOUT:
150 Serial.println("Time out error");
151 break;
152 default:
153 Serial.println("Unknown error");
154 break;
155 }
156
157 Serial.print("Humidity (%): ");
158 Serial.println((float)DHT11.humidity, 2);
159
160 Serial.print("Temperature (oC): ");
161 Serial.println((float)DHT11.temperature, 2);
162 delay(2000);
163
164 //LCD1602
165 lcd.setCursor(0, 1);
166 lcd.print("Humidity:");
167 lcd.print((float)DHT11.humidity, 2);
168
169 delay(3000);
170
171 //清除冗余
172 delay(100);
173 lcd.print(" ");
174
175 lcd.setCursor(0, 1);
176 lcd.print("Temperature:");
177 lcd.print((float)DHT11.temperature, 2);
178
179 //清除冗余
180 delay(100);
181 lcd.print(" ");
182 break;
183 case CODE_SHUIWEI: /*命令“shui wei”*/
184
185 Serial.println("shui wei\r\n"); /*text.....*/
186 temp=(long)analogRead(0);
187 data=(temp/650)*4;
188 Serial.print("the depth is:");
189 Serial.print(data);
190 Serial.println("cm");
191 delay(1000);
192 //LCD1602
193 lcd.setCursor(0, 1);
194 lcd.print(data);
195
196 //清除冗余
197 delay(100);
198 lcd.print(" ");
199
200 break;
201 case CODE_LEDON: /*命令“开灯”*/
202 Serial.println("灯已打开\r\n"); /*text.....*/
203 digitalWrite(Led,HIGH);
204
205 //LCD1602
206 lcd.setCursor(0, 1);
207 lcd.print("LED ON");
208
209 //清除冗余
210 delay(100);
211 lcd.print(" ");
212
213 break;
214 case CODE_LEDOFF: /*命令“关灯”*/
215 Serial.println("灯已关闭\r\n"); /*text.....*/
216 digitalWrite(Led,LOW);
217
218 //LCD1602
219 lcd.setCursor(0, 1);
220 lcd.print("LED OFF");
221
222 //清除冗余
223 delay(100);
224 lcd.print(" ");
225
226 break;
227
228 case CODE_CURTAINON: /*命令“打开窗帘”*/
229 Serial.println("打开窗帘\r\n"); /*text.....*/
230 myservo.write(180);
231
232 //LCD1602
233 lcd.setCursor(0, 1);
234 lcd.print("CURTAIN ON");
235
236 //清除冗余
237 delay(100);
238 lcd.print(" ");
239 break;
240 case CODE_CURTAINOFF: /*命令“关闭窗帘”*/
241 Serial.println("打开窗帘\r\n"); /*text.....*/
242 myservo.write(0);
243
244 //LCD1602
245 lcd.setCursor(0, 1);
246 lcd.print("CURTAIN OFF");
247
248 //清除冗余
249 delay(100);
250 lcd.print(" ");
251 break;
252 case CODE_FUWEI: /*命令“....”*/
253 Serial.println("复位\r\n"); /*text.....*/
254 lcd.begin(16, 2);
255 lcd.print("Welcome Home!");
256 break;
257 case CODE_2KL4: /*命令“....”*/
258 Serial.println("xiang you zhuan\r\n"); /*text.....*/
259 break;
260
261 case CODE_3KL1: /*命令“....”*/
262 Serial.println("da kai kong tiao\r\n"); /*text.....*/
263 break;
264 case CODE_3KL2: /*命令“....”*/
265 Serial.println("guan bi kong tiao\r\n"); /*text.....*/
266 break;
267 case CODE_4KL1: /*命令“....”*/
268 Serial.println("hou tui"); /*text.....*/
269 break;
270 case CODE_FANON: /*命令“....”*/
271 Serial.println("风扇打开了"); /*text.....*/
272 break;
273
274 case CODE_FANOFF: /*命令“....”*/
275 Serial.println("风扇关闭了"); /*text.....*/
276 // break;
277 // case CODE_4KL2: /*命令“....”*/
278 // Serial.println("P"); /*text.....*/
279 // break;
280 // case CODE_4KL3: /*命令“....”*/
281 // Serial.println("Q"); /*text.....*/
282 // break;
283 // case CODE_4KL4: /*命令“....”*/
284 // Serial.println("R"); /*text.....*/
285 // break;
286
287 default:break;
288 }
289 digitalWrite(Listenled,LOW);
290
291 }
292 else
293 {
294 Serial.println("有人在呼唤我吗?\r\n"); /*text.....*/
295
296 //LCD1602
297 lcd.setCursor(0, 1);
298 lcd.print("Call me Xiao Bai");
299
300 //清除冗余
301 delay(100);
302 lcd.print(" ");
303
304 }
305
306 }
307
308 void ProcessInt(void)
309 {
310 u8 nAsrResCount=0;
311 ucRegVal = WE.LD_ReadReg(0x2B);
312 WE.LD_WriteReg(0x29,0) ;
313 WE.LD_WriteReg(0x02,0) ;
314 if((ucRegVal & 0x10)&&WE.LD_ReadReg(0xb2)==0x21&&WE.LD_ReadReg(0xbf)==0x35) /*识别成功*/
315 {
316 nAsrResCount = WE.LD_ReadReg(0xba);
317 if(nAsrResCount>0 && nAsrResCount<=4)
318 {
319 nAsrStatus=LD_ASR_FOUNDOK;
320 }
321 else
322 {
323 nAsrStatus=LD_ASR_FOUNDZERO;
324 }
325 } /*没有识别结果*/
326 else
327 {
328 nAsrStatus=LD_ASR_FOUNDZERO;
329 }
330
331 WE.LD_WriteReg(0x2b, 0);
332 WE.LD_WriteReg(0x1C,0);/*写0:ADC不可用*/
333 WE.LD_WriteReg(0x29,0);
334 WE.LD_WriteReg(0x02,0);
335 WE.LD_WriteReg(0x2B,0);
336 WE.LD_WriteReg(0xBA,0);
337 WE.LD_WriteReg(0xBC,0);
338 WE.LD_WriteReg(0x08,1); /*清除FIFO_DATA*/
339 WE.LD_WriteReg(0x08,0); /*清除FIFO_DATA后 再次写0*/
340 }
四、2#板——基础设施
2#板包含了门禁、安防、和WIFI
门禁说过了就不提了,安防是(放在窗外?),检测到有人就会通过蜂鸣器报警,WIFI是也提过了。
连线按照注释即可,代码如下:
1 #include <SPI.h>
2 #include <RFID.h>
3 #include <Servo.h>
4 #include <SoftwareSerial.h>
5
6 //wifi
7 #define WIFI_TX 4
8 #define WIFI_RX 3
9 #define LED 7
10 SoftwareSerial wifi(WIFI_RX, WIFI_TX); //RX, TX
11
12 String _comdata_wifi = "1"; //for incoming wifi serial data
13
14 Servo myservo;
15 extern uint8_t SmallFont[];
16 RFID rfid(10,8); //D10--接上SDA、D8--接RST D13--接上SCK D11--接上MOSI D12--接上MISO RQ不接
17 unsigned char serNum[5];
18 int buzzer=5;//设置控制蜂鸣器的数字IO脚
19
20 //人体红外
21 int Sensor_pin = 6;
22 int Buzzerpin = 5;
23 int flags = 0;
24
25
26
27 void setup()
28 {
29 Serial.begin(9600);//串口用来读取需要添加的卡号,然后手动写到程序里
30 myservo.attach(9);//舵机针脚位9
31 myservo.write(0); //舵机初始化0度
32 SPI.begin();
33 rfid.init();
34 pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
35
36 //wifi
37 pinMode(LED,OUTPUT);
38 digitalWrite(LED,LOW);
39 Serial.begin(9600);
40 wifi.begin(115200);
41 Serial.println("system is ready!");
42
43 wifi.println("AT+CWMODE=3\r\n");
44 delay(500);
45 wifi.println("AT+CIPMUX=1\r\n");
46 delay(500);
47 wifi.println("AT+CIPSERVER=1,5000\r\n");
48 delay(500);
49
50 //人体红外
51 pinMode(Sensor_pin,INPUT); //设置人体红外接口为输入状态
52 pinMode(Buzzerpin,OUTPUT); //设置蜂鸣器接口为输出状态
53 }
54
55 //人体红外
56 void Alarm() //蜂鸣器发出警报
57 {
58 for(int i=0;i<10;i++){
59 digitalWrite(Buzzerpin,HIGH); //发声音
60 delay(2);
61 digitalWrite(Buzzerpin,LOW); //不发声音
62 delay(2); //修改延时时间,改变发声频率
63 }
64 }
65
66 void loop()
67 {
68
69 long randNumber = random(0, 20);
70 unsigned char i,tmp;
71 unsigned char status;
72 unsigned char str[MAX_LEN];
73 unsigned char RC_size;
74
75 //wifi
76 getWifiSerialData();
77 if(Serial.available()){
78 String order = "";
79 while (Serial.available()){
80 char cc = (char)Serial.read();
81 order += cc;
82 delay(2);
83 }
84 order.trim();
85 wifi.println(order);
86 }
87 if(_comdata_wifi!=""){
88 Serial.println(_comdata_wifi);
89 Serial.println("\r\n");
90 // for(int a=0;a<_comdata_wifi.length();a++)
91 // {
92 // Serial.println(a);
93 // Serial.println(_comdata_wifi[a]);
94 // }
95 if((_comdata_wifi[2]==‘+‘)&&(_comdata_wifi[3]==‘I‘)&&(_comdata_wifi[4]==‘P‘))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭
96 {
97 if((_comdata_wifi[5]==‘D‘)&&(_comdata_wifi[8]==‘,‘))
98 {
99 if(_comdata_wifi[11]==‘0‘)
100 {
101 digitalWrite(LED,LOW);//0 灯灭
102 Serial.println("灯灭");
103 wifi.println("灯灭");
104 //wifi模块向pc端或手机端 发送"灯灭
105 }
106
107 else if (_comdata_wifi[11]==‘1‘)
108 {
109 digitalWrite(LED,HIGH); //1 灯亮
110 wifi.println("灯亮");
111 Serial.println("灯亮");
112 //wifi模块向pc端或手机端 发送"灯亮"
113 }
114 }
115 }
116
117 _comdata_wifi = String("");
118 }
119
120 //找卡
121 rfid.isCard();
122 //读卡号
123 if (rfid.readCardSerial())
124 {
125 Serial.print("your card id is : ");
126 Serial.print(rfid.serNum[0]);
127 Serial.print(" , ");
128 Serial.print(rfid.serNum[1],BIN);
129 Serial.print(" , ");
130 Serial.print(rfid.serNum[2],BIN);
131 Serial.print(" , ");
132 Serial.print(rfid.serNum[2],BIN);
133 Serial.print(" , ");
134 Serial.print(rfid.serNum[4],BIN);
135 Serial.println(" ");
136 //下面是改卡号区域
137 if(rfid.serNum[0]==215||rfid.serNum[1]==1111110||rfid.serNum[2]==10110111||rfid.serNum[3]==10110111||rfid.serNum[4]==1000001)
138 {
139 Serial.println("Welcome back master!");
140 myservo.write(180);
141 delay(1000);
142 myservo.write(0);
143 Serial.println("door closed");
144
145 // flags = 1;
146 }
147 else
148 {
149 flags = 0;
150 Serial.println("Wrong!");
151 unsigned char i,j;//定义变量
152 for(i=0;i<80;i++)//输出一个频率的声音
153 {
154 digitalWrite(buzzer,HIGH);//发声音
155 delay(1);//延时1ms
156 digitalWrite(buzzer,LOW);//不发声音
157 delay(1);//延时ms
158 }
159 for(i=0;i<100;i++)//输出另一个频率的声音
160 {
161 digitalWrite(buzzer,HIGH);//发声音
162 delay(2);//延时2ms
163 digitalWrite(buzzer,LOW);//不发声音
164 delay(2);//延时2ms
165 }
166 }
167 }
168 if (!rfid.readCardSerial()){
169 }
170
171
172 //人体红外
173 int val=digitalRead(Sensor_pin); //定义参数存储人体红外传感器读到的状态
174 if(val ==1) //如果检测到有动物运动(在检测范围内),蜂鸣器发出警报 &&flags ==1
175 {
176 Alarm();
177 // val = 1;
178 // Serial.println("Alarm");
179 // Serial.println(flags);
180 }
181 else
182 {
183 // Serial.println("else");
184 // Serial.println(flags);
185 // Serial.println("return");
186 // Serial.println(val);
187 return;
188 }
189 delay(100); //延时100毫秒
190
191
192 rfid.halt(); //休眠
193 }
194
195 //wifi
196 void getWifiSerialData(){
197 while (wifi.available() > 0){
198 _comdata_wifi += char(wifi.read()); //get wifi data
199 delay(4);
200 }
201 }
五、最后的代码
最后再贴一下LD3320的原始代码作为参考,实际应用时一个板子写入1#板下属的代码,另一个板子写入2#板下属的代码并进行相应连线即可。
1 /*
2 改程序为口令模式,先说 xiao jie ,然后说具体关键词 如广州,、
3 可通过串口来查看识别结果
4 接线定义:
5 3.3V GND 选一组接就行
6 3V3--3.3V
7 GND--GND
8 SCK--A5
9 MI--A4
10 MO--A3
11 CS--A2
12 RST--D5
13 IRQ--D3
14 WR--GND
15 */
16 #include "LD3320.h"
17
18 LD3320 WE;
19
20 u8 nAsrStatus=0;
21 u8 nAsrRes=0;
22 extern u8 ucRegVal;
23 u8 flag=0;
24
25
26 void setup() {
27 Serial.begin(9600);
28 WE.LD3320_IO_Init();
29 WE.LD_Reset();
30 attachInterrupt(1, ProcessInt, FALLING);
31 nAsrStatus = LD_ASR_NONE; //初始状态:没有在作ASR
32 SCS_0;
33 Serial.println("Start\r\n");
34 }
35
36 void loop() {
37 switch(nAsrStatus)
38 {
39 case LD_ASR_RUNING:
40 case LD_ASR_ERROR:
41 break;
42 case LD_ASR_NONE:
43 {
44 nAsrStatus=LD_ASR_RUNING;
45 if (WE.RunASR()==0) /* 启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
46 {
47 nAsrStatus = LD_ASR_ERROR;
48 }
49 break;
50 }
51
52 case LD_ASR_FOUNDOK: /* 一次ASR识别流程结束,去取ASR识别结果*/
53 {
54 nAsrRes = WE.LD_GetResult(); /*获取结果*/
55 User_Modification(nAsrRes);
56 nAsrStatus = LD_ASR_NONE;
57 break;
58 }
59 case LD_ASR_FOUNDZERO:
60 default:
61 {
62 nAsrStatus = LD_ASR_NONE;
63 break;
64 }
65 }
66
67 }
68
69 void User_Modification(u8 dat)
70 {
71 if(dat ==0)
72 {
73 flag=1;
74 Serial.println("Received\r\n");
75 }
76 else if(flag)
77 {
78 flag=0;
79 switch(nAsrRes) /*对结果执行相关操作,客户修改*/
80 {
81 case CODE_DMCS: /*命令“代码测试”*/
82 Serial.println("dai ma ce shi\r\n"); /*text.....*/
83 break;
84 case CODE_CSWB: /*命令“测试完毕”*/
85 Serial.println("ce shi wan bi\r\n"); /*text.....*/
86 break;
87
88 case CODE_1KL1: /*命令“北京”*/
89 Serial.println("bei jing\r\n"); /*text.....*/
90 break;
91 case CODE_1KL2: /*命令“上海”*/
92
93 Serial.println("shang hai\r\n"); /*text.....*/
94 break;
95 case CODE_1KL3: /*命令“开灯”*/
96 Serial.println("kai deng\r\n"); /*text.....*/
97 break;
98 case CODE_1KL4: /*命令“关灯”*/
99 Serial.println("guan deng\r\n"); /*text.....*/
100 break;
101
102 case CODE_2KL1: /*命令“....”*/
103 Serial.println("guang zhou\r\n"); /*text.....*/
104 break;
105 case CODE_2KL2: /*命令“....”*/
106 Serial.println("shen zhen\r\n"); /*text.....*/
107 break;
108 case CODE_2KL3: /*命令“....”*/
109 Serial.println("xiang zuo zhuan\r\n"); /*text.....*/
110 break;
111 case CODE_2KL4: /*命令“....”*/
112 Serial.println("xiang you zhuan\r\n"); /*text.....*/
113 break;
114
115 case CODE_3KL1: /*命令“....”*/
116 Serial.println("da kai kong tiao\r\n"); /*text.....*/
117 break;
118 case CODE_3KL2: /*命令“....”*/
119 Serial.println("guan bi kong tiao\r\n"); /*text.....*/
120 break;
121 case CODE_5KL1: /*命令“....”*/
122 Serial.println("hou tui"); /*text.....*/
123 break;
124 // case CODE_3KL4: /*命令“....”*/
125 // Serial.println("\"代码测试\"识别成功"); /*text.....*/
126 // break;
127 //
128 // case CODE_4KL1: /*命令“....”*/
129 // Serial.println("O"); /*text.....*/
130 // break;
131 // case CODE_4KL2: /*命令“....”*/
132 // Serial.println("P"); /*text.....*/
133 // break;
134 // case CODE_4KL3: /*命令“....”*/
135 // Serial.println("Q"); /*text.....*/
136 // break;
137 // case CODE_4KL4: /*命令“....”*/
138 // Serial.println("R"); /*text.....*/
139 // break;
140
141 default:break;
142 }
143 }
144 else
145 {
146 Serial.println("Error\r\n"); /*text.....*/
147 }
148
149 }
150
151 void ProcessInt(void)
152 {
153 u8 nAsrResCount=0;
154 ucRegVal = WE.LD_ReadReg(0x2B);
155 WE.LD_WriteReg(0x29,0) ;
156 WE.LD_WriteReg(0x02,0) ;
157 if((ucRegVal & 0x10)&&WE.LD_ReadReg(0xb2)==0x21&&WE.LD_ReadReg(0xbf)==0x35) /*识别成功*/
158 {
159 nAsrResCount = WE.LD_ReadReg(0xba);
160 if(nAsrResCount>0 && nAsrResCount<=4)
161 {
162 nAsrStatus=LD_ASR_FOUNDOK;
163 }
164 else
165 {
166 nAsrStatus=LD_ASR_FOUNDZERO;
167 }
168 } /*没有识别结果*/
169 else
170 {
171 nAsrStatus=LD_ASR_FOUNDZERO;
172 }
173
174 WE.LD_WriteReg(0x2b, 0);
175 WE.LD_WriteReg(0x1C,0);/*写0:ADC不可用*/
176 WE.LD_WriteReg(0x29,0);
177 WE.LD_WriteReg(0x02,0);
178 WE.LD_WriteReg(0x2B,0);
179 WE.LD_WriteReg(0xBA,0);
180 WE.LD_WriteReg(0xBC,0);
181 WE.LD_WriteReg(0x08,1); /*清除FIFO_DATA*/
182 WE.LD_WriteReg(0x08,0); /*清除FIFO_DATA后 再次写0*/
183 }
六、尾声
所需要的库文件会附加在GitHub中,没有附加的说明可以直接下载(说不定是,我也忘了……)
成品图:
原文:https://www.cnblogs.com/love-mei/p/13945118.html