用android控制arduino(wifi版)
2016-02-19 12:23
706 查看
用android控制arduino(wifi版)
(2012-04-21 15:42:06)
转载▼
标签:arduinoandroiddomotichome杂谈 | 分类: 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灯的不同算法比较
相关文章推荐
- 硬件极客最爱:支持WiFi的Arduino板来了
- iOS依据字符串计算UITextView高度
- 【转】深入理解篇UIScrollerView
- UI整理-----part2--UI控件
- iOS8.0之后的UIAlertController
- UI整理-----part1--UI基础
- 【Android UI设计与开发】第08期:底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏
- UINavicationController基本应用
- 解决UITableView中Cell重用机制问题
- mysql 报Packet for query is too large 的解决方法
- [转] sql_id VS hash_value
- angular在IE7下兼容$sce:iequirks
- iOS_UITableView性能优化那些事
- jqtransform.jsのonchangeの仕方、valueの変え方
- iOS开发UI篇—核心动画(UIView封装动画)
- iOS UIDocumentInteractionController 设置第三方打开方式的 参数详解
- Vue + webpack 项目实践
- UISearchController的简单实用
- UIDocumentInteractionController 第三方应用中打开自己的文件 方法
- Java Map 按key排序和按Value排序