极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 90383|回复: 47

【翻译教程】enc28J60 和 Arduino (7)——浏览器控制小灯

[复制链接]
发表于 2012-10-22 13:09:10 | 显示全部楼层 |阅读模式
本帖最后由 zcbzjx 于 2013-2-22 19:56 编辑

恩。。硬盘坏了,好几天没干活。。。继续。。原文在这儿



    当我发表这篇作为web服务器使用的Arduino教程,很多人写信给我,询问如何使用web浏览器来控制Arduino,在这篇文章,我将告诉你如何用web浏览器来控制一个led。

一些HTML语言

    首先你要编写一个HTML页面,这是Arduino将要发送到你的web浏览器的页面。

    这个页面是非常简单的:它显示的是Led的实际工作状态和一个按钮来改变它。
    从HTML页面的源代码我们可以找到变量的元素,即根据Led状态来改变的元素。

    从源文件,我们还可以了解,当用户单击按钮时发生了什么事情:浏览器会请求Arduino如下页面。
  • /?status=ON,如果我们要打开Led;
  • /?status=OFF,如果我们要关闭Led。


    ?name=value它的作用是通过GET方法向web服务器发送一个标准的表单。

Arduino

    根据以上两个命令之一,Arduino代码将解析浏览器的请求,根据他们改变Led状态,然后它将根据你的模板,编写一个HTML页面发送给浏览器。

    完整的代码共享在GitHub,以下分析最有趣的部分代码。
  1. char* on = "ON";
  2. char* off = "OFF";
  3. char* statusLabel;
  4. char* buttonLabel;
复制代码
定义了2个静态字符串(ON,OFF)和2个字符串变量,字符串变量将用来创建HTML页面,将2个静态字符串之一赋值给这2个变量。
  1.   pinMode(ledPin, OUTPUT);
  2.   digitalWrite(ledPin, LOW);
  3.   ledStatus = false;
复制代码
setup()除了EtherCard库设置,还要配置Led的初始状态(off)。
  1.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
  2.       Serial.println("Received ON command");
  3.       ledStatus = true;
  4.     }

  5.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
  6.       Serial.println("Received OFF command");
  7.       ledStatus = false;
  8.     }
复制代码
在主loop(),我们的代码解析浏览器的请求(存储在Ethernet::buffer缓存从pos开始的位置),寻找状态ON/OFF命令。
  1.     if(ledStatus) {
  2.       digitalWrite(ledPin, HIGH);
  3.       statusLabel = on;
  4.       buttonLabel = off;
  5.     } else {
  6.       digitalWrite(ledPin, LOW);
  7.       statusLabel = off;
  8.       buttonLabel = on;
  9.     }
复制代码
更新ledPin(Arduino与Led相连的端口)状态,把statusLabel与buttonLabel两个变量关联到正确的标签。

最后,HTML页面被创建,$S为占位符,你可以用emit_p()方法插入,在$S的位置,列出对应变量的值,如第一个$S的位置会被statusLabel的值填充,第二个$S的位置会被buttonLabel填充...

结论

我希望通过这个例子,给你们一些通过网络控制Arduino的方法。任何问题,请发表评论。
结束时,这里有一个关于这个例子的简短的视频。


返回目录

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-10-22 13:31:13 | 显示全部楼层
终于7了,前几天就试用了这个代码,准备将其改造一番
回复 支持 反对

使用道具 举报

发表于 2012-10-22 15:20:26 | 显示全部楼层
谢谢老师分享了~~~~~~~~!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-22 15:44:56 | 显示全部楼层
zhangdeyue1 发表于 2012-10-22 15:20
谢谢老师分享了~~~~~~~~!

客气客气,一向很懒,终于完工了,大大舒了一口气!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-22 15:45:58 | 显示全部楼层
ttyp 发表于 2012-10-22 13:31
终于7了,前几天就试用了这个代码,准备将其改造一番

改造完了别忘记发帖留念啊
回复 支持 反对

使用道具 举报

发表于 2012-10-22 16:13:56 | 显示全部楼层
zcbzjx 发表于 2012-10-22 15:45
改造完了别忘记发帖留念啊

已经是个半成品了,我会尽快搞个作品出来与大家分享的
回复 支持 反对

使用道具 举报

发表于 2012-10-23 03:19:05 | 显示全部楼层
我也是用的这个例子来做成了个库...可惜6个以上按钮就会出错...正在研究中...
回复 支持 反对

使用道具 举报

发表于 2012-11-24 13:44:56 | 显示全部楼层
能不能把在网页中输出某个变量的值,能的话 格式是什么?请回复
回复 支持 反对

使用道具 举报

发表于 2012-11-24 17:40:18 | 显示全部楼层
呵呵,这个真不错,支持一下
回复 支持 反对

使用道具 举报

发表于 2012-12-6 21:49:35 | 显示全部楼层
请问!用w5100怎么能点亮一盏灯啊!!!??可惜这个代码不能用,,我也基本看不懂。。求解啊!!!!!!
回复 支持 反对

使用道具 举报

发表于 2012-12-22 15:15:29 | 显示全部楼层
一下读完了,学到了不少东西啊,顿时对张老师肃然起敬啊,都在北京,有机会请你吃个饭咋样?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-22 19:24:04 | 显示全部楼层
laoliu1982 发表于 2012-12-22 15:15
一下读完了,学到了不少东西啊,顿时对张老师肃然起敬啊,都在北京,有机会请你吃个饭咋样?

估计是没机会,现在是两个人上班带一个孩子,哪有时间吃饭,自从俺妈回重庆后,就从来没在外面聚过餐
回复 支持 反对

使用道具 举报

发表于 2013-1-1 11:04:00 | 显示全部楼层
请教张老师一个问题,看这个程序没有支持ICMP ping的代码啊,为啥能ping通呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-1 11:11:05 | 显示全部楼层
laoliu1982 发表于 2013-1-1 11:04
请教张老师一个问题,看这个程序没有支持ICMP ping的代码啊,为啥能ping通呢?

请看第一个教程。
回复 支持 反对

使用道具 举报

发表于 2013-1-5 15:39:53 | 显示全部楼层
本帖最后由 laoliu1982 于 2013-1-5 15:41 编辑

请教:普通的UNO + ENC28J60 SRAM够用么? 为啥我把程序下下去,支持dhcp和动态dns的代码,初始化就不过。


  1. void setup () {
  2.   Serial.begin(9600);
  3.   Serial.println("\n[webClient]");

  4.   if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
  5.     Serial.println( "Failed to access Ethernet controller");
  6.   if (!ether.dhcpSetup())
  7.     Serial.println("DHCP failed");
  8.   Serial.println("aaaaaa"); ----------------------------------------------这里就打印不出来了-------------------------------------
  9.   ether.printIp("IP:  ", ether.myip);
  10.   ether.printIp("GW:  ", ether.gwip);  
  11.   ether.printIp("DNS: ", ether.dnsip);  

  12.   if (!ether.dnsLookup(website))
  13.     Serial.println("DNS failed");
  14.    
  15.   ether.printIp("SRV: ", ether.hisip);
  16.     Serial.println("\n webClient setup end");
  17. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 14:06 , Processed in 0.052507 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表