用android控制arduino(wifi版)



转载自:http://blog.sina.com.cn/s/blog_6611ddcf01012mku.html

要用android控制arduino,首先要买一张Ethernet Shield(arduino的网络扩展板)。当然,你如果仅仅满足于用蓝牙控制,那采用的技术方案就完全不同了。本文讨论的是android通过wifi,控制arduino。
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版)

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

用android控制arduino(wifi版)


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

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

 
以下为代码:
 
// ARDUINO 1.0
// Edit by xiezuoru
//通过domotichome控制arduino,注意:只能使用0-7的数字口和0-5的模拟口。
#include <SPI.h>
#include <Ethernet.h>
#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();
    }
  }
  }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值