您的位置:首页 > 产品设计 > UI/UE

用android控制arduino(wifi版)

2016-02-19 12:23 706 查看

用android控制arduino(wifi版)



(2012-04-21 15:42:06)


转载▼

标签:

arduino

android

domotichome

杂谈

分类:
Arduino系列
要用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,出现了如下信息。




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





但是,不管我点击什么,总是无法正常实现关闭或打开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();

}

}

}

}

}


分享:

6


喜欢

阅读(12158)┊

评论 (16)┊
收藏(6)
转载(8)

喜欢
打印举报

已投稿到:

排行榜

转载列表:



转载

转载是分享博文的一种常用方式...

前一篇:[转载]一只眼看教育技术(全文)
后一篇:用触摸传感器控制LED灯的不同算法比较
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: