一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 7861|回复: 17
收起左侧

0成本实现远程的WEB控制单片机及驱动外设思路

  [复制链接]
发表于 2012-6-16 13:36 | 显示全部楼层 |阅读模式
本帖最后由 iviva 于 2012-6-16 14:28 编辑

实验内容:很多朋友都有这样的想法,能不能通过网页,直接从任何一台计算机,控制和访问自己的单片机或者arduino板呢?这个有趣的功能,相信很多的电子爱好者都可能会想,这个功能如果能实现,是不是意味着就能在web页面,直接通过点击按钮,就能够通过互联网完成对arduino板上的资源甚至是挂接到arduino板上的设备的控制。好像听起来有点耳熟?这是不是就是当下很火爆的数字家庭概念吗?是的没错,如果arduino驱动的是继电器或者可控插座,那么,我们就能很容易的在web上控制普通家用电器啦,想象一下,下班之前,在电脑上登陆自己的yeelink账号,然后点击“热水器烧水”,回家就能洗上舒舒服服的热水澡啦!


下面为了描述方便,使用了arduino这个开源硬件平台作为样例进行说明,其实任何能够接网卡的单片机都能够实现类似的功能,你最熟悉什么,就用什么啦!


硬件要求:

Arduino主板
以太网板(考虑到官方W5100以太网板的价格比较贵,这次再介绍一款SPI通信方式的低成本小板,ENC28J60,淘宝的价格大约35元左右,参加下图模块的模样和与arduino的连接方式进行连接,并且从这个链接获取ENC的网络函数驱动库并安装即可:

http://geek-workshop.com/forum.php?mod=attachment&aid=NDc1M3w4OTExYjg1M3wxMzM5MzM4Mzk1fDgwN3wyMDA%3D

原理介绍:

为了实现远程控制,为简便起见,我们先讲讲如何web遥控arduino UNO板上的LED灯开关。

yeelink平台提供了两种方式,一种是arduino/单片机通过直接socket网络连接的办法,连入平台上,保持和服务器的长连接,这种方法控制的实时性相对较强;另外一种办法是arduino作为客户端,定期的向服务器查询传感器(LED)的当前值,如果我们要改变arduino的状态(如点亮LED),只需改变当前传感器的值(其实是发送HTTP的post命令,更新一下当前的设备状态),则arduino在定时周期到的时候,发出(HTTP  get)命令来获取当前LED状态的时候,发现最近的值有变化(从0变为1)的时候,则相应的改变驱动LED的IO口状态,从而实习远程控制,这里注意,在arduino板上,如果是触发性的操作(只操作一次),则可以在get数据并操作好后,直接发送POST改变服务器上吗的传感器状态,保证不会在arduino端重复触发。

首先,照例我们要先申请到yeelink的API-KEY才可以进行:


如何免费获取API-KEY,和如何添加设备,请移步 快速入门 来开始吧。http://www.yeelink.net/develop/quickstart

第一步: 注册之后,增加一个开关类的传感器

http://blog.yeelink.net/wp-content/uploads/2012/06/AddSwitch1.png

第二步,获取这次插入的控制设备的设备号和传感器号:如下图来说,就是设备号=63,传感器号=57http://blog.yeelink.net/wp-content/uploads/2012/06/SwitchItem1.png

第三步,好了,控制按钮安装完毕,下面,将第七个PIN和GND之间连上电阻和LED灯,下载下面的arduino程序,更改三个地方,就可以通过点击网页上的按钮,进行控制了。(居然这么简单???是的,就是这么简单…下面想想你能怎么玩更爽吧)arduino程序中需要修改的地方有

http://blog.yeelink.net/wp-content/uploads/2012/06/replaceItem.png
程序中需要改的地方是:
1.APIKEY: 这个需要更换成你自己账号的APIKEY
2.DEVICEID :这个需要换成设备号
3.SENSORID:这个需要换成传感器号OK,就这些了,5分钟内学会如何做家庭电器控制,你行的!另外,需要注意一点,下文中的ethernet shield是需要你家中的路由器开启DHCP功能的,如果没有开启,可以参考将
1. 代码中添加 byte ip[] = { 192, 168, 1, 12 };  (根据网络环境更改)
2. 将Ethernet.begin(mac) 替换成Ethernet.begin(mac, ip);从这下载程序YeelinkPowerSwitch具体的程序在下面

  1. /*Yeelink 网页远程控制Arduino演示代码
  2. 1. 使用arduino UNO和 ethernet shield
  3. 2.  使用数字7管脚网页控制LED灯

  4. */

  5. #include <SPI.h>
  6. #include <Ethernet.h>
  7. #include <Wire.h>
  8. #include <math.h>

  9. byte buff[2];

  10. // for yeelink api
  11. #define APIKEY “4bb08000082a070000e2e3c580000000″ // 换成你自己的 your yeelink api key
  12. #define DEVICEID 63 // 换成自己的Device ID
  13. #define SENSORID 57 // 换成自己的 sensor ID

  14. // 分配给Ethernet卡一个MAC地址.
  15. byte mac[] = { 0×00, 0x1D, 0×72, 0×82, 0×35, 0x9D};
  16. // 初始化以太网库:
  17. EthernetClient client;

  18. IPAddress server(202,136,60,231); // IP网址,也是Yeelink.net的网址

  19. unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
  20. boolean lastConnected = false; // state of the connection last time through the main loop
  21. const unsigned long postingInterval = 5*1000; // 每5秒钟发送一次检测
  22. String returnValue = “”;
  23. boolean ResponseBegin = false;

  24. void setup() {
  25. pinMode(7, OUTPUT);

  26. Wire.begin();
  27. // 启动串口:
  28. Serial.begin(57600);
  29. // 启动以太网的DHCP功能:
  30. if (Ethernet.begin(mac) == 0) {
  31. Serial.println(“Failed to configure Ethernet using DHCP”);
  32. for(;;)
  33. ;
  34. }
  35. else {
  36. Serial.println(“Ethernet configuration OK”);
  37. }
  38. }

  39. void loop() {
  40. // Debug用,发现网络上有数据,发送到串口

  41. if (client.available()) {
  42. char c = client.read();
  43. // Serial.print(c);
  44. if (c == ‘{‘)
  45. ResponseBegin = true;
  46. else if (c == ‘}’)
  47. ResponseBegin = false;

  48. if (ResponseBegin)
  49. returnValue += c;
  50. }
  51. if (returnValue.length() !=0 && (ResponseBegin == false))
  52. {
  53. Serial.println(returnValue);

  54. if (returnValue.charAt(returnValue.length() – 1) == ’1′) {
  55. Serial.println(“turn on the LED”);
  56. digitalWrite(7, HIGH);

  57. }
  58. else if(returnValue.charAt(returnValue.length() – 1) == ’0′) {
  59. Serial.println(“turn off the LED”);
  60. digitalWrite(7, LOW);
  61. }
  62. returnValue = “”;
  63. }
  64. // 如果无网络连接,断开:
  65. if (!client.connected() && lastConnected) {
  66. Serial.println();
  67. Serial.println(“disconnecting.”);
  68. client.stop();
  69. }

  70. // 如果连接失败,再次连接:
  71. if(!client.connected() && (millis() – lastConnectionTime > postingInterval)) {
  72. // read sensor data, replace with your code
  73. //int sensorReading = readLightSensor();
  74. Serial.print(“yeelink:”);
  75. //get data from server
  76. getData();
  77. }
  78. // 存连接状态
  79. lastConnected = client.connected();
  80. }



  81. // 启动HTTP连接并取回数据
  82. void getData(void) {
  83. // 如果连接成功:
  84. if (client.connect(server, 80)) {
  85. Serial.println(“connecting…”);
  86. // send the HTTP GET request:

  87. client.print(“GET /v1.0/device/”);
  88. client.print(DEVICEID);
  89. client.print(“/sensor/”);
  90. client.print(SENSORID);
  91. client.print(“/datapoints”);
  92. client.println(” HTTP/1.1″);
  93. client.println(“Host: api.yeelink.net”);
  94. client.print(“Accept: *”);
  95. client.print(“/”);
  96. client.println(“*”);
  97. client.print(“U-ApiKey: “);
  98. client.println(APIKEY);
  99. client.println(“Content-Length: 0″);
  100. client.println(“Connection: close”);
  101. client.println();
  102. Serial.println(“print get done.”);

  103. }
  104. else {
  105. // 连接失败:
  106. Serial.println(“connection failed”);
  107. Serial.println();
  108. Serial.println(“disconnecting.”);
  109. client.stop();
  110. }
  111. // 记录上次连接时间:
  112. lastConnectionTime = millis();
  113. }
复制代码

不错吧,这么简单就搞定远程控制了,能不能触类旁通,想想这个东西可以为你做点什么好创意呢? 等你来啦!



更多的物联网服务工具和参考设计例程,请移步yeelink的blog
http://blog.yeelink.net/
发表于 2012-6-16 13:42 | 显示全部楼层
这属于广告帖吧
 楼主| 发表于 2012-6-16 13:45 | 显示全部楼层
回复 2# jigsaw

请先了解一下再判断,是否是广告贴,我觉得这个东西对电子爱好者是一个很有用的工具,而且不需要花任何钱买东西。但是原来电子爱好者设计和开发服务器系统是非常复杂的,这个工具可以让玩单片机的朋友也能做服务器应用了,不是挺好吗。

如果浪费了您的时间,深表抱歉。
发表于 2012-6-16 14:10 | 显示全部楼层
本帖最后由 GandF 于 2012-6-16 14:11 编辑

好东西。
最好有实在的东西。如,可用的电路图,源代码
发表于 2012-6-16 14:16 | 显示全部楼层
好东西。
最好有实在的东西。如,可用的电路图,源代码
GandF 发表于 2012-6-16 14:10 https://www.yleee.com.cn/images/common/back.gif



    我也是这个意思
 楼主| 发表于 2012-6-16 14:19 | 显示全部楼层
本帖最后由 iviva 于 2012-6-16 14:37 编辑

回复 4# GandF


  感谢版主支持,其实这个实验不需要任何的硬件,都是使用很容易获得的arduino UNO开发板,大约淘宝价格是50元,自己做的话可能20块钱左右。  由于arduino使用堆砌的办法就能扩展功能,所以几乎不需任何外围硬件连接就可以做到。

http://blog.yeelink.net/wp-content/uploads/2012/06/arduino_ethernet_light_sensor.jpg


从上面能看出来,就是底下一个arduino UNO板 + 上面扣一个W5100的ethernet shield 。
http://img01.taobaocdn.com/imgextra/i1/286676386/T2UetUXi8bXXXXXXXX_!!286676386.jpg
后面有时间的话,我会写个更详细的点的操作手册。单片机提供了arduino的代码, 其他单片机类的代码,可以仿照完成,事实上,有开源社区的朋友,使用了开放的代码,实现了一个iMac的工具
http://blog.yeelink.net/wp-content/uploads/2012/06/iMac%E5%B7%A5%E5%85%B7.jpg

因为接口的实现是开放的,任何人都可以使用API进行二次开发, 比如做iOS或者是Android版本的手机控制软件,来控制自己的单片机。
服务器没有任何代码需要开发,简单点点就行了。
我在这个帖子里面,介绍了一下如何使用串口进行简单的测试。
https://www.yleee.com.cn/thread-16230-1-1.html
 楼主| 发表于 2012-6-16 14:49 | 显示全部楼层
回复 5# jigsaw

对不起,我刚才的口气也不好,向你道歉。

都是电子爱好者,向你学习。
发表于 2012-6-16 15:09 | 显示全部楼层
没有看到具体的WEB相关的介绍,用服务器还是直接自己处理post,get请求?
也没有提访问安全是如何考虑的,
满眼yeelink,api-key之类的
实在让人搞不懂这玩意儿到底是新技术范畴还是新应用范畴.
发表于 2012-6-16 15:14 | 显示全部楼层
回复 7# iviva


   
 楼主| 发表于 2012-6-16 15:21 | 显示全部楼层
本帖最后由 iviva 于 2012-6-16 15:23 编辑

回复 8# 文句子


   用服务器处理POST和GET请求的。
申请Key和调用接口部分比较长,请参考下面的连接

http://www.yeelink.net/develop/quickstart

这个连接提供了用浏览器进行测试和实验的简单介绍,大概花费3,4分钟看完这个页面就能够了解明白了,测试和实验是不需要用硬件的,curl或者hurl.it都可以做。
如果一定要归类,可以看做这是一个服务器的新应用方式,简化服务器编程的一个东西

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-5-1 09:16 , Processed in 0.048686 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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