用android控制arduino(wifi版)


要用android控制arduino,首先要买一张Ethernet Shield(arduino的网络扩展板)。当然,你如果仅仅满足于用蓝牙控制,那采用的技术方案就完全不同了。本文讨论的是android通过wifi,控制arduino。
其实,类似的实验我在去年暑假就做过了。那时手机还用t3333,wm的系统,我参照范例,让arduinoHTML代码,实现用网页控制led灯,也挺好,学生很感兴趣。现在换了谷歌第三代手机,android4.0的,当然要试试如何用手机app来控制arduino了。
 
准备工作:
1、手机要安装 DomoticHome ,安卓市场有下载。
2、给Ethernet Shield接上网线,分配ip,写代码。
3、给arduino插上LED灯,我插上的是13口。

如果学习习惯不好,那是很糟糕的一件事。我去年就没有好好地记笔记,仅仅保存了测试代码。这次的实验等于从头开始。

我使用arduino1.0,原来的代码是用0022写的,不能运行了。参照1.0的范例,修改几个关键字。如Server server(80)要改为 EthernetServer server(80)等等。下载,运行正常,ping也正常。

接下来打开手机,运行DomoticHome,在Settings里设置好Arduino的IP地址,端口号80,点Sync,出现了如下信息。

用android控制arduino(wifi版)_#define

点击light,看到了“开锁”和“锁定”的提示了。

用android控制arduino(wifi版)_android_02

但是,不管我点击什么,总是无法正常实现关闭或打开LED的功能。打开串口调试,没有找到问题所在。用浏览器访问,看输出的json代码也正常。

原因在哪里呢?折腾了好久后,终于想起应该去找找Ethernet Shield的原理图,是不是有某些端口被占用了。而后,在某个英文网站上找到了原理图,仔细对照后,才明白能使用的端口有:0-7的数字口和0-5的模拟口。这么重要的信息,为什么从来没有人提醒呢?看来arduino的中文资源还是太少。
顺手把代码修改一下,让参数设置更加方便,直接填写一次ip和端口就可以了。希望对arduino的爱好者有点用。 






以下为代码:





// ARDUINO 1.0 
  
 // Edit by xiezuoru 
  
 //通过domotichome控制arduino,注意:只能使用0-7的数字口和0-5的模拟口。 
  
 #include 
  
 #include 
  
 #define action_none -1 
  
 #define action_out_all 0 
  
 #define action_on_light 1 
  
 #define action_off_light 2 
  
 

   byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address 
  
 byte ip[] = { 10, 1, 2, 149 }; 
  
 byte gateway[] = { 10, 1, 2, 1 }; 
  
 byte subnet[] = { 255, 255, 255, 0 }; 
  
 EthernetServer server = EthernetServer(80); 
  
 // arduino out 
  
 int pinOutPlight = 7; 
  
 String readString = String(30); //string for fetching data from address 
  
 String ipstr; 
  
 // incoming GET command 
  
 String r_pinOnLight = "GET /?out=" + String(pinOutPlight) +"&status=1"; 
  
 String r_pinOffLight = "GET /?out=" + String(pinOutPlight) +"&status=0"; 
  
 String r_out_all = "GET /?out=all"; 
  
 // current action 
  
 int current_action; 
  
 void setup(){ 
  
   
   //start Ethernet 
  
   
   Ethernet.begin(mac, ip, gateway, subnet); 
  
   
   delay(1000); 
  
   
   pinMode(pinOutPlight, OUTPUT); 
  
   
   digitalWrite(pinOutPlight, LOW); 
  
   
   //enable serial datada print 
  
   
   Serial.begin(9600); 
  
   
   current_action = -1; 
  
   
   //ipstr=String(ip[1]); 
  
   
   ipstr=String(ip[0]) + "." + String(ip[1]) + "." + String(ip[2]) + "." + String(ip[3]); 
  
 } 
  
 void loop(){ 
  
   
   current_action = -1; 
  
   
   // Create a client connection 
  
   
   EthernetClient client = server.available(); 
  
   
  if (client) { 
  
   
  while (client.connected()) { 
  
   
   if (client.available()) { 
  
   
    
   char c = client.read(); 
  
   
    
   //read char by char HTTP request 
  
   
    
   if (readString.length() < 30) 
  
   
    
   { 
  
   
   //store characters to string 
  
   
   readString = readString + c; 
  
   
    
   } 
  
   
    
   //output chars to serial port 
  
   
    
   //Serial.print(c); 
  
   
    
   //if HTTP request has ended 
  
   
    
   if (c == '\n') { 
  
   
  Serial.print(readString); 
  
   
  // **************************************************** 
  
   
   if(readString.startsWith(r_pinOnLight)) 
  
   
   { 
  
   
   Serial.print("\n ON UP \n"); 
  
   
   current_action = action_on_light; 
  
   
   } 
  
   
   else if(readString.startsWith(r_pinOffLight)) 
  
   
   { 
  
   
    
   Serial.print("\n OFF UP \n"); 
  
   
    
   current_action = action_off_light; 
  
   
   } 
  
   
   else if(readString.startsWith(r_out_all)) 
  
   
   { 
  
   
   Serial.print("\n ALL\n"); 
  
   
   current_action = action_out_all; 
  
   
   } 
  
   
   else 
  
   
   { 
  
   
   Serial.print("\n None \n"); 
  
   
   current_action = action_none; 
  
   
   } 
  
   
  // **************************************************** 
  
   
   // now output HTML data starting with standart header 
  
   
   client.println("HTTP/1.1 200 OK"); 
  
   
   client.println("Content-Type: text/html"); 
  
   
   client.println(); 
  
   
  char buf[12]; 
  
   
  switch(current_action) 
  
   
  { 
  
   
  case action_out_all: 
  
   
   client.print("{\"ip\" :"); 
  
   
   client.print(ipstr); 
  
   
   client.print("\", \"devices\" : [{ \"type\" : \"light\", \"name\" : \"LED\", \"out\" : \""); 
  
   
   client.print(pinOutPlight); 
  
   
   client.print("\"}"); 
  
   
   client.print("]}"); 
  
   
    
   break; 
  
   
  case action_on_light: 
  
   
    
   digitalWrite(pinOutPlight, HIGH); 
  
   
    
   client.print("{\"status\" : \"1\" , \"out\" : \""); 
  
   
    
   client.print(pinOutPlight); 
  
   
    
   client.print("\"}"); 
  
   
    
   break; 
  
   
  case action_off_light: 
  
   
    
   digitalWrite(pinOutPlight, LOW); 
  
   
    
   client.print("{\"status\" : \"0\" , \"out\" : \""); 
  
   
    
   client.print(pinOutPlight); 
  
   
    
   client.print("\"}"); 
  
   
    
   break; 
  
   
  default: 
  
   
    
   current_action = action_none; 
  
   
  } 
  
   
  // **************************************************** 
  
   
   //clearing string for next read 
  
   
   readString=""; 
  
   
   //stopping client 
  
   
   client.stop(); 
  
   
    
   } 
  
   
  } 
  
   
  } 
  
   
   } 
  
 }