|
通过使用以太网扩展板(Ethernet shield),您可以将Arduino开发板用作一个Web服务器。
通过向Arduino开发板配备一个以太网扩展板,您可以将其变成简易的Web服务器,并通过在与Arduino连接在同一网络的计算机上运行的浏览器访问该服务器,您可以: ● 从网页控制硬件(使用Javascript按钮)。 ● 读取开关的状态(使用简单的HTML)。 ● 读取传感器的值(使用简单的HTML)。
所需的硬件
要将Arduino用作Web服务器,您需要以下硬件:
● Arduino Mega2560(或Arduino UNO)开发板 ● 以太网扩展板 ● 10 / 100Mb网线
以太网扩展板将Arduino连接到Internet。设置非常简单:只需将扩展板的插头插入Arduino,然后将网线连接到扩展板。下图显示了此设置:
实验 为了演示如何将Arduino用作Web服务器,我们将读取交换机的状态。
需要硬件 ● 10 / 100Mb网线 ● Wi-Fi路由器 ● Arduino Mega2560开发板 ● 以太网扩展板 ● 面包板 ● 连接导线 ● 10k电阻 ● 9V适配器 ● 按钮
接线图
如上所示连接组件。 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地址: - byte ip[] = { 192, 168, 0, 112 };
复制代码然后根据自己的设置将其更改。例如,要将以太网扩展板IP分配到192.168.0.50,请写入以下代码:
- byte ip[] = { 192, 168, 0, 50 };
复制代码
MAC地址
MAC地址(媒体访问控制地址)是分配给参与物理网络的每个设备的唯一标识符。每个网络设备都有一个唯一的序列号,可通过网络识别自身,这通常可以硬编程到设备的固件中。但是,使用Arduino,我们可以自己定义MAC地址。 - byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 };
复制代码您可以通过以下代码设置子网和网关: - byte subnet [] = {255,255,255,0}; //分配子网掩码
- byte gateway [] = {192,168,0,1}; //分配网关
复制代码因此,设置以太网扩展板时,需要以下代码: - /********************ETHERNET SETTINGS ********************/
- byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 }; //assigning mac address
- byte ip[] ={ 192, 168, 0, 112 }; // ip in lan
- byte subnet[] = { 255, 255, 255, 0 }; //assigning subnet mask
- byte gateway[] = { 192, 168, 0, 1 }; // assigning default gateway
复制代码
下面是系统的照片,显示了Arduino如何连接到Wi-Fi路由器。网线将扩展板与路由器连接,然后路由器与笔记本电脑无线连接。
代码
下面是一个加载简单网页的程序。 - client.println("<!DOCTYPE html>"); //web page is made using HTML
- client.println("<html>");
- client.println("<head>");
- client.println("<title>Ethernet Tutorial</title>");
- client.println("<meta http-equiv="refresh" content="1">");
- client.println("</head>");
- client.println("<body>");
- client.println("<h1>A Webserver Tutorial </h1>");
- client.println("<h2>Observing State Of Switch</h2>");
- client.print("<h2>Switch is: </2>");
- if (digitalRead(8))
- {
- client.println("<h3>ON</h3>");
- }
- else
- {
- client.println("<h3>OFF</h3>");
- }
- client.println("</body>");
- client.println("</html>");
复制代码
当访问分配给Arduino的IP地址时,该程序将在Web浏览器上显示一个网页。以下代码: - 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: - #include <SPI.h>
- #include <Ethernet.h>
- /******************** ETHERNET SETTINGS ********************/
- byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 }; //physical mac address
- byte ip[] = { 192, 168, 0, 112 }; // ip in lan
- byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
- byte gateway[] = { 192, 168, 0, 1 }; // default gateway
- EthernetServer server(80); //server port
- void setup()
- {
- Ethernet.begin(mac,ip,gateway,subnet); // initialize Ethernet device
- server.begin(); // start to listen for clients
- pinMode(8, INPUT); // input pin for switch
- }
- void loop()
- {
- EthernetClient client = server.available(); // look for the client
- // send a standard http response header
- client.println("HTTP/1.1 200 OK");
- client.println("Content-Type: text/html");
- client.println("Connnection: close");
- client.println();
- /*
- This portion is the webpage which will be
- sent to client web browser one can use html , javascript
- and another web markup language to make particular layout
- */
- client.println("<!DOCTYPE html>"); //web page is made using html
- client.println("<html>");
- client.println("<head>");
- client.println("<title>Ethernet Tutorial</title>");
- client.println("<meta http-equiv="refresh" content="1">");
- /*
- The above line is used to refresh the page in every 1 second
- This will be sent to the browser as the following HTML code:
- <meta http-equiv="refresh" content="1">
- content = 1 sec i.e assign time for refresh
- */
- client.println("</head>");
- client.println("<body>");
- client.println("<h1>A Webserver Tutorial </h1>");
- client.println("<h2>Observing State Of Switch</h2>");
- client.print("<h2>Switch is: </2>");
- if (digitalRead(8))
- {
- client.println("<h3>ON</h3>");
- }
- else
- {
- client.println("<h3>OFF</h3>");
- }
- client.println("</body>");
- client.println("</html>");
- delay(1); // giving time to receive the data
- /*
- The following line is important because it will stop the client
- and look for the new connection in the next iteration i.e
- EthernetClient client = server.available();
- */
- client.stop();
- }
复制代码 |