首页 > 其他 > 详细

基于Arduino的智慧小屋

时间:2020-11-08 22:37:14      阅读:73      评论:0      收藏:0      [点我收藏+]

写在前面:本身是打算通过ESP8266直接做的,但是卡在了写APP那块,没时间再攻关了,就暂且只放上测试用的LED了。其他部分改变方向,采用LD3320进行语音控制,控制范围……大概半米,有一定的延迟,但是问题不大。显示终端采用LCD1602A,显示基础的提示词和输出传感器数值,用了官网的连接和代码例程,行数少简单,目前只能显示英文,不过也够用了。一块Arduino板的I/O口不够用就再加了一块,没有考虑如何级联,单纯的另一块做了些无需语音控制的其他功能。

 

列写一下清单:

  1. Arduino R3板两个;
  2. 杜邦线若干,公对母,公对公至少各四十根甚至更多,母对母几乎不用;
  3. 长面包板一个;
  4. 普通LED灯两个;
  5. 集成LED发光模块一个;
  6. LD3320一个;
  7. ESP8266一个;
  8. TTL转USB一个(跟ESP8266配套使用);
  9. 220Ω电阻三个;
  10. 1KΩ电阻两个(串联使用,或者直接用2KΩ的);
  11. 蜂鸣器一个或两个;
  12. RFID套件一组;
  13. 人体红外传感器一个;
  14. 温湿度传感器一个;
  15. 水位传感器一个;
  16. 舵机两个。

注:两个Arduino板其实可以独立运行,拿掉另一个完全可以使用,其中一个板子包括:蜂鸣器、普通LED灯和电阻、ESP8266、人体红外传感器和RFID套件,剩下的属于另一个板子。


 

一、基于ESP8266手机APP控制普通LED灯

综合了网上诸多教程的结果,首先记录一下成功点亮LED的过程。

材料准备:

  1. LED一枚
  2. 220Ω电阻一个
  3. ESP8266一个(也不知道是不是它的兄弟型号)
  4. Arduino开发板一个
  5. 面包板一个
  6. 杜邦线若干
  7. TTL转USB一个

步骤:

先将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. RFID套件;
  2. 蜂鸣器;
  3. 两个不同颜色的小灯和配套电阻(可选,代码中两小灯用来展示正确刷卡和错误刷卡,本实验中因节约端口没有应用);
  4. 舵机一个。

步骤:

直接按照代码注释进行连线。

 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中,没有附加的说明可以直接下载(说不定是,我也忘了……)

成品图:

技术分享图片

 

基于Arduino的智慧小屋

原文:https://www.cnblogs.com/love-mei/p/13945118.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!