风筝
发表于: 2018-8-11 23:09:33 | 显示全部楼层

通过使用以太网扩展板(Ethernet shield),您可以将Arduino开发板用作一个Web服务器。


通过向Arduino开发板配备一个以太网扩展板,您可以将其变成简易的Web服务器,并通过在与Arduino连接在同一网络的计算机上运行的浏览器访问该服务器,您可以:

●    从网页控制硬件(使用Javascript按钮)。

●    读取开关的状态(使用简单的HTML)。

●    读取传感器的值(使用简单的HTML)。

e1.png


所需的硬件

要将Arduino用作Web服务器,您需要以下硬件:

●    Arduino Mega2560(或Arduino UNO)开发板

●    以太网扩展板

●    10 / 100Mb网线


以太网扩展板将Arduino连接到Internet。设置非常简单:只需将扩展板的插头插入Arduino,然后将网线连接到扩展板。下图显示了此设置:

ee4.png


实验

为了演示如何将Arduino用作Web服务器,我们将读取交换机的状态。


需要硬件

●    10 / 100Mb网线

●    Wi-Fi路由器

●    Arduino Mega2560开发板

●    以太网扩展板

●    面包板

●    连接导线

●    10k电阻

●    9V适配器

●    按钮


接线图

arduino-web-server.jpg

如上所示连接组件。 Arduino的引脚8连接到按钮,并配置为INPUT。按下按钮时,Arduino将在此引脚上读取到一个低电平。然后,Arduino将OUTPUT的状态设置为ON。按钮释放时,输出将设置为OFF。交换机的状态将发送到Web服务器。


以太网配置

要控制以太网扩展板,需要使用Ethernet.h库。


首先需要使用Ethernet.begin()函数为扩展板分配MAC和IP地址。对于特定设备,MAC地址是全局唯一标识符。现在的以太网扩展板带有MAC地址的标签。对于以前的扩展板,随机的MAC地址应该可以正常工作,但是不应该使用与其他扩展板相同的MAC地址。 IP地址的有效性取决于一个网络的配置。如果使用DHCP,它可以动态地为扩展板分配IP。


IP地址

IP地址(因特网协议地址)是分配给参与计算机网络的每个设备的数字标签,该计算机网络使用因特网协议进行通信。通过以下代码指定IP地址:

  1. byte ip[] = { 192, 168, 0, 112 };
复制代码

然后根据自己的设置将其更改。例如,要将以太网扩展板IP分配到192.168.0.50,请写入以下代码:

  1. byte ip[] = { 192, 168, 0, 50 };
复制代码

MAC地址

MAC地址(媒体访问控制地址)是分配给参与物理网络的每个设备的唯一标识符。每个网络设备都有一个唯一的序列号,可通过网络识别自身,这通常可以硬编程到设备的固件中。但是,使用Arduino,我们可以自己定义MAC地址。

  1. byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 };
复制代码

您可以通过以下代码设置子网和网关:

  1. byte subnet [] = {255,255,255,0}; //分配子网掩码
  2. byte gateway [] = {192,168,0,1}; //分配网关
复制代码

因此,设置以太网扩展板时,需要以下代码:

  1. /********************ETHERNET SETTINGS ********************/

  2. byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 }; //assigning mac address

  3. byte ip[] ={ 192, 168, 0, 112 }; // ip in lan

  4. byte subnet[] = { 255, 255, 255, 0 }; //assigning subnet mask

  5. byte gateway[] = { 192, 168, 0, 1 }; // assigning default gateway
复制代码

下面是系统的照片,显示了Arduino如何连接到Wi-Fi路由器。网线将扩展板与路由器连接,然后路由器与笔记本电脑无线连接。

e12.png


代码

下面是一个加载简单网页的程序。

  1. client.println("<!DOCTYPE html>"); //web page is made using HTML

  2. client.println("<html>");

  3. client.println("<head>");

  4. client.println("<title>Ethernet Tutorial</title>");

  5. client.println("<meta http-equiv="refresh" content="1">");

  6. client.println("</head>");

  7. client.println("<body>");

  8. client.println("<h1>A Webserver Tutorial </h1>");

  9. client.println("<h2>Observing State Of Switch</h2>");

  10. client.print("<h2>Switch is:  </2>");

  11. if (digitalRead(8))

  12. {

  13. client.println("<h3>ON</h3>");

  14. }

  15. else

  16. {

  17. client.println("<h3>OFF</h3>");

  18. }


  19. client.println("</body>");

  20. client.println("</html>");
复制代码

当访问分配给Arduino的IP地址时,该程序将在Web浏览器上显示一个网页。以下代码:

  1. client.println("<http-equiv="refresh" content="1">");
复制代码

指示浏览器刷新页面。再次访问该页面时,Arduino将再次读取该开关的状态并显示它。

请记住,您始终可以查看显示的网页。按下按钮,您可以观察到开关的变化状态。


您也可以将其设置为在没有路由器的情况下运行。为此,您需要:

1.    为Arduino的以太网分配手动IP地址,例如192.168.0.2,子网掩码255.255.255.0,默认网关为空。

2.    使用交叉网线连接两者(笔记本电脑和Arduino)。

3.    然后,我们就可以从笔记本电脑上通过http://192.168.0.2访问您的Arduino。


代码

下面是您将加载到Arduino中的代码,以便在没有路由器的情况下将其直接连接到PC:

  1. #include <SPI.h>
  2. #include <Ethernet.h>


  3. /******************** ETHERNET SETTINGS ********************/

  4. byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 };         //physical mac address
  5. byte ip[] = { 192, 168, 0, 112 };                   // ip in lan
  6. byte subnet[] = { 255, 255, 255, 0 };              //subnet mask
  7. byte gateway[] = { 192, 168, 0, 1 };              // default gateway
  8. EthernetServer server(80);                       //server port


  9. void setup()
  10. {
  11. Ethernet.begin(mac,ip,gateway,subnet);            // initialize Ethernet device
  12. server.begin();                                                  // start to listen for clients
  13. pinMode(8, INPUT);                                              // input pin for switch
  14. }

  15. void loop()
  16. {
  17. EthernetClient client = server.available();          // look for the client

  18. // send a standard http response header

  19. client.println("HTTP/1.1 200 OK");
  20. client.println("Content-Type: text/html");
  21. client.println("Connnection: close");
  22. client.println();

  23. /*
  24. This portion is the webpage which will be
  25. sent to client web browser one can use html , javascript
  26. and another web markup language to make particular layout
  27. */

  28. client.println("<!DOCTYPE html>");                  //web page is made using html
  29. client.println("<html>");
  30. client.println("<head>");
  31. client.println("<title>Ethernet Tutorial</title>");
  32. client.println("<meta http-equiv="refresh" content="1">");

  33. /*
  34. The above line is used to refresh the page in every 1 second
  35. This will be sent to the browser as the following HTML code:
  36. <meta http-equiv="refresh" content="1">
  37. content = 1 sec i.e assign time for refresh
  38. */

  39. client.println("</head>");
  40. client.println("<body>");
  41. client.println("<h1>A Webserver Tutorial </h1>");
  42. client.println("<h2>Observing State Of Switch</h2>");

  43. client.print("<h2>Switch is:  </2>");

  44. if (digitalRead(8))
  45. {
  46. client.println("<h3>ON</h3>");
  47. }
  48. else
  49. {
  50. client.println("<h3>OFF</h3>");
  51. }

  52. client.println("</body>");
  53. client.println("</html>");

  54. delay(1);                                  // giving time to receive the data

  55. /*
  56. The following line is important because it will stop the client
  57. and look for the new connection in the next iteration i.e
  58. EthernetClient client = server.available();
  59. */
  60. client.stop();

  61. }
复制代码
跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1482



手机版|

GMT+8, 2024-4-30 20:07 , Processed in 0.058164 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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